Help us understand the problem. What is going on with this article?

cloud-init のスクリプトを reboot せずに再実行するには

More than 5 years have passed since last update.

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

消した上で、

  1. cloud-init init --local (/etc/init.d/cloud-init-local start)
  2. cloud-init init (/etc/init.d/cloud-init start)
  3. cloud-init modules --mode config (/etc/init.d/cloud-config start)
  4. cloud-init modules --mode final (/etc/init.d/cloud-final start)

の順番で実行されるのが前提となっているため、final を実行するには、前3つを実行する。

例えば、runcmd: で指定したコマンドは config ステージで scripts/runcmd が生成され、final ステージで実行されるようだ。なので final だけ実行してもファイルがなくて何も処理されない。

おわりに

もっとうまい方法があれば情報 welcome

sonots
A Ruby, Fluentd, and Chainer Committer. SRE Engineer. Qiitaは小ネタの投稿場所として利用しています。業務コードで、なぜそういう書き方をしているのか解説をQiitaに書いて、コードにはQiitaへのリンクを張る、という使い方をしていることが多いです(自己紹介じゃない)
https://medium.com/@sonots
zozotech
70億人のファッションを技術の力で変えていく
https://tech.zozo.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした