Ansibrest の紹介


この記事はAnsible Advent Calendarの9日目です

うちのチームでは現在、環境の共有も含めて Docker / Ansible を利用しています。
また、新しくサービスを作る際もなるべく docker-compose.yml を最初に作ることで、開発初期から適切な分担で作業をすることができるので、オススメです。
とはいえ、サーバすべてを Docker で運用することはないのでやっぱり ansible は不可欠です。

Ansible の悲しみ

  • Ops/Deploy 用のサーバの ansible と手元の ansible のバージョンの差異
    • サービス A の Ops サーバとサービス B の Ops サーバの ansible でバージョンが違ったりの両方を対応できない
  • 実行は Ops または手元のマシンから実行するしか無いが、わざわざ Ops サーバに入りたくない

Ansibrest

上記を解決するために、以前ブログにも書きましたが、 Ansibrest というツールを作りました。

ansible tower の機能が少なく、アンオフィシャルバージョンくらいの認識でいいです

その後、社内の開発環境に入れて Mattermost と連携して遊んだりしていたのですが、別件で多忙になり、放置していました。
気がつくと社内ではパッとしないままにもかかわらず「さくらのナレッジ」で紹介されたりしていました(こないだ知った)。

使ってくださる方がいるなら、と重い腰を上げて、社内での本格利用も検討しながら、必要な機能を追加していきました

  • 全面的なリファクタリング
    • lib/ansible.js
  • Error メッセージの表示改善
  • ExtraVars 対応
  • WebSocket による「長い Playbook」に対応
    • こいつがコードを汚くしているのでもう一度リファクタかけ直す予定
  • ansible 1.X 系 / 2.X 系の対応
  • Dockerize (ansible 2系 同梱)

結構色々、変更したのでぜひお試しください。

使い方

GUI

% docker run -d -p 2400:2400 -v $ANSIBLE_PATH:/opt/ansible muddydixon/ansibrest
% docker run -d -p 2400:2400 -v $YOURANSIBRRESTFILE:/opt/ansibrest/.ansibrest \
                           -v $ANSIBLE_PATH:/opt/ansible \
                           muddydixon/ansibrest

こんな感じで、 playbook があるディレクトリをボリュームマウントするだけで試すことができるはずです。

ちゃんと ExtraVars として {"version": 2} と入力して実行すると

の最後のタスクできちんと反映されています!

CUI

ansib"rest"の名前をつけているので curl 等で playbook を実行できるようにしてあります。

curl -X POST "http://dev.docker.com:2400/api/playbooks/sample1.yml"
{"stdout":"\nPLAY [Sample 1 tasks 1] ********************************************************\n\n\nTASK [setup] *******************************************************************\n\nok: [localhost]\n\n\nTASK [debug] *******************************************************************\n\nok: [localhost] => {\n    \"inventory_hostname\": \"localhost\"\n}\n\n\nPLAY [Sample 1 tasks 2] ********************************************************\n\n\nTASK [setup] *******************************************************************\n\nok: [localhost]\n\n\nTASK [debug] *******************************************************************\n\nok: [localhost] => {\n    \"inventory_hostname\": \"localhost\"\n}\n\n\nPLAY RECAP *********************************************************************\n\nlocalhost                  : ok=4    changed=0    unreachable=0    failed=0   \n\n\n","stderr":""}%       

ちゃんと叩けますので、例えば(というかこちらがメインの目的だったのですが)、 Ops サーバにこれをインストールしておくことで、 Slack Command などでデプロイができるようになるのです。勝つる!!!

今後

ansible tower に有るような認証用の設定がまだ残念でマウントまたは playbook 内にごにょごにょする必要があるところを直したいと思っています。