Cloud-init no acepta scripts simples de bash, simplemente así. Es una bestia que come el archivo YAML que define su instancia (paquetes, claves ssh y otras cosas).
Con MIME también puede enviar scripts de shell arbitrarios, pero debe codificarlos con 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
El archivo de datos de usuario combinados.txt es el archivo que desea pegar allí.
Más información aquí:
https://help.ubuntu.com/community/CloudInit
También tenga en cuenta que esto depende en gran medida de la imagen que esté utilizando. Pero usted dice que es realmente una imagen basada en el inicio de la nube, por lo que esto se aplica. Hay otros iniciadores de nube que no se denominan cloud-init; entonces podría ser diferente.
Esto tiene un par de años ahora, pero para beneficio de otros, tuve el mismo problema y resultó que cloud-init se estaba ejecutando dos veces, desde dentro de /etc/rc3.d
. Eliminar estos archivos dentro de la carpeta permitió que los datos de usuario se ejecutaran correctamente:
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
En realidad, cloud-init permite un único script de shell como entrada (aunque es posible que desee utilizar un archivo MIME para configuraciones más complejas).
El problema con el script del OP es que la primera línea es incorrecta. Deberías usar algo como esto:
#!/bin/sh
La razón de esto es que, mientras cloud-init usa #!
para reconocer una secuencia de comandos de usuario, el sistema operativo necesita una línea shebang completa para ejecutar la secuencia de comandos.
Entonces, lo que sucede en el caso del OP es que cloud-init se comporta correctamente (es decir, descarga e intenta ejecutar el script), pero el sistema operativo no puede ejecutarlo.
Ver:Shebang (Unix) en Wikipedia