■ はじめに
ansible-playbook コマンドを実行中、流れる実行ログを眺めながら「あとどのくらいのタスクが残っているんだろう?」と考えたことはありませんでしょうか。
counter_enabled というコールバックプラグインを利用すると、全タスク中の何タスク目なのかが分かるようになります。

ansible.cfg では以下のように設定します。
[defaults] stdout_callback = counter_enabled
環境変数でも設定できます。
export ANSIBLE_STDOUT_CALLBACK=counter_enabled
この記事では、counter_enabled コールバックプラグインを検証した結果をまとめます。(ちょっとした注意点もあります)
- 動作確認環境: Ansible 2.8.4
■ 検証
設定の変更(stdout_callback = counter_enabled)
ansible.cfg でcounter_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/3、TASK 2/3、TASK 3/3 のように、全タスク中の何タスク目なのかが表示さました、
ところがループしたタスクの実行ログが表示されなくなってしまいました。 別のモジュールを利用して試した限り、ループ自体は実行されているようです。バグなのか仕様なのか、現在のところは不明です。それらしい issue はありませんでした。
デフォルトだと
比較のために、コールバックプラグインを指定しない場合の実行ログも掲載します。TASK 1/3、TASK 2/3、TASK 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 には他にも様々なコールバックプラグイン があります。ご自身にあったもの探してみてはいかがでしょうか。