てくなべ (tekunabe)

ansible / network / automation / StackStorm

ansible Ad-Hoc コマンドの callback plugin の指定時は bin_ansible_callbacks = True も必要

■ はじめに

Ansible には callback plugin という仕組みがあり、結果出力の形式を変更したりすることができます。

ansible-playbook コマンドでは、ansible.cfgstdout_callback の指定を、ansible コマンドではこれに加え bin_ansible_callbacks = True という指定が必要です。

この記事では、それぞれの例をご紹介します。


■ ansible-playbook コマンドの場合

例えば、 json という callback plugin を指定して ansible-playbook コマンド実行する例を見てみます。

設定ファイル(ansible.cfg)

stdout_callbackjson を指定します。

stdout_callback = json

なお、環境変数として設定する場合は export ANSIBLE_STDOUT_CALLBACK=json を実行します。

設定の確認

念のため ansible-config コマンドで設定を確認します。

[vagrant@centos7 vagrant]$ ansible-config dump | grep CALLBACK
DEFAULT_CALLBACK_PLUGIN_PATH(default) = [u'/home/vagrant/.ansible/plugins/callback', u'/usr/share/ansible/plugins/callback']
DEFAULT_CALLBACK_WHITELIST(default) = []
DEFAULT_LOAD_CALLBACK_PLUGINS(default) = False
DEFAULT_STDOUT_CALLBACK(/etc/ansible/ansible.cfg) = json    ← json になった

実行結果

ここでは junos_command モジュールで show version を実行する Playbook を実行します。

[vagrant@centos7 vagrant]$ ansible-playbook -i inventory junos_test.yml
{
    "plays": [
        {
            "play": {
                "id": "525400da-a710-c40b-4624-000000000008",
                "name": "junos"
            },
            "tasks": [
                {
                    "hosts": {
                        "172.16.0.1": {
                            "_ansible_no_log": false,
                            "_ansible_parsed": true,
                            "changed": false,
                            "invocation": {
                                (~略~)
                            },
                            "stdout": [
                                "Hostname: vsrx1\nModel: firefly-perimeter\nJUNOS Software Release [12.1X47-D15.4]"
                            ],
                            "stdout_lines": [
                                [
                                    "Hostname: vsrx1",
                                    "Model: firefly-perimeter",
                                    "JUNOS Software Release [12.1X47-D15.4]"
                                ]
                            ]
                        }
                    },
                    "task": {
                        "id": "525400da-a710-c40b-4624-00000000000a",
                        "name": "show version"
                    }
                }
            ]
        }
    ],
    "stats": {
        "172.16.0.1": {
            "changed": 0,
            "failures": 0,
            "ok": 1,
            "skipped": 0,
            "unreachable": 0
        }
    }
}

このように、JSON 形式で結果が出力されます。


■ ansible コマンドの場合

ansible コマンド(ad-hocコマンドとも呼ばれる) でも、callback plugin を指定する場合は、stdout_callback 以外にも bin_ansible_callbacks という設定も必要です。

設定ファイル(ansible.cfg)

stdout_callbackjson を指定するのに加え、 bin_ansible_callbacksTrue に指定します。

stdout_callback = json
bin_ansible_callbacks = True

なお、環境変数として設定する場合は export ANSIBLE_LOAD_CALLBACK_PLUGINS=True を実行します。

設定の確認

念のため ansible-config コマンドで設定を確認します。

[vagrant@centos7 vagrant]$ ansible-config dump | grep CALLBACK
DEFAULT_CALLBACK_PLUGIN_PATH(default) = [u'/home/vagrant/.ansible/plugins/callback', u'/usr/share/ansible/plugins/callback']
DEFAULT_CALLBACK_WHITELIST(default) = []
DEFAULT_LOAD_CALLBACK_PLUGINS(/etc/ansible/ansible.cfg) = True    ← True になった
DEFAULT_STDOUT_CALLBACK(/etc/ansible/ansible.cfg) = json

実行結果

ここでは junos_command モジュールで show version を実行する ansible コマンド を実行します。

[vagrant@centos7 vagrant]$ ansible -i 172.16.0.1, all -m junos_command -a "commands='show version'" -c netconf -u root
-k
SSH password:  (パスワードを入力)
{
    "plays": [
        {
            "play": {
                "id": "525400da-a710-ece8-5deb-000000000007",
                "name": "Ansible Ad-Hoc"
            },
            "tasks": [
                {
                    "hosts": {
                        "172.16.0.1": {
                            "_ansible_no_log": false,
                            "_ansible_parsed": true,
                            "changed": false,
                            "invocation": {
                                (~略~)
                            },
                            "stdout": [
                                "Hostname: vsrx1\nModel: firefly-perimeter\nJUNOS Software Release [12.1X47-D15.4]"
                            ],
                            "stdout_lines": [
                                [
                                    "Hostname: vsrx1",
                                    "Model: firefly-perimeter",
                                    "JUNOS Software Release [12.1X47-D15.4]"
                                ]
                            ]
                        }
                    },
                    "task": {
                        "id": "525400da-a710-ece8-5deb-000000000009",
                        "name": ""
                    }
                }
            ]
        }
    ],
    "stats": {
        "172.16.0.1": {
            "changed": 0,
            "failures": 0,
            "ok": 1,
            "skipped": 0,
            "unreachable": 0
        }
    }
}
[vagrant@centos7 vagrant]$

無事に ansible コマンドでも json 形式で出力できました。


■ まとめ

json callback plugin を利用する場合を例にまとめます。

ansible-playbook コマンド

  • ansible.cfg で設定する場合
[defaults]
stdout_callback = json
export ANSIBLE_STDOUT_CALLBACK=json

ansible コマンド

  • ansible.cfg で設定する場合
[defaults]
stdout_callback = json
bin_ansible_callbacks = True
export ANSIBLE_STDOUT_CALLBACK=json
export ANSIBLE_LOAD_CALLBACK_PLUGINS=True