ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

DataDog に Ansible を連携させる ansible-datadog-callback の使い方

DataDogAnsible Integration が上手く動作しなくて頭を抱えました。

f:id:nekonenene:20170503232431p:plain

Configuration をよく読むと、 ansible-datadog-callback を入れなさい、と書いてあります。

なるほど、と設定しようとするもどこに何を置けばいいのかわからず困りました。
ローカル側に置くのかサーバー側に置くのかすらわからず迷いました。(答えはローカル側、つまりAnsibleを実行する側です)
以下、やり方です。

  1. Ansible の playbook があるのと同じフォルダに callback_plugins というフォルダを作ります。
  2. その callback_plugins フォルダの中に、
    ansible-datadog-callbackdatadog_callback.py を置きます。
  3. callback_plugins フォルダの中に datadog_callback.yml というファイルを新規作成し、
    以下のようにあなたの DataDog API キーを書きます。
    api_key: <your-api-key>
  4. datadog_callback.py の依存パッケージをインストールするため、以下のコマンドを実行してください。
    pip install datadog pyyaml
    datadogpyPyYAML がインストールされます )

あとは普段通りに Ansible を実行するだけです。

……で、終えられたら運がいいです。


私含めたいていの人は

ERROR! Unexpected Exception: No module named datadog

とエラーが出てくることに悩まされるでしょう。

「datadog インストールしたじゃん?!」と悩みます。

このエラーがなぜ発生するかというと brew install ansible で Ansible をインストールしている場合、
コールバックプラグインの実行に Ansible は自分自身が管理する Python を使い、ライブラリも Ansible 自身が管理するものを参照します。

/usr/local/Cellar/ansible/<ansible_version>/libexec/bin/python2.7

を使うし、

/usr/local/Cellar/ansible/<ansible_version>/libexec/lib/python2.7/site-packages

ディレクトリのライブラリのみ参照します。
このディレクトリには datadog ライブラリはありませんから、

ERROR! Unexpected Exception: No module named datadog

というわけです。

解決方法はいくらか考えられますが、ここでは2つ紹介します。

解決法1 : pip で Ansible をインストール

Homebrew で入れていることが問題と考える場合でのアプローチです。

以下のように、Homebrew で入れている Ansible をアンインストールし、 pip でインストールします。
この方法でも解決しますが、pip よりは Homebrew で Ansible のバージョン管理したいよなーと私は感じます。

brew uninstall ansible
pip install ansible

解決法2 : datadog ライブラリへのシンボリックリンクを置く

datadog ライブラリが Ansible 管理の Python ライブラリにないことが問題と考える場合でのアプローチです。

先ほど pip でインストールした datadog ライブラリへのシンボリックリンクを、
Ansible 管理の Python ライブラリフォルダに置きます。

ln -nfs /usr/local/lib/python2.7/site-packages/datadog /usr/local/Cellar/ansible/<ansible_version>/libexec/lib/python2.7/site-packages

(さっきから <ansible_version> と書いていますが、ここはお使いの Ansible バージョンに合わせて書き換えてくださいね)

これでも動くようになります。
問題点は、Ansible のバージョンを上げたときにまた同様にシンボリックリンクを貼る必要があることです。
その観点では解決法1のほうがいいですね。

ちなみに yaml ライブラリは Ansible 管理の Python ライブラリに含まれていますのでシンボリックリンクを貼る必要はありません。
ansible-datadog-callback のREADMEに書いてあったから pip install pyyaml としていますが、pyyaml はインストールしなくても良さげ。
pip install ansible の場合でも依存パッケージとして pyyaml は勝手にインストールされるので)

さて、これで実行できるようになっているはずです! おめでとうございます!

f:id:nekonenene:20170504003835p:plain

でもこの連携、使い所がいまいち多くないですね。

Ansible の実行結果はローカルで表示されるわけですから、実行結果を DataDog で見られるようにするメリットはそう感じられません。
となると、これが便利なのはサーバー側で別サーバーの Ansible Role を定期的に実行する場合などでしょうか?

例えば GitHub の master ブランチに変更があると CircleCI が走り Ansible Role を実行、
などとなっている場合には便利かもしれません。
成功・失敗程度は CircleCI からでも通知できますが、 Changed が指定した値より小さいときに通知なんてのは、
DataDog から通知設定するほうが楽でしょう。

使い方がわかり取れるデータがわかったところで、この連携は私の環境では不要なのでやめましたが、
Ansible Callback Plugins の導入方法としてはとてもいい勉強になりました。