Anatomy of a Chef Runの訳

Anatomy of a Chef Runを訳しています。

Anatomy of a Chef Run

Chefを動かすならChef-clientの実行の仕組みは覚えておいた方がいいですよ。

Convergence

Chef-clientやChef-soloでプロセスを呼んだときは"Convergence"リソースを呼ぶ必要があります。
Convergenceはシステム内で自動的に"各動作を実行するときはシステムを正しい形でくださいね"ということを意味します。理想としてはChef-clientを一つのサーバで走らせるとき中途半端な状態ではなく完全な状態のシステムを利用できる事です。
うまく完了しなかった場合は続けてシステムに要求を送り続けます。

Chef-clientの実行

  • Chef-Clientを実行
  • Node作業
    • 構築
    • 登録
    • 認証
  • Cookbookの同期
    • ライブラリを同期
    • 変数を同期
    • 定義を同期
    • レシピを同期
  • リソースをコンパイル
    • ライブラリ読み込み
    • 変数読み込み
    • 定義読み込み
    • レシピ読み込み
  • Nodeを設定
    • 保存
  • Chef-client終了

Build, Register, and Authenticate the Node

Chef-clientもしくはChef-soloを実行する際、最初にNodeをたてます。Nodeは以下で構成されています。

  • Ohai:OSから情報を持ってきます
  • Chef-serverから前回のNode情報を持ってきます(Chef-solo使わないときのみ)
  • JSONの変数とレシピを追加します
  • Ohaiで取得してきた情報を追加します

一度Nodeが構築されるとChef-Clientは毎回/etc/chef/client.pemという非公開キーを参照するようになります。
それがない場合自身でそれを作ろうとします。それ自身を登録するときはChef-validaterを一意のものだと仮定します。Chef-validatorは特殊なクライアントでそれを利用する事で新しいユーザを作成することができます。Chef-validatorはデフォルトで/etc/chef/validation.pemに非公開キーを持ちます。一回作ってしまえば次回からは/etc/chef/client.pemを参照するようになります。

Synchronize Cookbooks

Chef-ClientはChef-Serverにライブラリ、変数、定義、レシピの一覧を取得しローカルのファイルキャッシュに溜め込みます。

Compile Resource Collection

COOKBOOKから情報を得た後、nodeに必要なリソースを収集します。

  • ライブラリをロードする
    • 言語拡張はRubyのクラスを使用可能にします
  • 変数をロードする
    • レシピやNodeの変数から変数をロードします
  • 定義をロードする
    • 定義はレシピの前に読み込まれている必要があり、それからリソースが生成されます
  • レシピをロードする
    • この時にレシピは評価されます。この時点ではリソースは実行されず、一度Resource Collectionという場所に保持されます。Resource Collectionはいくつかのヘルパーがついたリソースが評価されたものをつめた配列です。しかしリソースの外で定義されたただのRubyも評価されます。もしあなたが他のリソースを利用したいならRuby Block Resourceを利用するとよいでしょう。コンパイル時にRuby Resourceを実行することも可能ですよ。

Configure Node

Chefはこの時点でシステムとして設定できる準備ができています。

  • Converge
    • 各リソースはProviderにマッピングされます。ProviderとはChef上で動作可能なオブジェクトです。
  • Save node
    • Convergeした後Nodeを保存し、検索対象内にセットします。
  • Run Notifications
    • 最後には、設定した通知が動きます

Chef-Clientが失敗した場合exception handlerに登録した動作が実行されます。