2013-07-22 9 views
10

mio script utente-datidati utente (cloud-init) script non in esecuzione su EC2

#! 
set -e -x 
echo `whoami` 
su root 
yum update -y 
touch ~/PLEASE_WORK.txt 

che è alimentato in dal comando:

ec2-run-instances ami-05355a6c -n 1 -g mongo-group -k mykey -f myscript.sh -t t1.micro -z us-east-1a 

ma quando controllo il file /var/log/cloud-init.log , il tail -n 5 è:

[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 

ho anche verificato che curl http://169.254.169.254/latest/user-data restituisce il file come intendono ed.

e non si verificano altri errori o l'output del mio script. come faccio a eseguire correttamente lo scrip dei dati utente per l'avvio?

risposta

14

Cloud-init non accetta gli script di bash semplici, proprio così. È una bestia che mangia un file YAML che definisce la tua istanza (pacchetti, chiavi ssh e altre cose).

Utilizzando MIME è anche possibile inviare script di shell arbitrari, ma è necessario codificarli 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-userdata.txt combinato è il file che si desidera incollare lì.

Maggiori informazioni qui:

https://help.ubuntu.com/community/CloudInit

Da notare anche, questo dipende molto l'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 potrebbero essere diversi.

+2

ah vedo - tutto deve essere codificato MIME. Sto usando l'AMI amazon linux generico, ma vedo il processo 'cloud-init' nei log di avvio, quindi ho pensato che fosse lo stesso di Ubuntu. – lollercoaster

+1

Non è necessario script di codifica MIME per istanze di esecuzione ec2. Cloud-init potrebbe richiedere dati in un formato particolare, ma Amazon se ne prende cura per te - vedi http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonLinuxAMIBasics.html#CloudInit MIME/Base64/gzip le codifiche sono opzionali - il tuo script deve solo iniziare con #! –

+0

Buon punto, io uso OpenStack ... – lzap

12

In realtà, cloud-init consente un singolo script di shell come input (sebbene si desideri utilizzare un archivio MIME per configurazioni più complesse).

Il problema con lo script dell'OP è che la prima riga non è corretta. Si dovrebbe usare qualcosa di simile:

#!/bin/sh 

La ragione di questo è che, mentre il cloud-init utilizza #! per riconoscere uno script utente, il sistema operativo ha bisogno di una linea di shebang completa al fine di eseguire lo script.

Quindi ciò che accade nel caso dell'OP è che cloud-init si comporta correttamente (cioè scarica e tenta di eseguire lo script) ma il sistema operativo non è in grado di eseguirlo effettivamente.


See: Shebang (Unix) su Wikipedia

+2

[La documentazione su cloud-init è in qualche modo fuorviante qui] (http://cloudinit.readthedocs.org/en/latest/topics/format.html#user-data-script), dove afferma "Inizia con:' # ! 'o' Content-Type: text/x-shellscript' quando si utilizza un archivio MIME. " Posso vedere come qualcuno potrebbe non rendersi conto che #! deve includere il percorso dopo lo shebang. –

+0

Non solo fuorviante, ma molto povero per iniziare. Ci sono pochissimi esempi di come questo deve essere messo insieme per funzionare, e quindi è rotto per alcune immagini? gcloud "funziona". Perché la mancanza di (o errata) documentazione? Ci dovrebbe essere un esempio anche per l'uso di file, ma anche la sintassi per questo non è chiara. – mckenzm

2

Si tratta di un paio di anni a questa parte, ma per gli altri beneficiano ho avuto lo stesso problema, e si è scoperto che il cloud-init correva per due volte, da dentro /etc/rc3.d. L'eliminazione di questi file all'interno della cartella consentiva l'esecuzione corretta dei dati dell'utente:

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