cloud init のスクリプトをホストを再起動せずに何度も実行して開発するには次のようにすればよいようだ
前提知識
/etc/cloud/cloud.cfg には
cloud_init_modules:
...
# The modules that run in the 'config' stage
cloud_config_modules:
...
# The modules that run in the 'final' stage
cloud_final_modules:
の3つのセクションがある。実行タイミングについては Amazon Linuxのcloud-initの動きについて調べてみた の記事を参照すると良い。
開発実行のやり方
それぞれ以下のように実行すれば良い
1. cloud_init_modules
セクションの実行
rm -rf /var/lib/cloud/* && \
cloud-init --debug init --local && \
cloud-init --debug init
2. cloud_config_modules
セクションの実行
rm -rf /var/lib/cloud/* && \
cloud-init init --local && \
cloud-init init && \
cloud-init --debug modules --mode config
3. cloud_final_modules
セクションの実行
rm -rf /var/lib/cloud/* && \
cloud-init init --local && \
cloud-init init && \
cloud-init modules --mode config && \
cloud-init --debug modules --mode final
補足
/var/lib/cloud
の下はこんなかんじで、status.json や sem 以下のファイルに init が実行ずみであることなどが記録されているため、消さないと再実行できなくなっている。(status.json を消すだけではダメだった)
# tree /var/lib/cloud/
/var/lib/cloud/
├── data
│ ├── instance-id
│ ├── previous-datasource
│ ├── previous-instance-id
│ └── status.json
├── handlers
├── instance -> /var/lib/cloud/instances/i-5d1d98af
├── instances
│ └── i-5d1d98af
│ ├── cloud-config.txt
│ ├── datasource
│ ├── handlers
│ ├── obj.pkl
│ ├── scripts
│ │ └── runcmd
│ ├── sem
│ │ └── consume_data
│ ├── user-data.txt
│ ├── user-data.txt.i
│ ├── vendor-data.txt
│ └── vendor-data.txt.i
├── scripts
│ ├── per-boot
│ ├── per-instance
│ ├── per-once
│ └── vendor
├── seed
└── sem
消した上で、
-
cloud-init init --local
(/etc/init.d/cloud-init-local start
) -
cloud-init init
(/etc/init.d/cloud-init start
) -
cloud-init modules --mode config
(/etc/init.d/cloud-config start
) -
cloud-init modules --mode final
(/etc/init.d/cloud-final start
)
の順番で実行されるのが前提となっているため、final を実行するには、前3つを実行する。
例えば、runcmd:
で指定したコマンドは config ステージで scripts/runcmd
が生成され、final ステージで実行されるようだ。なので final だけ実行してもファイルがなくて何も処理されない。
おわりに
もっとうまい方法があれば情報 welcome