こんにちは、レッドハットで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!