AnsibleのCallback Pluginをためしてみよう

こんにちは、レッドハットでAnsibleのテクニカルサポートエンジニアをしている八木澤(ひよこ大佐)です。

Ansibleにはターゲットノードに対して操作を実行する際に利用するModule(モジュール)の他に、Plugin(プラグイン)という仕組みがあります。PluginにはBecome PluginやCallback Pluginなど、目的に応じていくつか種類がありますが、どのプラグインも主にAnsibleに対して追加機能を提供する目的で実装されています。

今回は、その中でも「Callback Plugin」に焦点を当てて解説していきます。

Callback Pluginとは

Ansibleでは、Playbookの実行時に「タスクがokになった」など、各種のイベントが発生します。Callback Pluginは、それらのイベントに基づいて出力などを整形する目的で主に利用されます。例を挙げれば「各タスクの実行にかかった時間を表示させたい」場合には「timer」が利用できますし、「タスクが失敗した際にメールを送信したい」という場合には「mail」が利用できます。

利用可能なプラグインの一覧については、以下のドキュメントを参照してください。

Callback Plugins — Ansible Documentation

実際に利用してみよう

Callback Pluginを有効化する

では試しに「timer」プラグインを有効化してみましょう。Ansibleのコントロールノードに接続し、「/etc/ansible/ansible.cfg」内の以下の行を編集します。

# enable callback plugins, they can output to stdout but cannot be 'stdout' type.
callback_whitelist = timer

Callback Pluginを有効化するには、「callback_whitelist」に有効化するプラグインを指定します。上記を編集して保存すると、次のansible-playbookコマンドの実行時から有効になります。

では早速実行してみましょう。

$ ansible-playbook -i hosts hello_world.yml 

PLAY [Hello World] ********************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************
ok: [localhost]

TASK [Say Hello] **********************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "Hello World!"
}

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

Playbook run took 0 days, 0 hours, 0 minutes, 1 seconds

このPlaybookはdebugモジュールで「Hello World!」と表示するだけのシンプルなものです。注目していただきたいのは「PLAY RECAP」の一番下の行です。

Playbook run took 0 days, 0 hours, 0 minutes, 1 seconds

上記のように、Playbookの実行にかかった時間が表示されます。このPlaybookは重たい処理ではないので1秒(!)で実行が完了していたことがわかります。

タスクごとにかかった時間を測定する(profile_tasks)

timerプラグインではPlaybook実行にかかった時間を確認できましたが、各タスクごとにかかった時間を確認したいケースもあると思います。その場合は、以下のように「profile_tasks」プラグインを有効化します。callback_whitelistには複数のCallback Pluginを指定することが可能ですので、timerモジュールと一緒に有効化してみましょう。

callback_whitelist = timer, profile_tasks

では、さきほどのPlaybookで実際の出力を確認してみましょう。

$ ansible-playbook -i hosts hello_world.yml 

PLAY [Hello World] ********************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************
Thursday 14 May 2020  12:40:40 +0900 (0:00:00.038)       0:00:00.038 ********** 
ok: [localhost]

TASK [Say Hello] **********************************************************************************************************************************************************
Thursday 14 May 2020  12:40:41 +0900 (0:00:01.231)       0:00:01.269 ********** 
ok: [localhost] => {
    "msg": "Hello World!"
}

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

Thursday 14 May 2020  12:40:41 +0900 (0:00:00.039)       0:00:01.309 ********** 
=============================================================================== 
Gathering Facts ---------------------------------------------------------------------------------------------------------------------------------------------------- 1.23s
Say Hello ---------------------------------------------------------------------------------------------------------------------------------------------------------- 0.04s
Playbook run took 0 days, 0 hours, 0 minutes, 1 seconds

出力が大幅に変化しました。各タスクに経過時間が表示され、PLAY RECAPの下部にも各タスクごとの経過時間が表示されています。その下には、さきほど有効化したtimerプラグインの出力が確認できますね。このサンプルではシンプルなPlaybookを利用しているのであまり確認する意味はないのですが、複雑なPlaybookを実行する際には、より効果を発揮します。

ご紹介したCallbackプラグインを活用することで、どのタスクの実行に時間がかかっているのかを特定することができますので、トラブルシューティングに大いに役立ちます。このように、出力を整形したりトラブルシューティングをする際にもCallback Pluginは活用できます。皆様もぜひ一度、お手元で試してみてください。

Happy Automation!

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。