AWS の CentOS 6 に cloud-init をインストールしていろいろ試してみようと思ったのですが、動きを確認するためにいちいちインスタンスを起動していたのではたまらんわーっと思いました。
そこで、None データソースを使ってローカルの環境で簡単に確認できるようにしてみました。
インストール
yum でインストールします。
yum install cloud-init
cloud.cfg
datasource_list
で None
データソースだけを指定し、datasource
でメタデータとユーザーデータを指定します。
ユーザーデータは #include
で /etc/cloud/user-data
を読み込むようにします。
cloud_***_modules
には動作を試したいモジュールを記述します。
datasource_list: [None]
datasource:
None:
metadata:
userdata_raw: |
#include
/etc/cloud/user-data
cloud_init_modules:
- bootcmd
- set-hostname
- update-hostname
cloud_config_modules:
- runcmd
cloud_final_modules:
- scripts-user
user-data
ユーザーデータをそれっぽく作ります。
#cloud-config
hostname: oreore.example.net
fqdn: oreore.example.net
bootcmd:
- ["bash", "-c", "echo `date`: bootcmd | tee -a /tmp/bootcmd"]
runcmd:
- ["bash", "-c", "echo `date`: runcmd | tee -a /tmp/runcmd"]
動作確認用のスクリプト
リブートせずに動作確認するために次のスクリプトを作成します。
#!/bin/bash
rm -f /etc/hostname
hostname localhost.localdomain
rm -f /tmp/bootcmd
rm -f /tmp/runcmd
if [ "first" == "$1" ]; then
rm -fr /var/lib/cloud/*
fi
for x in cloud-init-local cloud-init cloud-config cloud-final; do
service $x start
done
初回ブート時
スクリプトに first
と引数を付けて実行します。これは初回ブート時の動作です。
# ./cloud-init-test first
ホスト名が設定されていることを確認します。
# hostname
oreore.example.net
# cat /etc/hostname
oreore.example.net
bootcmd が実行されていることを確認します。
# cat /tmp/bootcmd
Sun Nov 16 16:58:36 JST 2014: bootcmd
runcmd が実行されていることを確認します。
# cat /tmp/runcmd
Sun Nov 16 16:58:37 JST 2014: runcmd
2回目以降のブート時
スクリプトに引数を付けずに実行します。これは2回目以降のブート時の動作です。
# ./cloud-init-test
ホスト名が設定されていることを確認します。
# hostname
oreore.example.net
# cat /etc/hostname
oreore.example.net
bootcmd が実行されていることを確認します。
# cat /tmp/bootcmd
Sun Nov 16 16:59:23 JST 2014: bootcmd
runcmd は実行されませんでした。runcmd は初回のブート時にだけ実行されるもののようです。
# cat /tmp/runcmd
cat: /tmp/runcmd: No such file or directory