ansible-playbook の実行結果を JSON で出力

stdout_callbackを設定して、ansible-playbookの実行結果を変更します。 ここでは、JSON形式で出力してみます。


環境

# cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core)

# ansible --version
ansible 2.2.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

ansible.cfg の設定

[defaults]
stdout_callback = json
retry_files_enabled = false

stdout_callback = json とすることで、callback プラグインである ansible/plugins/callback/json.py を利用します。

retry_files_enabled = false は以下のエラーを出力させないために設定しています。

        to retry, use: --limit @/path/to/sample.retry

ansible.cfg の読み込み順序

以下の順番で設定が読み込まれます。最初に存在する設定が有効で、以降の設定ファイルは無視されます。

  1. ANSIBLE_CONFIG(環境変数) で指定
  2. ./ansible.cfg
  3. ~/ansible.cfg
  4. /etc/ansible/ansible.cfg

JSON Output

playbook
- hosts: all
  gather_facts: no
  tasks:
    - ping:
ansible-playbook 実行例
# ANSIBLE_CONFIG=/path/to/sample.cfg  \
    ansible-playbook -i localhost, -c local sample.yml
{
    "plays": [
        {
            "play": {
                "id": "c241782a-b82e-4947-8c54-2d868aa1e017", 
                "name": "all"
            }, 
            "tasks": [
                {
                    "hosts": {
                        "localhost": {
                            "_ansible_no_log": false, 
                            "_ansible_parsed": true, 
                            "changed": false, 
                            "invocation": {
                                "module_args": {
                                    "data": null
                                }, 
                                "module_name": "ping"
                            }, 
                            "ping": "pong"
                        }
                    }, 
                    "task": {
                        "id": "cb8138b1-4c33-49f4-bedb-a2b5e96076cd", 
                        "name": ""
                    }
                }
            ]
        }
    ], 
    "stats": {
        "localhost": {
            "changed": 0, 
            "failures": 0, 
            "ok": 1, 
            "skipped": 0, 
            "unreachable": 0
        }
    }
}

jqコマンドを利用して実行結果のサマリを抽出してみる

playbook
- hosts: all
  gather_facts: no
  tasks:
    - ping:
    - fail: msg="failed"
ansible-playbook 実行例
# ANSIBLE_CONFIG=/path/to/sample.cfg  \
    ansible-playbook -i localhost, -c local sample.yml \
    | jq ".stats"
{
  "localhost": {
    "changed": 0,
    "failures": 1,
    "ok": 1,
    "skipped": 0,
    "unreachable": 0
  }
}

ansible.cfg の無効化

一時的にansible.cfgを無効にしたい場合は、ANSIBLE_CONFIG=/dev/null の様に指定して実行することでカレントディレクトリや${HOME}の設定ファイルが無視されます。 この時、存在しないファイルを指定すると、その指定自体が無効になります。