0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ansible 自作コールバックプラグイン開発ガイド

Posted at

1. コールバックプラグインの位置づけ

コールバックプラグインとは、Playbook 実行中に発生する「イベント」にフックして、独自の挙動を追加できる仕組みです。(Ansible ドキュメント)

  • 何ができるか: 画面出力のカスタマイズ、実行ログの外部 DB 保存、Slack/Teams への通知、実行時間の詳細レポート作成など。
  • 仕組み: CallbackBase クラスを継承した CallbackModule クラスを定義し、v2_ で始まるメソッド(フック)をオーバーライドします。(Ansible ドキュメント)

2. stdout_callback と callbacks_enabled の違い

ここが最も混乱しやすいポイントです。役割を「メイン出力」か「追加機能」かで使い分けます。(Ansible Documentation)

設定項目 役割 指定数 主な用途
stdout_callback 画面表示の主役 1つのみ 標準出力を JSON 化する、1行にまとめるなど。
callbacks_enabled 裏方の追加機能 複数可能 実行時間の計測(timer)、ログ収集、外部通知など。

重要な落とし穴

  • stdout を変えたい場合: プラグイン内で CALLBACK_TYPE = 'stdout' と宣言し、stdout_callback で 1 つ選ぶ必要があります。(Ansible Documentation)
  • 追加機能(通知など)の場合: CALLBACK_TYPE = 'notification' とし、callbacks_enabled にリストアップします。notification 系を stdout_callback に書いても “主役” にはなれません。
  • 互換性: callbacks_enabled は比較的新しい呼び名で、古いドキュメントでは callback_whitelist と表記されています(概念は同じです)。(Ansible Documentation)

3. 配置場所(どこに置けば Ansible が見つけるか)

A) プロジェクトローカル(開発・テストに最適)

Playbook と同じ階層に callback_plugins/ ディレクトリを作成し、その中に .py ファイルを置きます。(Ansible ドキュメント)

  • または ansible.cfgcallback_plugins(検索パス)に追加して管理します。

B) Collection 内(再利用・配布向き)

collections/ansible_collections/<namespace>/<collection>/plugins/callback/<plugin>.py

  • FQCN(Fully Qualified Collection Name) で参照できるため、組織内での共有や CI 配布に非常に強いです。(Ansible ドキュメント)

4. 最小実装テンプレート(コピペ用)

以下は、イベントを受けて標準出力に情報を表示する最小限の骨格です。

# plugins/callback/my_callback.py
from __future__ import annotations
from ansible.plugins.callback import CallbackBase

DOCUMENTATION = r"""
name: my_callback
type: notification
short_description: イベントを標準出力に表示するサンプル
description:
  - タスクの開始や結果を独自フォーマットで表示します。
options: {}
"""

class CallbackModule(CallbackBase):
    CALLBACK_VERSION = 2.0
    CALLBACK_NAME = "my_callback"
    CALLBACK_TYPE = "notification"  # 画面表示を完全に入れ替えるなら "stdout"

    def v2_playbook_on_start(self, playbook):
        # self._display.display を使うのが推奨です(stdout管理との整合性のため)
        self._display.display("--- [my_callback] Playbook Execution Started ---")

    def v2_runner_on_ok(self, result):
        host = result._host.get_name()
        task_name = result._task.get_name()
        self._display.display(f"[SUCCESS] {host} : {task_name}")

    def v2_runner_on_failed(self, result, ignore_errors=False):
        host = result._host.get_name()
        msg = result._result.get('msg', 'No error message')
        self._display.display(f"[FAILED] {host} : {msg}")

    def v2_playbook_on_stats(self, stats):
        self._display.display("--- [my_callback] Playbook Finished ---")

5. 有効化(ansible.cfg の設定要点)

3.1 追加コールバック(stdout 以外)を有効化

近年のドキュメントでは callbacks_enabled を使います。(Ansible ドキュメント)

[defaults]
# (推奨) 追加で有効化する callback
callbacks_enabled = timer, my_namespace.my_collection.my_callback

# (旧来の設定) callback_whitelist = timer, ...

3.2 stdout を置き換える(見た目を変える系)

stdout_callback で 1 つだけ指定します。(Ansible ドキュメント)

[defaults]
stdout_callback = my_callback

6. 実装時のチェックリスト(事故防止)

  1. PII/秘密情報の保護
    result._result にはタスクの戻り値がすべて含まれます。no_log: true が設定されているタスクの情報を誤ってログへ出さないよう注意が必要です。
  2. パフォーマンスへの影響
    大量の出力や重い外部通知は実行速度に直結します。必要なら v2_playbook_on_stats で最後にまとめて集計して出力します。
  3. 例外処理
    コールバック自体の障害で Ansible 本体を停止させないよう、最低限のエラーハンドリングを検討してください。
  4. 暗黙タスクの取得
    meta タスクなども取得したい場合は、__init__self.wants_implicit_tasks = True を設定します。(Ansible ドキュメント)

7. さらに詳しく知るために

最も確実な一次情報は、Ansible 本体のソースコード(lib/ansible/plugins/callback)を参照することです。(Ansible ドキュメント)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?