【実務・中級編】Chef Infra Clientの自動実行を設定する!cron・systemdを使った定期的な状態適用のベストプラクティス – インフラ構成管理(IaC)活用バイブル

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タイマーへ乗り換えろ。

現場からは以上だ。健闘を祈る。

タイトルとURLをコピーしました