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