Chefの「テキストログ」を捨てろ。構造化ログで実現するオブザーバビリティの極致
Chefを使っている多くの現場で、未だに「シェフが何をしたか」を追いかけるために、泥臭いテキストログを `grep` している光景を目にする。率直に言おう。2024年において、テキストログを追うのはインフラエンジニアの負けだ。
Chef Infra Clientの実行結果をJSONで構造化し、ログ基盤に流し込む。この「当たり前のこと」を徹底するだけで、Chefの実行失敗率は可視化され、リソースの収束速度は劇的に向上する。
今日は、現場のテックリードとして、Chefを「ただの構成管理ツール」から「可観測な自律システム」へと昇華させるための実装論を叩き込む。
—
1. ログの構造化:ChefをJSONフォーマットで喋らせる
Chef標準のテキストログは人間には読めるが、マシンには優しくない。`chef-client` が出力するログをJSONに切り替えるには、`client.rb` に以下の設定を投入する。
`client.rb` のベストプラクティス
/etc/chef/client.rb
標準のログフォーマッターをJSON対応のものに変更
log_format :json
ログレベルはinfo以上で十分。debugはCI環境でのみ切り替える運用にする
log_level :info
ログ出力先を指定
log_location “/var/log/chef/client.json”
【重要】実行失敗時に即座に検知するため、レポートハンドラを定義する
require ‘chef/handler/json_file’
report_handlers << Chef::Handler::JsonFile.new(path: "/var/log/chef/reports")
これにより、各リソースの実行結果(`updated`, `skipped`, `failed`)がJSONオブジェクトとして流し込まれる。これで、パース地獄から解放される。
---
2. ログパイプライン構築:Fluentdによるログ収集
収集したJSONログをElasticsearchやGrafana Lokiに送るためのFluentd設定だ。ここで重要なのは、「ノード属性をタグ付けする」こと。どの環境(Staging/Production)のどの役割(Role)のノードでエラーが起きたかを即座に特定できるようにする。
`fluent.conf` 設定例
path /var/log/chef/client.json
pos_file /var/log/td-agent/chef.pos
tag chef.log
@type record_transformer
# 環境変数を埋め込み、検索性を高める
hostname “#{Socket.gethostname}”
environment “production”
@type elasticsearch
host elasticsearch-cluster
port 9200
logstash_format true
logstash_prefix chef-infra
—
3. 実践:異常検知クエリの書き方
データが溜まれば、次は「異常」をどう拾うかだ。Grafana Loki (LogQL) を例に、Chefの実行失敗をSlackに飛ばすためのクエリを伝授する。
失敗リソースを抽出するクエリ
{job=”chef-client”} | json | status=”failed”
このクエリをGrafanaのAlertingに仕込み、`updated_resources` が0なのにエラーが出るような「不整合状態」を検知する。
プロのテクニック:
「Chefが成功したこと」を追うな。「Chefが適用されるべき構成から乖離した瞬間」を追え。エラーログよりも、`updated` リソースが不自然に多発している時間帯を監視する方が、インフラの変更リスクを早期に察知できる。
—
4. 現場の生産性を爆速化する「神」テクニック
チーム開発における共有化ルール
- Attributesは悪、Data Bagは麻薬: 可能な限り `cookbooks/my_cookbook/attributes/default.rb` で完結させろ。複雑な階層化はトラブルの元だ。
- Policyfileの強制: `chef-repo` の乱立を防ぐため、現在は Policyfile 一択だ。環境ごとのバージョン固定をコードで管理し、`Policyfile.lock.json` をコミットするフローを強制せよ。
必須のVSCodeプラグイン
- Chef Extension: 公式の必須プラグイン。Linter(`foodcritic`の後継`chef-run`)を常に走らせろ。
- YAML/JSON Language Support: コンフィグファイル作成時のシンタックスエラーを皆無にする。
隠れたキーボードショートカット (VSCode)
- `Ctrl + Shift + P` -> `Chef: Run Chef Infra Client`: ターミナルで長ったらしいコマンドを打つな。すべてコマンドパレットから実行しろ。
—
最後に:なぜ「構造化」にこだわるのか
ChefのログをJSON化するのは、単なるトレンドではない。インフラの「状態」をデータとして扱い、コードベースの変更がシステムに与える影響を定量的に語れるようにするためだ。
「ログを見ればわかる」と言うエンジニアは、ログを読み解く時間に生産性を奪われている。構造化ログによって「ログを検索する時間」をゼロにし、その時間を「より堅牢なレシピを書く時間」に投資せよ。
この基盤が完成した時、君のチームは「Chefを運用している」のではなく、「インフラという生命体を正しく管理している」状態になっているはずだ。
さあ、今すぐ `client.rb` を書き換えろ。現場の空気が変わるぞ。