GNU/Linux >> Linux Esercitazione >  >> Linux

script user-data (cloud-init) non in esecuzione su EC2

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


Linux
  1. Errore nello script di conteggio per il numero di occorrenze?

  2. Spazi per le variabili nello script Bash?

  3. Lo script Init.d non viene eseguito all'avvio?

  4. Il comando Rm nello script Bash non funziona con la variabile?

  5. Cron Job non viene eseguito?

4 modi per eseguire uno script di shell in UNIX / Linux

nohup:comando non trovato

La linea di Ubuntu Python shebang non funziona

Variabile di ambiente TERM non impostata

Come copiare l'output del terminale?

comando realpath non trovato