Chefの真髄:only_if / not_if を極めて「収束速度」を極限まで高める
Chefを単なる「設定管理ツール」だと思っているなら、今すぐその考えを捨てろ。Chefの本質は「宣言的状態の収束」にある。
リソースを記述する際、多くのエンジニアが犯す最大の過ちは、「何でもかんでもリソースを叩く」ことだ。Chefは冪等性を担保するが、毎回無駄なコマンドを実行して結果を評価するコストは、大規模環境では致命的な遅延を生む。
今日は、`only_if` と `not_if` を使いこなし、Chefの収束速度を物理限界まで引き上げるための「プロの技術」を伝授する。
—
1. 評価タイミングという「深淵」を理解する
`only_if` と `not_if` は、リソースが実行される「直前」に評価される。ここで重要なのは、「このガード句自体が重いと、Chefのconverge時間は指数関数的に増大する」という事実だ。
- ガード句の鉄則:
- 重い外部APIコールや、巨大なログファイルの解析をガード句に書くな。
- 可能な限り、ファイル属性のチェックや、exit codeだけで判定できる軽量なシェルコマンドに留める。
—
2. 実践:Rubyブロックを用いた「条件分岐の極意」
シェルスクリプトだけで条件を書くのは限界がある。Chefの強力な武器は、ガード句の中に「Rubyのコード」を直接埋め込めることだ。これにより、複雑な状態判定をChefのコンテキスト内で完結できる。
推奨パターン:Rubyブロックによる高度な判定
複雑なロジックをガード句に閉じ込める
execute ‘deploy_application’ do
command ‘/usr/local/bin/deploy.sh’
# ノードの属性と現在のOSの状態を動的に判定
only_if do
node[‘myapp’][‘enabled’] &&
!File.exist?(‘/var/run/myapp.lock’) &&
`grep -c ‘ready’ /var/log/myapp.status`.to_i > 0
end
end
解説:
ここでは、外部シェルを呼び出すコストを最小化しつつ、Rubyの柔軟な条件分岐を利用している。特に `node` オブジェクトへのアクセスはChefのメモリ上で行われるため、OSレベルのコマンド実行よりも遥かに高速だ。
—
3. 収束速度を最大化するアンチパターン回避
「動けばいい」というコードは、現場では負債だ。以下のアンチパターンを今すぐ排除せよ。
アンチパターン:ガード句内での無駄なパイプ
NG: 毎回パイプでプロセスを生成している
only_if “ps aux | grep [n]ginx”
これだと、`grep` と `ps` という2つのプロセスが毎回起動する。
プロの解法:ファイルベースのステータス管理
OK: シェルビルトインや単純なファイルチェックを使う
only_if { File.exist?(‘/var/run/nginx.pid’) }
Chefの収束速度を落とさないためには、「プロセスを起動させるな」。これが鉄則だ。
—
4. チーム開発における「神」設定と環境標準化
個人の生産性はツールの習熟度に依存するが、チームの生産性は「標準化」に依存する。
開発スピードを加速させる推奨設定 (`client.rb`)
チーム全員のPCでこの設定を共有せよ。
/etc/chef/client.rb
log_level :info
log_location STDOUT
大規模環境ではこれを有効にして、不要なノード情報の転送を抑止する
minimal_ohai true
収束時の並列化を意識(適宜調整)
chef_server_url ‘https://chef.internal.com’
チームで使うべき神プラグイン・ツール
1. `chef-sugar`: `only_if` の記述を劇的に簡略化する。`only_if { linux? && centos? }` のように記述できるため、可読性が爆上がりする。
2. `Test Kitchen`: 構成管理コードを本番に投入する前に、ローカルで破壊的にテストせよ。`kitchen converge` なしにプッシュするのは、目隠しで高速道路を走るのと同義だ。
—
5. 最後に:エンジニアとしての矜持
Chefのコードは、サーバーの「あるべき姿」を記述する設計図だ。設計図が汚ければ、サーバーも汚れる。
`only_if` と `not_if` を使いこなすことは、単なる最適化ではない。それは「システムの状態を完全に把握し、無駄な操作を排除する」というSREとしての規律そのものだ。
君たちが書く一行のガード句が、数千台のサーバーの数秒を救う。その重みを忘れず、最高のインフラを構築してほしい。
さあ、コードを書け。ただし、Chefの収束速度を意識しながら。