てくなべ (tekunabe)

ansible / network / automation / StackStorm

[Ansible] 実行ログで全タスク中の何タスク目なのかを表示する counter_enabled コールバックプラグインを検証する

■ はじめに

ansible-playbook コマンドを実行中、流れる実行ログを眺めながら「あとどのくらいのタスクが残っているんだろう?」と考えたことはありませんでしょうか。

counter_enabled というコールバックプラグインを利用すると、全タスク中の何タスク目なのかが分かるようになります。

f:id:akira6592:20190829090543p:plain
カウンター表示

ansible.cfg では以下のように設定します。

[defaults]
stdout_callback = counter_enabled

環境変数でも設定できます。

export ANSIBLE_STDOUT_CALLBACK=counter_enabled

この記事では、counter_enabled コールバックプラグインを検証した結果をまとめます。(ちょっとした注意点もあります)

  • 動作確認環境: Ansible 2.8.4


■ 検証

設定の変更(stdout_callback = counter_enabled)

ansible.cfgcounter_enabled コールバックプラグインを利用するように変更します。

[defaults]
stdout_callback = counter_enabled

デフォルトから設定が変更されたことを確認します。

$ ansible-config dump --only-changed
DEFAULT_STDOUT_CALLBACK(/Users/ansible/ansible.cfg) = counter_enabled
$ 

使用する Playbook

以下の Playbook で検証します。ループも仕込んでみます。

  • counter_test.yml
- hosts: localhost
  gather_facts: no
  connection: local

  tasks:
    - name: task1
      debug:
        msg: Hello, Kingyo 1.

    - name: task2
      debug:
        msg: "Hello, {{ item }}"
      loop:
        - Kingyo2-1
        - Kingyo2-2
        - Kingyo2-3

    - name: task3
      debug:
        msg: Hello, Kingyo 3.

Playbook 実行

それでは、 Playbook を実行します。

$ ansible-playbook -i localhost, counter_test.yml 

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

TASK 1/3 [task1] **********************************************************************************
ok: 1/1 [localhost] => {
    "msg": "Hello, Kingyo 1."
}

TASK 2/3 [task2] **********************************************************************************

TASK 3/3 [task3] **********************************************************************************
ok: 1/1 [localhost] => {
    "msg": "Hello, Kingyo 3."
}

PLAY RECAP ****************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    rescued=0    ignored=0   

TASK 1/3TASK 2/3TASK 3/3 のように、全タスク中の何タスク目なのかが表示さました、

ところがループしたタスクの実行ログが表示されなくなってしまいました。 別のモジュールを利用して試した限り、ループ自体は実行されているようです。バグなのか仕様なのか、現在のところは不明です。それらしい issue はありませんでした。

デフォルトだと

比較のために、コールバックプラグインを指定しない場合の実行ログも掲載します。TASK 1/3TASK 2/3TASK 3/3 といった表示はありません。

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

TASK [task1] *****************************************************************************************************
ok: [localhost] => {
    "msg": "Hello, Kingyo 1."
}

TASK [task2] *****************************************************************************************************
ok: [localhost] => (item=Kingyo2-1) => {
    "msg": "Hello, Kingyo2-1"
}
ok: [localhost] => (item=Kingyo2-2) => {
    "msg": "Hello, Kingyo2-2"
}
ok: [localhost] => (item=Kingyo2-3) => {
    "msg": "Hello, Kingyo2-3"
}

TASK [task3] *****************************************************************************************************
ok: [localhost] => {
    "msg": "Hello, Kingyo 3."
}


■ まとめ

counter_enabled コールバックプラグインを利用して、Playbook の実行ログで全タスク中の何タスク目なのかが表示されることを確認しました。

ただ、私が試したPlaybook、環境(Ansible 2.8.4)では、ループするタスクの実行ログが表示されないという現象に出会いました。それらしい issue はありませんでした。

また、今回は検証していませんが、ロールと併用するととうまくカウントしてくれないといった現象もあるようです。 https://github.com/ansible/ansible/issues/53907

他にもimport_* include_* との併用時にもうまくカウントできるか気になります。(こちらも未検証)

カウントできることは便利だと思いますので、特性をおさえたうで、活用を検討してみてはいかがでしょうか。

参考

Ansible には他にも様々なコールバックプラグイン があります。ご自身にあったもの探してみてはいかがでしょうか。