こんにちは。インフラの深淵を覗き込み、自動化の美学を追求するSREエンジニアです。
今回は、Chefという「構成管理の老舗」を使いこなし、インフラを常に理想の状態に保つための「心臓部」、つまりChef Infra Clientの自動実行について語りましょう。
「Chefを書く」だけでは不十分です。書いたコードが自動で適用され、環境が常に守られている状態こそが、エンジニアを解放するのです。さあ、深淵へ足を踏み入れましょう。
—
1. 構成管理における「ドリフト(Drift)」問題とは
あなたは朝、完璧に設定したサーバーが、夕方には誰かの手動変更や、予期せぬアップデートによって「別の姿」になっている経験はありませんか?
この、「本来あるべき姿(Desired State)」と「現在の姿(Actual State)」の乖離を「ドリフト(Drift)」と呼びます。
ドリフトを放置すると、障害発生時に原因の切り分けが困難になり、最悪の場合、環境の再現ができなくなります。「IaC(Infrastructure as Code)を書いたのに、なぜか動かない」――その原因の9割は、このドリフトです。これを防ぐ唯一の解は、「Chefが常に、定期的に、自動でサーバーを監視し、修正し続けること」に他なりません。
—
2. cronを使った定期的なChefクライアント実行の実装方法
まずは古典的かつ確実な手法、`cron`による定期実行です。シンプルで導入障壁が低いのが魅力です。
実装例:
`/etc/cron.d/chef-client` ファイルを作成します。
30分おきにChefを実行し、ログをローテートしつつ残す
サーバー台数が多い場合、実行時間を分散させるのがコツです
/30 root /usr/bin/chef-client -L /var/log/chef/client.log -c /etc/chef/client.rb
- ポイント: `chef-client`は冪等性(何度実行しても同じ結果になること)を担保しています。そのため、cronで頻繁に回しても、変更が必要なときだけリソースが更新されます。これがChefの強みです。
—
3. systemdタイマーを活用したモダンなスケジュール実行
現代のLinuxサーバーでは、`cron`よりも`systemd`のタイマー機能を使うのが「SREの嗜み」です。なぜなら、プロセスの監視や依存関係の制御、そして実行ログの管理においてsystemdの方がはるかに柔軟だからです。
実装ステップ:
1. Serviceユニットの作成 (`/etc/systemd/system/chef-client.service`)
[Unit]
Description=Chef Infra Client
After=network.target
[Service]
ExecStart=/usr/bin/chef-client -c /etc/chef/client.rb
実行中のプロセスを適切に管理します
2. Timerユニットの作成 (`/etc/systemd/system/chef-client.timer`)
[Unit]
Description=Run Chef Infra Client periodically
[Timer]
起動後1分で開始し、その後30分おきに実行
OnBootSec=1min
OnUnitActiveSec=30min
AccuracySec=1min
[Install]
WantedBy=timers.target
3. 有効化
systemctl daemon-reload
systemctl enable –now chef-client.timer
systemdを使うことで、Chefの実行を「システムの一部」として管理できます。これにより、ログも`journalctl`で一元管理可能になり、運用負荷が激減します。
—
4. 実行失敗時のアラート通知とログ管理の自動化
自動実行の最大の弱点は「失敗したことに気づけないこと」です。Chefがエラーを吐いて停止したまま、数ヶ月が経過する……そんな悲劇は絶対にいけません。
極限のTips:
実行結果をハンドラ(Chef Handler)で検知し、SlackやPagerDutyに通知する設定を入れましょう。
`client.rb` に以下を追記するだけで、失敗を即座にキャッチできます。
/etc/chef/client.rb への追記例
require ‘chef/handler/error_report’
失敗時にSlackへ通知を送るハンドラをロードする
(chef-handler-slackなどのGemを事前にインストールしておく必要があります)
exception_handlers << Chef::Handler::Slack.new(webhook_url: '...')
さらに、ログ管理には `logrotate` を組み合わせるのが定石です。
/etc/logrotate.d/chef-client
/var/log/chef/client.log {
weekly
rotate 4
compress
missingok
}
---
最後に:あなたへのアドバイス
Chefの自動実行を導入した瞬間、サーバーは「生き物」から「管理された資産」へと進化します。
最初は「cronで回す」という単純な一歩からで構いません。しかし、その先に「ドリフトを許さない強固な基盤」があることを忘れないでください。これをマスターすれば、毎日の手動作業から解放され、あなたはもっとクリエイティブな設計業務に没頭できるようになります。
インフラをコードで支配する喜び、ぜひ体感してください。何か行き詰まったら、またいつでも聞きに来てくださいね。応援しています。