Ansibleの実行結果を通知する
Ansibleのコールバックプラグインを使って、プロビジョニングの実行結果を通知する方法をメモしておきます。
コールバックプラグインについては、公式ドキュメントに概要とサンプルが載っていますので参照してください。
Developing Plugins #Callbacks – Ansible
ここでは、Mac OS Xの通知センター (Notification Center) にAnsibleの実行結果を表示させることを目標とします。
今回作成したプラグインは、以下よりダウンロードできます。
Ansible Callback Plugins – GitHub
環境
環境は以下の通りです。
Ansibleに関しては、Homebrewを利用してインストールしています。詳しくは以下を参考にしてください。
HomebrewとAnsibleでMacの開発環境構築を自動化する
ソフトウェア | バージョン |
---|---|
Mac OS X | 10.10.3 |
Ansible | 1.9.1 |
Ansibleのコールバックプラグインを使って実行結果を通知する
Ansibleには様々なプラグイン機構が備わっています。
Developing Plugins – Ansible
その内のコールバックプラグインを使って、実行結果を通知する方法について見ていきます。
Developing Plugins #Callbacks – Ansible
コールバックプラグインの仕組みは非常に簡単です。以下に CallbackModule Classのテンプレートを示します。実行したいタイミングに合わせて処理を実装しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | class CallbackModule(object): def __init__(self): """ constructor """ def on_any(self, *args, **kwargs): pass def runner_on_failed(self, host, res, ignore_errors=False): pass def runner_on_ok(self, host, res): pass def runner_on_skipped(self, host, item=None): pass def runner_on_unreachable(self, host, res): pass def runner_on_no_hosts(self): pass def runner_on_async_poll(self, host, res, jid, clock): pass def runner_on_async_ok(self, host, res, jid): pass def runner_on_async_failed(self, host, res, jid): pass def playbook_on_start(self): pass def playbook_on_notify(self, host, handler): pass def playbook_on_no_hosts_matched(self): pass def playbook_on_no_hosts_remaining(self): pass def playbook_on_task_start(self, name, is_conditional): pass def playbook_on_vars_prompt(self, varname, private=True, prompt=None, encrypt=None, confirm=False, salt_size=None, salt=None, default=None): pass def playbook_on_setup(self): pass def playbook_on_import_for_host(self, host, imported_file): pass def playbook_on_not_import_for_host(self, host, missing_file): pass def playbook_on_play_start(self, name): pass def playbook_on_stats(self, stats): pass |
今回は、完了後に実行結果を通知させたいので playbook_on_statsメソッドを実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import subprocess class CallbackModule(object): # 中略 def playbook_on_stats(self, stats): hosts = sorted(stats.processed.keys()) for host in hosts: summary = stats.summarize(host) status = "Provisioning succeeded!" if summary['failures'] > 0 or summary['unreachable'] > 0: status = "Provisioning failed!" cmd = "osascript -e 'display notification \"%s %s\" with title \"%s\"'" cmd = cmd % (host, summary, status) subprocess.call(cmd, shell=True) |
以上で実装は完了です。あとは playbookと同じ階層に callback_pluginsディレクトリを作成し、その中にファイルを設置するだけです。
Playbookを実行してみましょう。実行結果に応じて、通知が表示されるはずです。
Ansibleの実行結果を喋らせる
画面への通知だけでは気づかないかもしれません。それでは実行結果を喋らせましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import subprocess class CallbackModule(object): # 中略 def playbook_on_stats(self, stats): hosts = sorted(stats.processed.keys()) for host in hosts: summary = stats.summarize(host) status = "Provisioning succeeded!" voice = "-v Zarvox" if summary['failures'] > 0 or summary['unreachable'] > 0: status = "Provisioning failed!" voice = "-v Hysterical ha ha ha, " cmd = "osascript -e 'display notification \"%s %s\" with title \"%s\"'" cmd = cmd % (host, summary, status) subprocess.call(cmd, shell=True) subprocess.call("say %s %s" % (voice, status), shell=True) |
Macの sayコマンドを利用しています。
成功した場合は、メカニカルな感じで成功を祝福してくれます。自動化バンサイ!
失敗した場合は、「プギャーwwwプロビジョニング失敗だっておwwww」みたいなノリでバカにされることでしょう。
おふざけが許されないような環境の方は、 voice = "-v Alex"あたりにしておけば無難だと思います。
とりあえず声だけでも聞いてみたい人は、Macのターミナルで以下のコマンドを実行してみてください。
1 2 3 4 5 6 | # 成功時 say -v Zarvox Provisioning succeeded! # 失敗時 say -v Hysterical ha ha ha, Provisioning failed! # 他にどんな声の種類があるのかを知る say -v ? |
Ansibleの実行結果を歌わせる
プロビジョニングの成功や失敗をもっと華やかに演出したい?それなら歌わせましょう。
1 2 3 4 5 6 7 8 9 | # 成功時 say -v good la la la la la la la la la la la # 失敗時 say -v bad di di di di di di di di di di di # 成功時ロングバージョン say -v good la la la la la la la la la la la la la la la la la la la la la la # 失敗時ロングバージョン say -v bad di di di di di di di di di di di di di di di di di di di di di di |
話がだいぶ横道にそれてきました。そろそろ終わりにしたいと思います。
さて、今回紹介したMacの sayコマンドを利用したプラグインですが、実はAnsibleの公式リポジトリにも準備されているものなんです。そんな遊び心のあるAnsibleが大好きです。他にもサンプルがいくつかありますので、ぜひ参考にしてみてください。
ansible/plugins/callbacks – GitHub
最後になりましたがお知らせです。来る2015年06月19日(金)に福岡でAnsibleの勉強会があります。私は主催ではありませんが参加します。興味のある方はぜひお越しください。
Ansible勉強会@福岡 InnoLab#1
以上です。