けんちゃんくんさんのWeb日記
2015/6/1

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の具体的なユースケースをお待ちしています。

created_at: 2015-08-06 01:43:33 +0900
updated_at: 2015-08-06 01:43:33 +0900