GNU/Linux >> Tutoriales Linux >  >> Linux

El script de datos de usuario (cloud-init) no se ejecuta en EC2

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


Linux
  1. ¿Error en el script de conteo para el número de ocurrencias?

  2. ¿La variable Curl Outfile no funciona en Bash Script?

  3. ¿La secuencia de comandos Init.d no se ejecuta en el arranque?

  4. ¿El comando Rm en Bash Script no funciona con variables?

  5. 4 formas de ejecutar un script de shell en UNIX/Linux

¿Espacios para variables en Bash Script?

¿El trabajo de Cron no se ejecuta?

file_put_contents no crea un archivo txt

¿Cómo copiar la salida del terminal?

El script SH en $PATH no se encuentra en Linux Alpine 3.11

Espere el envío de un error de secuencia de comandos:Spawn id exp4 no se abre durante la ejecución