noharaのブログ

インフラエンジニアのブログ、ゆる~く

Ansibleの出力を弄る

公式情報 : Callback Plugins

以下のようなことができる

  1. 通常の出力に実行時間などの追加情報をいれる
  2. 通常の出力形式をjson等に変更する
  3. 自分でpluginを作ってやりたい放題する
  4. 出力をslackやmailに流す

以下、1, 2, 3を試す。

1. 通常の出力に実行時間などの追加情報をいれる

実行にかかった時間を出力してみる
ansible.cfgにcallback_whitelist = timerを追加
出力

~snip~
Playbook run took 0 days, 0 hours, 0 minutes, 4 seconds

2. 通常の出力形式をjson等に変更する

出力形式をjsonに変更してみる
ansible.cfgにstdout_callback = jsonを追加 出力

~snip~
"stats": {
        "192.168.33.12": {
            "changed": 0,
            "failures": 0,
            "ok": 2,
            "skipped": 0,
            "unreachable": 0
        }
    }
}

3. 自分でpluginを作ってやりたい放題する

公式ページCallback Plugins を参考にcallback_pluginsというフォルダを作り、その中にpythonでコードを記述していきます。

書き方等はドキュメントを探すよりも実際のコードを見たほうが早いと思います。

今回は、playbookを実行時にplaybook名を出力してみます。

ansible.cftにcallback_whitelist = save2fileを追記の上、以下のファイルを作成する

callback_plugins/save2file.py

import os

from ansible.module_utils.urls import open_url
from ansible.plugins.callback import CallbackBase


class CallbackModule(CallbackBase):
    CALLBACK_VERSION = 2.0
    CALLBACK_TYPE = 'notification'
    CALLBACK_NAME = 'save2file'
    CALLBACK_NEEDS_WHITELIST = True

    def __init__(self, display=None):

        super(CallbackModule, self).__init__(display=display)

        self.playbook_name = None

    def v2_playbook_on_start(self, playbook):
        self.playbook_name = os.path.basename(playbook._file_name)
        print(self.playbook_name)

出力

host1.yml  ← playbook名

PLAY [host1] *******************************************************************

TASK [Gathering Facts] *********************************************************
~snip~

期待通りの出力になっています。
v2_playbook_on_startのほかにも関数はあるので既存のコードを参考にいろいろ試してみると面白いかもしれません。