Chef Infra Clientの収束(Convergence)時間を半減させる:現場で戦うための極限チューニング術
こんにちは。インフラの深淵を覗き込み、自動化の美学を追求するエンジニアです。
Chefを運用していると、必ずぶつかる壁があります。「`chef-client` の実行が遅すぎる」という問題です。特に管理対象が数百台を超え、レシピが複雑化してくると、収束(Convergence)時間が数分、時には10分以上かかることも珍しくありません。
多くの人は「Chefはそういうものだ」と諦めますが、それは違います。Chefの実行時間は、設計次第で劇的に短縮できるのです。 今日は、現場で培った「Chefを爆速にするためのチューニング術」を、基礎から応用まで伝授します。
—
1. Chefの役割と「なぜ遅くなるのか」の本質
まず初心者のために定義しておくと、Chefは「あるべき状態(Desired State)」をコード化し、それを現在のサーバーの状態に適用するツールです。
遅延の原因は、大きく分けてこの3つです。
1. Ohaiの肥大化: ノード情報の収集に時間を使いすぎている。
2. リソースの過剰なスキャン: 変化がないのに全てのファイルをチェックしている。
3. ネットワーク待ち: リポジトリや外部APIへのアクセスが同期的に行われている。
これらを最適化すれば、実行時間は間違いなく半分になります。
—
2. まずはここから:Chef Infra Clientの基本セットアップ
まずは最短でChefを動かすための「正しい基礎」を整えましょう。
インストールとHelloWorld
Chef Workstationをインストールした前提で、まずは `chef-repo` を作成します。
Chefの管理用リポジトリを作成
chef generate repo my-infra-repo
cd my-infra-repo
HelloWorld的なレシピを作成 (ファイルを作成するだけ)
chef generate cookbook cookbooks/hello
`cookbooks/hello/recipes/default.rb` を以下のように編集します。
冪等性(何度実行しても同じ結果になること)を担保する基本
file ‘/tmp/hello.txt’ do
content ‘Chef is the best!’
action :create
end
実行は `chef-client -z` (ローカルモード) で行います。
chef-client -z -o hello
—
3. 収束時間を半減させる「極限チューニング」
ここからが本題です。現場で震えるほど効果がある3つのテクニックを公開します。
① Ohaiのプラグインを断捨離する
Chefは実行のたびに `Ohai` というツールでサーバーのハードウェアやネットワーク情報を収集します。しかし、クラウド環境では不要な情報も多いのです。
`/etc/chef/client.rb` に以下を追加して、不要なプラグインを無効化しましょう。
不要なプラグインを無効化してOhaiの負荷を軽減
ohai.disabled_plugins = [
“C”, # C言語系言語の検出
“Erlang”, # Erlangの検出
“Groovy”, # Groovyの検出
“Lua” # Luaの検出
]
※実行環境に存在しない言語のチェックを外すだけで、数秒の短縮が見込めます。
② リソースの「探索」を抑制する
Chefはデフォルトで多くのファイルをチェックします。特に `directory` や `file` リソースで `recursive` を多用すると遅くなります。
悪い例:
ディレクトリ配下を全て再帰的にスキャンしてしまう
directory ‘/var/www/html’ do
recursive true
action :create
end
改善例:
必要なファイルのみを定義するか、`not_if` / `only_if` ガードを使って、スキャンそのものをスキップさせましょう。
変更の必要がない場合は即座に終了させるガード
file ‘/etc/myapp.conf’ do
action :create
not_if { File.exists?(‘/etc/myapp.conf’) } # 存在していればスキャンしない
end
③ Chef Clientの実行を並列化する
もしレシピ内で複数のサービス管理やパッケージインストールを行っているなら、リソースの `action` を工夫します。しかし、何より効くのは「不要な実行を減らす」ことです。
`client.rb` で `splay`(実行タイミングのランダム化)を設定している場合、これが遅延の原因になることがあります。開発環境ではこれをゼロにしましょう。
実行間隔の設定
interval 1800 # 30分おき
splay 0 # 待機時間をゼロに(開発・検証時は必須)
—
4. 現場のシニアからのアドバイス
Chefのチューニングは「何をしたか」よりも「何をやらなかったか(スキャンを省いたか)」が重要です。
- Ohaiのキャッシュを活用する: 頻繁に変わらないデータはキャッシュさせます。
- Chef Infra Serverを使っているなら: ノードの属性(Attributes)を過剰に保存しないこと。肥大化したJSONは読み込みを遅くします。
「自動化」は手段であり、目的は「速く、安全にサービスを届けること」です。Chefの実行を高速化することは、開発者のフィードバックループを短縮し、結果としてビジネスの速度を上げることにつながります。
この技術をマスターすれば、毎日のデプロイや構成管理が驚くほど軽快になりますよ。さあ、次はあなたのサーバーで、この「爆速」を体感してみてください。応援しています。