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 を発行する。
Ansible のコールバック設定
設定ファイル ansible.cfg
でコールバックプラグインの場所を指定する。
今回は /tmp/callback_plugins/ 以下とする。
$ cat ansible.cfg [defaults] callback_plugins = /tmp/callback_plugins/
ansible.cfg
ファイルは
ANSIBLE_CONFIG
(an environment variable)ansible.cfg
(in the current directory).ansible.cfg
(in the home directory)/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.py
を ansible.cfg
ファイルの callback_plugins
で指定したパス /tmp/callback_plugins/
以下にコピーする。
hipchat 向け設定
hipchat プラグインでは以下を環境変数から指定するようになっている。
HIPCHAT_TOKEN
(required): HipChat API tokenHIPCHAT_ROOM
(optional): HipChat room to post in. Default: ansibleHIPCHAT_FROM
(optional): Name to post as. Default: ansibleHIPCHAT_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
画面のように無事通知された。
プラグインを作成
プラグインを自作するにはどうすればよいか?
リファレンスコード
Ansible は起動時にコールバックディレクトリ以下にある .py ファイルにある CallbackModule
という名前のクラスをコールバックに登録している模様。
(ansible/lib/ansible/utils/plugins.py
)
雛形となるファイルが ansible/lib/ansible/callback_plugins/noop.py
にあるので、これをコピーするか、既存のプラグインをコピーすると良い。
フックイベント
上記リファランスファイルの CallbackModule
クラスにはトリガーとなるイベントが def playbook_on_start(self):
というようにずらっと定義されている。
めぼしいドキュメントがないので、呼び出し元を探すか、名前からあたりをつけながら、ごにょごにょいじっていけば、それっぽいプラグインができる(ハズ)。