GNU/Linux >> LINUX-Kenntnisse >  >> Linux

user-data (cloud-init)-Skript wird auf EC2 nicht ausgeführt

Cloud-init akzeptiert keine einfachen Bash-Skripte, einfach so. Es ist ein Biest, das die YAML-Datei frisst, die Ihre Instanz definiert (Pakete, SSH-Schlüssel und andere Dinge).

Mit MIME können Sie auch beliebige Shell-Skripte senden, müssen diese aber MIME-kodieren.

$ 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

Die Combined-Userdata.txt ist die Datei, die Sie dort einfügen möchten.

Mehr Infos hier:

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

Beachten Sie auch, dass dies stark vom verwendeten Bild abhängt. Aber Sie sagen, es ist wirklich ein Cloud-Init-basiertes Image, also trifft dies zu. Es gibt andere Cloud-Initiatoren, die nicht cloud-init heißen - dann könnte es anders sein.


Dies ist jetzt ein paar Jahre alt, aber zum Nutzen anderer hatte ich das gleiche Problem, und es stellte sich heraus, dass cloud-init zweimal ausgeführt wurde, und zwar innerhalb von /etc/rc3.d . Durch das Löschen dieser Dateien im Ordner konnten die Benutzerdaten korrekt ausgeführt werden:

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

Tatsächlich erlaubt cloud-init ein einzelnes Shell-Skript als Eingabe (obwohl Sie vielleicht ein MIME-Archiv für komplexere Setups verwenden möchten).

Das Problem mit dem Skript des OP ist, dass die erste Zeile falsch ist. Sie sollten so etwas verwenden:

#!/bin/sh

Der Grund dafür ist, dass cloud-init #! verwendet Um ein Benutzerskript zu erkennen, benötigt das Betriebssystem eine vollständige Shebang-Zeile, um das Skript auszuführen.

Was also im Fall des OP passiert, ist, dass sich cloud-init korrekt verhält (d. h. es lädt das Skript herunter und versucht, es auszuführen), aber das Betriebssystem kann es nicht tatsächlich ausführen.

Siehe:Shebang (Unix) auf Wikipedia


Linux
  1. Ssh – Skript zur Automatisierung von SCP im Netzwerk?

  2. Curl-Outfile-Variable funktioniert nicht in Bash-Skript?

  3. Leerzeichen für Variablen in Bash-Skript?

  4. Init.d-Skript wird beim Booten nicht ausgeführt?

  5. Rm-Befehl im Bash-Skript funktioniert nicht mit Variablen?

Warum ist Nullglob kein Standard?

Fehler im Zählskript für die Anzahl der Vorkommen?

4 Möglichkeiten zum Ausführen eines Shell-Skripts unter UNIX / Linux

Ubuntu Python Shebang-Zeile funktioniert nicht

realpath-Befehl nicht gefunden

Erwarten Sie einen Skriptfehler, der gesendet wird:Spawn-ID exp4 wird während der Ausführung nicht geöffnet