Chef Infra Clientの自動実行を極める:ドリフトを封じ、インフラを「自律する生命体」へ昇華させる
インフラエンジニア諸君、今日も泥臭い手作業と「構成ドリフト」の対応に追われていないか?
Chefを使っているにも関わらず、`chef-client` を手動で叩いたり、あるいは不完全なcron設定で死んだサーバーを放置しているなら、それはChefを使っているとは言えない。単なる「スクリプト実行機」に成り下がっている。
真のSREにとって、インフラは「宣言した状態へ常に収束し続ける自律的なシステム」であるべきだ。今回は、Chef Infra Clientを堅牢に自動実行し、構成管理の「ドリフト」を撲滅する、現場で震えるほど役立つ知見を叩き込む。
—
1. 構成管理における「ドリフト(Drift)」という癌
構成管理の最大の敵は、手動のパッチ適用や「ちょっとした設定変更」によるドリフトだ。
- なぜドリフトは起きるのか?:人間がシステムに直接ログインするからだ。
- なぜChefで解決できないのか?:Chefが「常駐」または「定期実行」されておらず、最後に適用された状態が保証されていないからだ。
ドリフトを放置すれば、本番環境の再現性は失われ、障害対応はカオスと化す。Chefによる構成管理の目的は「冪等性の担保」以前に、「設定の強制執行」にあると心得よ。
—
2. 実装のベストプラクティス:systemdタイマーへの移行
かつてはcronが標準だったが、現代のLinux環境において、cronは「ログ管理」や「依存関係の制御」が弱すぎる。systemdタイマーこそが、モダンなChef自動実行の最適解だ。
なぜsystemdタイマーか?
- 実行の依存関係: `network-online.target` などをトリガーにできる。
- ログ管理: `journald` との親和性が高く、エラー時の追跡が容易。
- 実行の孤立化: サービスとして管理するため、プロセス監視ツール(Monit等)との連携が容易。
推奨するsystemd設定(ユニットファイル)
`/etc/systemd/system/chef-client.timer`
[Unit]
Description=Run chef-client periodically
[Timer]
起動から5分後に初回の実行を行い、以降は30分おきに実行
OnBootSec=5min
OnUnitActiveSec=30min
実行が重なった場合でも、ドリフトを確実に叩くために精度を維持
AccuracySec=1min
[Install]
WantedBy=timers.target
—
3. 実行失敗時のアラート通知とログの自動化
実行が失敗したことに気づかない運用ほど恐ろしいものはない。Chefクライアントの終了コードを監視し、即座にSlackやPagerDutyへ飛ばす仕組みを組み込む。
神のテクニック:`chef-client` のラッパーシェルスクリプト
単にコマンドを叩くのではなく、必ずラップしてエラーハンドリングを行うこと。
!/bin/bash
/usr/local/bin/chef-wrapper.sh
LOG_FILE=”/var/log/chef/client.log”
冪等性を担保した実行。Splay(実行タイミングの分散)を設定し、C10k問題を回避
chef-client –splay 300 –interval 1800 >> $LOG_FILE 2>&1
if [ $? -ne 0 ]; then
# 失敗時にメタデータを付与して通知(WebHook等を利用)
curl -X POST -H ‘Content-type: application/json’ \
–data ‘{“text”:”[ALERT] Chef run failed on ‘$(hostname)'”}’ $SLACK_WEBHOOK_URL
exit 1
fi
—
4. チームの生産性を底上げする「隠れた知見」
開発スピードを加速させるキーボードショートカット (IntelliJ/VSCode)
Chef Cookbooksを開発する際、以下の設定は必須だ。
- RuboCop/Foodcriticの自動実行: ファイル保存時にLintが走る設定を必ず入れろ。コードレビューでスタイルを指摘する時間は無駄だ。
- 定義元へのジャンプ: `knife search` や `knife node show` をIDEの統合ターミナルでショートカット登録せよ。
チーム開発で役立つ「設定の共有化」
`.chef/knife.rb` を各々が持つのはナンセンスだ。
- レポジトリルートの `.chef/` にテンプレートを配置し、環境変数を活用せよ。
- `knife.rb` 内で `ENV[‘CHEF_USER’]` を参照するようにすれば、誰が実行しても共通の認証情報で接続できる。
—
5. 最後に:インフラを「コード」として愛せ
Chefは単なる設定ツールではない。インフラの現在の姿を定義する「真実のソース」だ。
1. 定期実行を信じろ: 30分に一度、Chefが自動で「あるべき姿」に戻してくれる安心感が、エンジニアのメンタルを救う。
2. ログを監視せよ: `chef-client` が失敗した時、それはシステムが「あるべき姿」から乖離したという緊急事態だ。
3. 手動変更を禁止せよ: サーバーにログインして `vim` を開く指を止めろ。その変更はすべてレシピに書き込み、Chefに適用させるのだ。
これができれば、君の管理するサーバーはドリフトから解放され、真の意味で「自動化」される。さあ、今すぐcronのゴミを掃除し、モダンなsystemdタイマーへ乗り換えろ。
現場からは以上だ。健闘を祈る。