cloud-initのper-xxxまとめ
cloud-initのper-xxxについて調べたのでまとめておきます。
per-xxx について
cloud-initは /var/lib/cloud/scripts
内にあるスクリプトを、cloud-init起動時(インスタンスの起動時)に実行します。この中には以下の3つのディレクトリがあります。
- per-once
- per-instance
- per-boot
これらのディレクトリに 実行権限のついたファイルを置いておくと それぞれのタイミングで実行されます。
per-once
per-onceは、マシンイメージに対して1度だけ実行されるスクリプトを置いておきます。実行されたかどうかは /var/lib/cloud/sem
の下にファイルがあるかどうかで判断されます。
ポイントは、/var/lib/cloud/scripts/per-once
にファイルがあったかどうかや、新しいファイルがあるかどうかといった点は 考慮されない ということです。
cloud-init入りのベースイメージから、packerでちょっとした細工をするといったケースの場合、このpackerでマシンイメージを作成したタイミングでper-onceが実行したことになってしまうので注意が必要です。
実際の使いどころは…今の私には思いつかないので誰か教えてください…
per-instance
per-instanceは、インスタンスに対して一度だけ実行されるスクリプトを置いておきます。実行されたかどうかは /var/lib/cloud/instance/sem
以下のファイルで判断されます。
/var/lib/cloud/instance
というディレクトリは /var/lib/cloud/instances/#{instance-id}
というディレクトリのsymlinkになっています。インスタンスからスナップショットをとってそこから新しいインスタンスを起動した場合などは、instance-idが別になるので再実行されるという仕組みになっています。
なお、EC2だとスナップショットから上手く動かないという記事をいくつか見たのですがOpenStackでは問題なく動きました。「per-onceのsemファイルを削除して再実行する」といった類のハックは必要なさそうです。
実際の用途としては、社内のOpenStack基盤だと各々云々の事情で初回のインスタンス起動時にネットワーク関連の再起動が必要になっているので、そのスクリプトを置いておく場所によさそうです。
per-boot
per-bootは、インスタンスの起動の度に実行されるスクリプトを置いておきます。
監視に仕組みやクラスタに入るためのブートストラップなど、そういうのに使う感じでしょうか。
まとめ
per-onceの具体的なユースケースをお待ちしています。