Cloud-init はプレーンな bash スクリプトを受け入れません。インスタンスを定義する YAML ファイル (パッケージ、ssh キー、その他のもの) を食べる獣です。
MIME を使用すると、任意のシェル スクリプトを送信することもできますが、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
結合された userdata.txt は、そこに貼り付けたいファイルです。
詳細はこちら:
https://help.ubuntu.com/community/CloudInit
また、これは使用している画像に大きく依存することに注意してください。しかし、それは本当にcloud-initベースのイメージだとおっしゃっているので、これが当てはまります。 cloud-init という名前が付いていない他のクラウド イニシエータがあります - その場合は異なる可能性があります。
これは数年前のものですが、他の利益のために同じ問題があり、/etc/rc3.d
内から cloud-init が 2 回実行されていることが判明しました。 .フォルダ内のこれらのファイルを削除すると、ユーザーデータが正しく実行されるようになりました:
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 は単一のシェル スクリプトを入力として許可します。 (ただし、より複雑なセットアップには MIME アーカイブを使用することもできます)。
OP のスクリプトの問題は、最初の行が正しくないことです。次のようなものを使用する必要があります:
#!/bin/sh
この理由は、cloud-init が #!
を使用している間、 ユーザー スクリプトを認識するために、オペレーティング システムはスクリプトを実行するために完全なシバン行を必要とします。
つまり、OP の場合、cloud-init は正しく動作します (つまり、スクリプトをダウンロードして実行しようとします) が、オペレーティング システムは実際にはそれを実行できません。
参照:ウィキペディアの Shebang (Unix)