脱・Berkshelfの深淵:Chef Policyfileで実現する「再現性100%」のインフラ管理術
現場のSRE諸君、まだ `Berksfile` の地獄に苦しんでいるのか?
「開発環境では動いたのに、本番環境で微妙にバージョンがズレてコケた」。このセリフを最後に聞いたのはいつだ? Berkshelfは便利だった。だが、動的な依存関係解決は、スケールするインフラにおいて「非決定性という名の爆弾」を抱え込んでいるのと同じだ。
今日ここで、その呪縛を解く。Chef Policyfileへの移行は単なるツール変更ではない。君たちのインフラを「運任せ」から「科学」へ昇華させるための必須儀式だ。
—
1. なぜBerkshelfを捨て、Policyfileを選ぶのか
Berkshelfの問題点は、デプロイのたびに依存関係を再解決(Solve)しようとすることにある。ネットワークの揺らぎや外部ソースの微細な変更一つで、構成がドリフトするリスクを排除できない。
Policyfileのパラダイムシフト:
- 決定論的解決: `Policyfile.lock.json` が生成された瞬間に、すべての依存関係(Cookbookのバージョン、レシピの順序、Attributes)が完全に固定される。
- イミュータブルなデプロイ: サーバー側で `chef-client` を実行する際、依存関係を計算させる必要はない。ロックファイルをそのまま送り込むだけだ。
- 単一ユニットとしての管理: `Policyfile` はそれ自体が「ノードの構成状態」を定義する完結したパッケージである。
—
2. 現場を劇的に加速させる「Policyfile運用」の極意
チーム開発における「絶対ルール」
1. Lockfileをコミットせよ: `Policyfile.lock.json` は構成の「源泉」だ。Git管理から外すことは許されない。
2. `policy_group` で環境を分離: `staging`, `production` などのグループを明確に分け、パイプラインを通じてプロモート(昇格)させる運用を徹底せよ。
開発スピードを上げるツールチェイン
Policyfileを使いこなすなら、以下の環境は「呼吸するレベル」で整えておくこと。
- 神プラグイン/ツール:
- `chef-cli`: これ以外は使うな。`chef` コマンドだけで完結させる。
- `foodcritic` + `Cookstyle`: VS Codeの拡張機能でリアルタイムLintを徹底せよ。
- `Test Kitchen` + `kitchen-dokken`: Dockerベースの高速なテスト環境。VMを立ち上げる時代は終わった。
- キーボードショートカット (VS Code):
- `Ctrl + Shift + P` -> `Chef: Apply Policyfile`: これをショートカット `Alt + P` に割り当てろ。テスト適用のサイクルが3倍速くなる。
—
3. 実践:Policyfile ベストプラクティス構成
以下に、再利用性と可読性を最大化した `Policyfile.rb` の構成を示す。
Policyfile.rb
命名規則: 役割-環境.rb (例: web-production.rb)
name ‘web-server’
依存関係はここですべて明示する
default_source :supermarket
ローカルCookbookはパスで指定
cookbook ‘my_app_base’, path: ‘./cookbooks/my_app_base’
外部Cookbookはバージョンを必ずピン留めする
cookbook ‘nginx’, ‘12.0.0’
Attributesの管理:Policyfileには「その環境特有の最小限」のみ記述せよ
default[‘nginx’][‘version’] = ‘1.24.0’
実行順序(Run List)
run_list ‘my_app_base::default’, ‘nginx::default’
重要な設定:Policyfile.lock.json の整合性を保つための設定
チームで共有する際はこれを強制する
—
4. 本番環境への安全なデプロイフロー:プロモーション戦略
「いきなり本番に適用する」など言語道断だ。以下のフローをCI/CDパイプラインに組み込め。
1. `chef update`: 依存関係を最新化し、`Policyfile.lock.json` を再生成。
2. `kitchen test`: コンテナ上で全テストを通過させる。
3. `chef push staging Policyfile.lock.json`: ステージング環境へポリシーをプッシュ。
4. `chef push production Policyfile.lock.json –promote`: ステージングで検証済みのロックファイルを、そのまま本番のポリシーグループへ昇格させる。
ここが肝だ: 昇格の際、Cookbookのコードを再コンパイルしない。 検証済みで、一切の変更がないバイナリ(ロックファイル)をそのまま昇格させる。これが「完全な再現性」を生む。
—
5. テックリードからの提言
君たちが管理しているのは単なるサーバーではない。「コードとして定義された、信頼できるインフラの姿」だ。
Berkshelfの動的解決に頼る時代は終わった。Policyfileを採用し、ロックファイルを厳格に管理することで、君たちのインフラは「いつ、誰が、何度実行しても同じ状態になる」という、SREの究極の目標に到達する。
明日から、君たちのリポジトリに `Policyfile.lock.json` がない状態を「技術的負債」として認識しなさい。コードは嘘をつかない。ツールは正しく使えば、君たちを深夜の障害対応から解放してくれるはずだ。
さあ、今すぐ `chef init` を叩け。インフラの進化は、そこから始まる。