こんにちは。現場の最前線でインフラを「コード」として飼い慣らしているエンジニアです。
Ansibleを使い始めると、誰もが一度はこう思うはずです。「Playbookを実行するたびに、わざわざターミナルに張り付いて結果を監視するの、時間の無駄じゃないか?」と。
大規模なデプロイになればなるほど、実行時間は数十分、時には数時間かかることもあります。その間、SlackやTeamsに「今どうなったか」が自動で流れてきたら、どれほど心強いか。
今日は、Ansibleの「Callback Plugin」という深淵に触れ、あなたのインフラ運用を「監視される側」から「自律的に報告する側」へ進化させる技術を伝授します。
—
1. Ansible Callback Pluginとは何か?
一言で言えば、「Ansibleのイベントをフックして、任意の処理を差し込むプラグイン」です。
AnsibleはPlaybookを実行中、タスクの開始、失敗、成功といった無数の「イベント」を発生させています。Callback Pluginは、これらのイベントを検知し、外部APIを叩いたり、ログを整形したりする機能を持ちます。
これを使えば、`ansible-playbook` コマンドを打った瞬間から、裏側でチームのSlackチャンネルにリアルタイムで進捗が通知される仕組みが作れます。
—
2. 最短で実装する:Slack通知プラグインのセットアップ
まずは、最も利用頻度が高い「Slackへの通知」を例に解説します。
手順①:ディレクトリ構成を整える
Ansibleは、プロジェクトディレクトリ内の `callback_plugins` フォルダを自動的に認識します。
.
├── ansible.cfg # 設定ファイル
├── site.yml # 実行するPlaybook
└── callback_plugins/ # ここにプラグインを置く
└── slack_notifier.py # 自作プラグイン
手順②:プラグインコードを書く
以下のコードを `callback_plugins/slack_notifier.py` として保存してください。これは、タスクが失敗したときだけSlackに通知を送るシンプルなスクリプトです。
import json
import requests
from ansible.plugins.callback import CallbackBase
class CallbackModule(CallbackBase):
CALLBACK_VERSION = 2.0
CALLBACK_TYPE = ‘notification’
CALLBACK_NAME = ‘slack_notifier’
def __init__(self):
super(CallbackModule, self).__init__()
# SlackのWebhook URLをここに記述(環境変数から読み込むのがベスト)
self.webhook_url = “https://hooks.slack.com/services/YOUR/WEBHOOK/URL”
def v2_runner_on_failed(self, result, ignore_errors=False):
“””タスクが失敗したときに発火するメソッド”””
task_name = result._task.get_name()
host = result._host.get_name()
msg = f”❌ Error on {host}: {task_name}”
# Slackへ通知
requests.post(self.webhook_url, json={“text”: msg})
def v2_playbook_on_stats(self, stats):
“””Playbook終了時にサマリーを報告”””
# ここに成功/失敗の集計処理を書くとさらに便利になります
pass
—
3. 設定ファイルの有効化(ここが重要!)
プラグインを置いただけでは動きません。`ansible.cfg` に以下の記述を追記し、Ansibleに「このプラグインを使っていいよ」と教える必要があります。
[defaults]
プラグインのパスを指定
callback_plugins = ./callback_plugins
読み込むプラグインを有効化
stdout_callback = default
callback_enabled = slack_notifier
—
4. 動作確認:HelloWorldを飛ばす
わざと失敗するPlaybookを作って、Slackに通知が飛ぶか確認しましょう。
test.yml:
- hosts: localhost
tasks:
- name: 失敗するタスクのテスト
command: /bin/false # わざと失敗させる
実行してみます:
ansible-playbook test.yml
ターミナルでエラーが出ると同時に、Slackに「❌ Error on localhost: 失敗するタスクのテスト」という通知が届いたはずです。これが確認できれば、あなたはもうAnsibleの自動化の第一歩をクリアしました。
—
5. 先輩からのアドバイス:運用を楽にするための極意
この技術をマスターすると、さらに次のステップが見えてきます。
1. 環境変数の活用: Webhook URLをコードに直書きするのは絶対にNGです。`export SLACK_WEBHOOK_URL=…` のように環境変数から読み込むように設計してください。
2. 成功時は通知しない: 成功通知を全てSlackに流すと「通知疲れ」を起こして、本当に重要な失敗を見落とします。「失敗した時だけ」に絞るのが、運用のプロの流儀です。
3. チームの文化を作る: この仕組みを入れると、チームメンバーが「あ、あのデプロイ今コケたんだな」と瞬時に察知できるようになります。障害対応の初動速度が劇的に上がりますよ。
インフラは「自動化して終わり」ではありません。「いかに人間が楽をし、いかに見落としを防ぐか」という設計思想こそが、SREの本質です。
まずはこのCallback Pluginで、あなたのインフラを「おしゃべりなインフラ」に変えてみてください。日々の作業が驚くほど快適になることをお約束します。
何か詰まったら、いつでも聞いてくださいね。応援しています。