logo header
logo header
logo header
logo header
  • 2014.12.18
  • 技術ブログ

Ansibleモジュールを作ってみよう

みなさんこんにちは。
3ヶ月の東京出張も終わりに近づいたtacckです。紅葉が綺麗ですね。

さて、今回の記事もAnsibleネタでいきたいと思います。

Ansibleなどのプロビジョニングツールがメジャーになるまでは、シェルスクリプトを使った自動化・省力化というのが一般的だったと思います。
もちろん、今でも使われていると思います。

必要な設定によっては、Ansible Playbookでは書きづらい、シェルスクリプトで書くほうが良い、という状況も大いにあります。

このように、過去の資産を使ったり、AnsibleのPlaybookで特定のコマンドを使いたかったり、といったときに、それをAnsibleのモジュールとして組み込むことが簡単にできます。

実行環境

早速、Ansibleのモジュールを作ってみましょう。
今回の対応環境は、下記となります。

Host / Remote: Mac OSX 10.10.1
Ansible: 1.8.2

今回は、手軽に扱えるシェルスクリプト(sh系)を例として進めていきます。

自作のモジュールについては、Ansibleを実行するディレクトリの直下にlibraryを作成し、その中に配置することですぐにPlaybookで指定することができるようになります。

結果の状態

Ansibleの処理結果には、主に下記3つの状態が必要となります。

  • 成功 (状態変更あり)
  • 成功 (状態変更無し)
  • 失敗

状態の表現

結果については、私の確認したところでは「JSON」で出力する必要がありました。
そのため、それぞれの状態を表すために必要な情報をechoで出力していきます。

成功か失敗かについては、JSONのプロパティrcを使用します。
これは、コマンド実行後のシェル変数$?を格納するイメージと考えれば良いです。つまり、値が0の場合が成功、それ以外が失敗、となります。
また、失敗についてはプロパティfailedを指定することで、rcの内容に関わらず失敗を指定することもできます。

同様に、状態変更についてはプロパティchangedを指定することで変更ありを指定可能です。

  • 失敗時のJSON例

  • 成功 (状態変更あり) 時のJSON例

  • 成功 (状態変更無し) 時のJSON例

実際の例

ここでは、実際のAnsible Playbookとシェルスクリプト、実行結果を見てみましょう。

  • ansible-mod-ex.yml

  • hosts

  • mod-changed

  • mod-failer

  • mod-success

こちら、先ほどあげたJSONを出力するだけのシェルスクリプトをモジュールとして配置しています。
これを、Ansible Playbookからモジュールとして呼び出しました。
結果は、下記となります。

それぞれのJSONの記載どおりに、結果反映されました。

実際の例(wget)

次に、ファイル取得コマンドwgetを使うモジュールを例として作成してみます。
すでに同様のモジュールであるget_urlが存在していますので、こちらのオプションと同じものが(一部ですが)使えるように実装してみました。

  • ansible-mod-wget.yml

  • hosts

  • wget

かなり簡単な実装ですが、Ansible Playbookのオプションを取り込み、wgetの引数として使えるようにしています。

destで指定したファイルが存在してなければ結果はchagedとなり、存在していれば結果はokとなるようにしています。
(すでにファイルが存在していれば、ファイルのダウンロードを行なわないため、状態が変更されません。)

下記実行結果です。
2回続けて実行し、2回目はchangedokになっていることが確認できます。

上記のように、シェルスクリプトをモジュールとして組み込むことができます。

それぞれの環境に合わせて必要なスクリプトを作ることはあると思いますので、それらを簡単にAnsibleの処理に組み込むことが出来ることが確認できました。

是非、Ansibleを使った管理のお供にしてみてください。

ともに世界をアップグレードできる、そんな日を夢見て。
Upgrade the World!