てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] null コールバックプラグインをためしてみた

はじめに:コールバックプラグインとは

Ansible には コールバックプラグインという仕組みがあり、たとえば json コールバックプラグインを利用すると、ansible-playbook 実行結果の表示は JSON に変更できます。

Ansible 2.5 から null コールバックプラグインが追加されました。 使い所はあまりないかも知れませんが、一応試してみます。(Ansible 2.7.1 で確認)

準備

  • Playbook: test.yml
- host: localhost
  gather_facts: no

  tasks:
    - name: debug
      debug: "Hello"
  • 設定ファイル: ansible.cfg
[defaults]
stdout_callback = null

設定ファイルの代わりに、環境変数 ANSIBLE_STDOUT_CALLBACK でも設定可能です。

export ANSIBLE_STDOUT_CALLBACK=null

設定方法の詳細は Ansible Configuration Settings をご参照ください。

実行1: 正常時

$ ansible-playbook -i localhost, nulltest.yml
$

本当に何も表示されませんでした。

なお、特にコールバックプラグインを指定しない場合は、以下のようなログになります。

$ ansible-playbook -i localhost, nulltest.yml

PLAY [localhost] *************************************************************************************

TASK [debug] *****************************************************************************************
ok: [localhost] => {
    "msg": "Hello"
}

PLAY RECAP *******************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0
$

実行2: YAMLシンタックスエラー

設定したのはあくまで標準出力に対するコールバックプラグインなので、エラーは通常通り出力されます。 YAMLシンタックスエラーの場合は以下のようになりました。

$ ansible-playbook -i localhost, nulltest.yml
ERROR! Syntax Error while loading YAML.
  expected <block end>, but found '?'

The error appears to have been in '/vagrant/nulltest.yml': line 7, column 5, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

      debug:
    msg: "Hello"
    ^ here

$ 

実行3: yum モジュールでのエラー

今度は yum モジュールの name オプションで、存在しないパッケージ名をした場合です。 以下のように、微妙な出力となりました。

$ ansible-playbook -i localhost, nulltest.yml
        to retry, use: --limit @/vagrant/nulltest.c
$

※補足 retry_files_enabled をデフォルトのまま (True) にしているため、エラーが発生したホストに対するリトライファイルが生成されます。

まとめ

標準出力にnull コールバックプラグインを利用すると、正常時は何も表示さないことが確認できました。 何らかの出力を抑制したい場合、シェルレベルで抑制してもよいですが、Ansible の場合はこんな選択肢もあるとだけ覚えておくことにします。