Ansibleモジュールを作ってみよう2014.12.18技術ブログAnsibleモジュールを作ってみようみなさんこんにちは。3ヶ月の東京出張も終わりに近づいたtacckです。今回の記事もAnsibleネタでいきたいと思います。Ansibleなどのプロビジョニングツールがメジャーになるまでは、シェルスクリプトを使った自動化・省力化というのが一般的だったと思います。今でも使われていると思います。Playbookでは書きづらい、シェルスクリプトで書くほうが良い、という状況も大いにあります。Ansibleのモジュールを作ってみましょう。今回の対応環境は、下記となります。1.8.2今回は、手軽に扱えるシェルスクリプト(sh系)を例として進めていきます。自作のモジュールについては、Ansibleを実行するディレクトリの直下にlibraryを作成し、その中に配置することですぐにPlaybookで指定することができるようになります。結果の状態Ansibleの処理結果には、主に下記3つの状態が必要となります。結果については、私の確認したところでは「JSON」で出力する必要がありました。そのため、それぞれの状態を表すために必要な情報をechoで出力していきます。成功か失敗かについては、JSONのプロパティrcを使用します。これは、コマンド実行後のシェル変数$?を格納するイメージと考えれば良いです。値が0の場合が成功、それ以外が失敗、となります。失敗についてはプロパティfailedを指定することで、rcの内容に関わらず失敗を指定することもできます。同様に、状態変更についてはプロパティchangedを指定することで変更ありを指定可能です。Playbookとシェルスクリプト、実行結果を見てみましょう。0こちら、先ほどあげたJSONを出力するだけのシェルスクリプトをモジュールとして配置しています。Playbookからモジュールとして呼び出しました。結果は、下記となります。failed=1$それぞれのJSONの記載どおりに、結果反映されました。実際の例(wget)次に、ファイル取得コマンドwgetを使うモジュールを例として作成してみます。同様のモジュールであるget_urlが存在していますので、こちらのオプションと同じものが(一部ですが)使えるように実装してみました。Playbookのオプションを取り込み、wgetの引数として使えるようにしています。destで指定したファイルが存在してなければ結果はchagedとなり、存在していれば結果はokとなるようにしています。(すでにファイルが存在していれば、ファイルのダウンロードを行なわないため、状態が変更されません。2回続けて実行し、2回目はchangedがokになっていることが確認できます。failed=0$上記のように、シェルスクリプトをモジュールとして組み込むことができます。それぞれの環境に合わせて必要なスクリプトを作ることはあると思いますので、それらを簡単にAnsibleの処理に組み込むことが出来ることが確認できました。Ansibleを使った管理のお供にしてみてください。indexともに世界をアップグレードできる、そんな日を夢見て。