エンジニアの皆さん、こんにちは。インフラの自動化という荒波を乗りこなす旅へようこそ。
かつてChefを触っていた皆さんが苦しんだ「あの壁」。そう、`Berkshelf`と`environment`、そして`data_bag`の依存関係地獄です。`berks install`したはずなのに、なぜか本番環境でだけバージョンがズレる……そんな悪夢にうなされたことはありませんか?
今日は、Chefのモダンな運用における「最終兵器」であるPolicyfileについて語ります。これを使いこなせば、あなたのインフラは「なんとなく動く」から「100%確実に再現可能」な領域へと進化します。
—
1. なぜBerkshelfを捨ててPolicyfileへ行くのか?
一言で言えば、「依存関係の完全凍結」です。
- Berkshelfの罪: `Berksfile.lock`は依存関係を記述しますが、結局Chef Server上で`environment`ファイルとCookbookのバージョンを紐付ける必要がありました。これが「動いているはずの環境」と「デプロイ後の環境」の乖離を招く原因です。
- Policyfileの救済: Policyfileは、「Cookbookの全バージョン」と「Attributeの初期値」を1つのバイナリ(`.lock.json`)に凝縮します。これをChef Serverにプッシュするだけで、環境のすべてが確定する。「一度デプロイして成功すれば、何度やり直しても同じ結果になる」という冪等性の究極系がここにあります。
—
2. 環境構築:Policyfileを迎え入れる
まずはChef Workstationがインストールされている前提で、Policyfileのセットアップを行いましょう。
Chef Workstationに含まれるchefコマンドを使用します
プロジェクトディレクトリを作成して移動
mkdir my-policy-project && cd my-policy-project
Policyfile.rbを初期生成
chef generate policyfile my_policy
これで、`Policyfile.rb`という名の「インフラの設計図」が手に入ります。
—
3. Policyfile.rb:インフラの「絶対的な仕様書」
`Policyfile.rb`を覗いてみてください。ここが皆さんの新しい司令塔です。
Policyfile.rb
1. 名前を定義
name ‘web_server_policy’
2. Cookbookの取得先を指定(Supermarketやローカル、Gitなど)
default_source :supermarket
3. 実行するCookbookと、そのバージョンをここで凍結
run_listは「何を実行するか」を定義
run_list ‘my_cookbook::default’
4. Cookbookの指定(バージョン固定による再現性の担保)
cookbook ‘my_cookbook’, path: ‘./cookbooks/my_cookbook’
—
4. HelloWorldの極意:パッケージングとデプロイ
では、設定したPolicyfileをロックし、デプロイ可能な状態にしましょう。
ステップ1:Policyfileのロック(再現性の確定)
chef install
このコマンドで `Policyfile.lock.json` が生成されます。これが黄金のファイルです。 このファイルをGit管理下に置くことで、チーム全員が全く同じバージョンのCookbook環境を共有できます。
ステップ2:動作確認(Policyfileを利用した適用)
まずはローカルで `chef-client` を実行してみましょう。
指定したPolicyfileを読み込み、ローカルモードで適用
chef-client -z -P my_policy
`-P` オプションを使うことで、Chef Serverを通さずにポリシーの整合性を確認できます。ここでエラーが出なければ、あなたの構成は「論理的に正しい」ことが証明されたことになります。
—
5. 本番デプロイ:安全を担保するフロー
本番環境への適用は、以下の手順を厳守してください。これが「深夜の障害」を防ぐ唯一の道です。
1. Policyfile.lockの作成: ローカルで `chef install` を実行。
2. Chef Serverへのプッシュ:
chef push production Policyfile.lock.json
これにより、Chef Serverは「このPolicyfileが指すCookbookの組み合わせ」を完全に理解します。
3. ノードへの適用:
ノード側では、`client.rb`でポリシー名を指定するだけです。
# /etc/chef/client.rb
policy_name ‘web_server_policy’
policy_group ‘production’
—
先輩エンジニアからのアドバイス
Policyfileへの移行は、最初は少し窮屈に感じるかもしれません。しかし、それは「インフラ管理における無秩序な自由」を捨て、「信頼できる予測可能性」を手に入れるプロセスです。
- Tips: `Policyfile.lock.json` は絶対に手動で編集しないでください。常に `chef install` が生成するものを信頼しましょう。
- Next Step: 次は、`Policyfile`を用いた「段階的デプロイ(staging -> production)」のパイプライン構築に挑戦してみてください。
インフラは、魔法ではなく「論理」で動かすものです。Policyfileをマスターすれば、あなたの管理するサーバー群は、いつだってあなたの意図通りに美しく整列するようになりますよ。
さあ、次はどんな環境を自動化しましょうか? 応援しています。