こんにちは。インフラの現場で「なぜChefが失敗したのか」をgrepコマンドと睨めっこしながら夜を明かした経験はありますか?
Chefは強力なツールですが、デフォルトのテキストログは人間が読む分には良くても、「大規模なインフラ環境で何が起きたか」を自動で追跡するにはあまりに非力です。
今回は、ChefのログをJSON形式で出力させ、それをログ解析基盤へ流し込むことで、「どのノードで、どのリソースが、なぜ失敗したか」を秒速で特定するための極限のプラクティスを伝授します。これさえ構築すれば、深夜の障害対応から解放され、運用の質が劇的に変わります。
—
1. なぜ「JSONログ」なのか?
Chefの標準ログは「テキストの塊」です。これをFluentdやLogstashで解析しようとすると、複雑な正規表現(Regexp)地獄に陥ります。一方、JSON形式ならキーバリューの構造が保たれるため、ElasticsearchやLokiでのフィルタリングが極めて容易になります。
「発生時刻」「ノード名」「リソース名」「アクション」「ステータス」が構造化されていること。これがSREの鉄則です。
—
2. Chef Infra ClientをJSON出力モードに設定する
Chefのログフォーマットは、`client.rb`の設定一つで変更可能です。以下の設定を各ノードの `/etc/chef/client.rb` に追記してください。
/etc/chef/client.rb
ログを標準出力ではなくJSONフォーマットで出力する設定
これにより、Fluentdなどがパースしやすい形式になります
log_format :json
ログレベルをinfo以上に設定(必要に応じてdebugへ)
log_level :info
ログの出力先をファイル指定(後述のFluentdがこれをtailします)
log_location “/var/log/chef/client.json”
設定後、`chef-client` を実行すると、`/var/log/chef/client.json` にJSONが追記されていくはずです。これが解析の「原石」です。
—
3. Fluentdによるログ収集パイプライン
次に、吐き出されたJSONを収集するFluentd(td-agent)の設定です。JSON形式であれば、`parser`セクションで `json` を指定するだけで、パースの手間がゼロになります。
/etc/td-agent/td-agent.conf
path /var/log/chef/client.json
pos_file /var/log/td-agent/chef.log.pos
tag chef.log
@type elasticsearch
host localhost
port 9200
logstash_format true
logstash_prefix chef-client
—
4. 実践:異常検知クエリ(Grafana Loki / Elasticsearch)
データが溜まったら、次にやるべきは「異常検知」です。例えば、Loki (LogQL) を使って「失敗したリソース」を即座に抽出するクエリは以下の通りです。
異常検知クエリ(LogQL)
ログの中からstatusが”failed”のものだけを抽出
{job=”chef-client”} | json | status = “failed”
なぜこれが最強なのか?
Chefの冪等性を担保していても、依存パッケージの不整合などで失敗は必ず起きます。このクエリをGrafanaのアラートに設定しておけば、「Chefが失敗した瞬間にSlackへ通知が飛ぶ」環境が完成します。エラーログを追いかける時間は今日で終わりです。
—
5. 伝説のエンジニアからのアドバイス
初心者の皆さんが最初につまずくのは、「ログが多すぎて何が重要かわからない」という点です。
- フィルターを活用せよ: すべてのログをElasticsearchに突っ込むとコストが爆発します。Fluentd側で `status == “updated”` や `status == “failed”` に絞り込んで転送するだけでも、ストレージコストと解析速度が劇的に改善します。
- ノードのメタデータを付与せよ: `client.rb` で `ohai` の情報をログに含める設定をしておくと、どのリージョン、どのOS環境での失敗かまで一撃で特定できるようになります。
まとめ
ChefのログをJSON化し、パイプラインに乗せる。たったこれだけのことですが、これができるかできないかで、インフラエンジニアとしての「生存戦略」が変わります。
「Chefが何をしたか」を人間が解読する時代は終わりです。システムに語らせ、機械に分析させる。 このスマートな運用こそが、クラウド時代のSREの第一歩です。
まずは手元の検証用ノード一台から、JSONログを出力してみてください。そのJSONの美しさに、きっと感動するはずです。何か詰まったら、いつでも聞いてくださいね。応援しています!