Ansibleのコールバックプラグインを使ってみる

Ansible にはコールバックプラグインというのがあり、プレイブックの実行終了や異常終了などの各種イベントをフックして特別な処理を仕掛けることができる。

なかなか便利な機能だと思うけど、ポインター的なドキュメントしか存在せず、自分でコールバックプラグインを作りたければ、既存のプラグインのコード読めみたいな書き方しかされていない。

プレイブックを実行し、hipchat コールバックプラグインでチャットループに実行結果を通知するところまでをメモ。

ping するだけのプレイブックの作成

まずは Ansible プレイブックの作成。
localhost に対して ping を実行するだけのプレイブックを作成する。

hosts ファイル

プロビジョン対象。
今回はローカルホストに対して実行する。

$ cat hosts
localhost ansible_connection=local

ping するだけのプレイブック

ping モジュールを呼び出して、ターゲットに ping を実行する。

$ cat playbook-ping.yml
---
- hosts: all
  tasks:
    - name: ping
      ping:

プレイブックを実行

$ ansible-playbook -i hosts playbook-ping.yml

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [ping] ******************************************************************
ok: [localhost]

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

面白くもなんともないが、プレイブックは無事実行終了。

コールバックプラグイン連携

次に hipchat のコールバックプラグインと連携し、hipchat のチャットルームにプレイブックの実行結果を通知させる。

hipchat の API を取得

hipchat 管理画面から Group Admin -> API とたどり、API TOKEN を発行する。

hipchat-generate-api-token

Ansible のコールバック設定

設定ファイル ansible.cfg でコールバックプラグインの場所を指定する。

今回は /tmp/callback_plugins/ 以下とする。

$ cat ansible.cfg
[defaults]
callback_plugins = /tmp/callback_plugins/

ansible.cfg ファイルは

  1. ANSIBLE_CONFIG (an environment variable)
  2. ansible.cfg (in the current directory)
  3. .ansible.cfg (in the home directory)
  4. /etc/ansible/ansible.cfg

の順に検索される。
今回は2つ目の形式で、プレイブックと同じ場所におく。
詳細はドキュメントを参照のこと http://docs.ansible.com/intro_configuration.html

また hipchat プラグインは Python の prettytable モジュールに依存しているのでインストールする。

$ sudo pip install prettytable

コールバックプラグインをインストール

コールバックプラグインはソースコードの plugins/callbacks 以下にある。

https://github.com/ansible/ansible/tree/devel/plugins/callbacks

今回は hipchat 連携をするのでファイル群を git clone するなどして hipchat.pyansible.cfg ファイルの callback_plugins で指定したパス /tmp/callback_plugins/ 以下にコピーする。

hipchat 向け設定

hipchat プラグインでは以下を環境変数から指定するようになっている。

  • HIPCHAT_TOKEN (required): HipChat API token
  • HIPCHAT_ROOM (optional): HipChat room to post in. Default: ansible
  • HIPCHAT_FROM (optional): Name to post as. Default: ansible
  • HIPCHAT_NOTIFY (optional): Add notify flag to important messages (“true” or “false”). Default: true

特に HIPCHAT_TOKEN には先ほど取得した API TOKEN を指定する。

$ export HIPCHAT_TOKEN=******
$ export HIPCHAT_ROOM=deploy

注意点としては、hipchat の API の制限から、通知先のチャットルームは事前に作っておくこと。

hipchat 通知する

最後にプレイブックを実行して hipchat 通知する

$ ansible-playbook -i hosts playbook-ping.yml

hipchat-ping-playbook

 

画面のように無事通知された。

プラグインを作成

プラグインを自作するにはどうすればよいか?

リファレンスコード

Ansible は起動時にコールバックディレクトリ以下にある .py ファイルにある CallbackModule という名前のクラスをコールバックに登録している模様。
(ansible/lib/ansible/utils/plugins.py)

雛形となるファイルが ansible/lib/ansible/callback_plugins/noop.py にあるので、これをコピーするか、既存のプラグインをコピーすると良い。

フックイベント

上記リファランスファイルの CallbackModule クラスにはトリガーとなるイベントが def playbook_on_start(self): というようにずらっと定義されている。
めぼしいドキュメントがないので、呼び出し元を探すか、名前からあたりをつけながら、ごにょごにょいじっていけば、それっぽいプラグインができる(ハズ)。

Leave a comment