Cloud-init non accetta semplici script bash, proprio così. È una bestia che mangia il file YAML che definisce la tua istanza (pacchetti, chiavi ssh e altro).
Usando MIME puoi anche inviare script di shell arbitrari, ma devi codificarli in MIME.
$ cat my-boothook.txt
#!/bin/sh
echo "Hello World!"
echo "This will run as soon as possible in the boot sequence"
$ cat my-user-script.txt
#!/usr/bin/perl
print "This is a user script (rc.local)\n"
$ cat my-include.txt
# these urls will be read pulled in if they were part of user-data
# comments are allowed. The format is one url per line
http://www.ubuntu.com/robots.txt
http://www.w3schools.com/html/lastpage.htm
$ cat my-upstart-job.txt
description "a test upstart job"
start on stopped rc RUNLEVEL=[2345]
console output
task
script
echo "====BEGIN======="
echo "HELLO From an Upstart Job"
echo "=====END========"
end script
$ cat my-cloudconfig.txt
#cloud-config
ssh_import_id: [smoser]
apt_sources:
- source: "ppa:smoser/ppa"
$ ls
my-boothook.txt my-include.txt my-user-script.txt
my-cloudconfig.txt my-upstart-job.txt
$ write-mime-multipart --output=combined-userdata.txt \
my-boothook.txt:text/cloud-boothook \
my-include.txt:text/x-include-url \
my-upstart-job.txt:text/upstart-job \
my-user-script.txt:text/x-shellscript \
my-cloudconfig.txt
$ ls -l combined-userdata.txt
-rw-r--r-- 1 smoser smoser 1782 2010-07-01 16:08 combined-userdata.txt
Il combined-userdata.txt è il file che vuoi incollare lì.
Maggiori informazioni qui:
https://help.ubuntu.com/community/CloudInit
Si noti inoltre che questo dipende molto dall'immagine che si sta utilizzando. Ma tu dici che è davvero un'immagine basata su cloud-init, quindi questo vale. Esistono altri iniziatori cloud che non sono denominati cloud-init, quindi potrebbe essere diverso.
Questo è un paio di anni ormai, ma per il beneficio di altri ho avuto lo stesso problema e si è scoperto che cloud-init era in esecuzione due volte, dall'interno di /etc/rc3.d
. L'eliminazione di questi file all'interno della cartella ha permesso a userdata di funzionare correttamente:
lrwxrwxrwx 1 root root 22 Jun 5 02:49 S-1cloud-config -> ../init.d/cloud-config
lrwxrwxrwx 1 root root 20 Jun 5 02:49 S-1cloud-init -> ../init.d/cloud-init
lrwxrwxrwx 1 root root 26 Jun 5 02:49 S-1cloud-init-local -> ../init.d/cloud-init-local
In realtà, cloud-init consente un singolo script di shell come input (anche se potresti voler usare un archivio MIME per configurazioni più complesse).
Il problema con lo script dell'OP è che la prima riga non è corretta. Dovresti usare qualcosa del genere:
#!/bin/sh
Il motivo è che, mentre cloud-init utilizza #!
per riconoscere uno script utente, il sistema operativo necessita di una riga Shebang completa per poter eseguire lo script.
Quindi ciò che sta accadendo nel caso dell'OP è che cloud-init si comporta correttamente (ovvero scarica e tenta di eseguire lo script) ma il sistema operativo non è in grado di eseguirlo effettivamente.
Vedere:Shebang (Unix) su Wikipedia