linux - script - La secuencia de comandos user-data(cloud-init) no se ejecuta en EC2
us east virginia aws (3)
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 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 que cloud-init usa #!
para reconocer un script de usuario, el sistema operativo necesita una línea de shebang completa para ejecutar el script.
Entonces, lo que está sucediendo 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 realmente.
Ver: Shebang (Unix) en Wikipedia
mi script de datos de usuario
#!
set -e -x
echo `whoami`
su root
yum update -y
touch ~/PLEASE_WORK.txt
que se alimenta desde el comando:
ec2-run-instances ami-05355a6c -n 1 -g mongo-group -k mykey -f myscript.sh -t t1.micro -z us-east-1a
pero cuando miro el archivo /var/log/cloud-init.log
, el tail -n 5
es:
[CLOUDINIT] 2013-07-22 16:02:29,566 - cloud-init-cfg[INFO]: cloud-init-cfg [''runcmd'']
[CLOUDINIT] 2013-07-22 16:02:29,583 - __init__.py[DEBUG]: restored from cache type DataSourceEc2
[CLOUDINIT] 2013-07-22 16:02:29,686 - cloud-init-cfg[DEBUG]: handling runcmd with freq=None and args=[]
[CLOUDINIT] 2013-07-22 16:02:33,691 - cloud-init-run-module[INFO]: cloud-init-run-module [''once-per-instance'', ''user-scripts'', ''execute'', ''run-parts'', ''/var/lib/cloud/data/scripts'']
[CLOUDINIT] 2013-07-22 16:02:33,699 - __init__.py[DEBUG]: restored from cache type DataSourceEc2
También he verificado que curl http://169.254.169.254/latest/user-data
devuelve mi archivo como estaba previsto.
y no ocurre ningún otro error o el resultado de mi secuencia de comandos. ¿Cómo puedo obtener el script de datos de usuario para ejecutar en el arranque correctamente?
Ahora tengo un par de años, pero para otros me beneficia tuve el mismo problema, y resultó que cloud-init se ejecutaba dos veces, desde /etc/rc3.d
. La eliminación de estos archivos dentro de la carpeta permitió que userdata se ejecutara 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
Cloud-init no acepta scripts sencillos de bash, solo así. Es una bestia que se come el archivo YAML que define su instancia (paquetes, claves ssh y otras cosas).
Usando MIME también puedes enviar scripts de shell arbitrarios, pero tienes que codificarlos 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 combinado userdata.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 dices que es realmente una imagen basada en la nube, así que esto aplica. Hay otros iniciadores en la nube que no se denominan cloud-init, entonces podría ser diferente.