fabricとAnsibleを試してみる
背景
- AWS上のCentOS7でRailsが動く環境をCMツールで作りたい
仮想的なAWSのCentOS7はdockerのimageで用意した
Chefはそれなりに使ったことがある。
- が、0.9くらいのときからしばらく使ってない
- 自分はそんなに感じなかったがChefは学習コストが高いとよく聞くので、他のfabricやansibleはどうなのか気になっている
- この機会にかるくfabricとAnsibleを触ってみようということに
- ちなみに両方共python製
- 想定クライアントはOSX(yosemite)で想定リモートホストはCentOS7
fabric編
インストール
- pipのインストールとfabricのインストール
sudo easy_install pip sudo pip install fabric
チュートリアルをやってみる
番組の途中ですが、ここでfabricについては不採用ということで決定しました。 理由としては、なんだかやっててよくわかんないし、つまらないから。
次はAnsibleで。Ansibleが刺さらなかったらChefに決定ということで。
Ansible編
気を取り直してAnsibleの評価へ。 - versionは1.5
参考
インストール
$ brew update $ brew install ansible
- ちなみにAnsible自体windowsはサポートしてない。
動作確認
inventoryファイルの用意
- 接続先ホストの設定をするファイル。
- /etc/ansible/hosts がデフォルトの配置場所だけど、今回は適当な作業ディレクトリを作ってそこに置くことにする
dir/to/workspace/hosts に接続先のホスト名かIPを書く。こんな感じ。
192.168.59.103:49173 ansible_ssh_user=centos
Ansibleのpingを打つ
- pingとは疎通確認のためのAnsibleのテストモジュール
$ ansible-doc ping less 418 Copyright (C) 1984-2007 Mark Nudelman less comes with NO WARRANTY, to the extent permitted by law. For information about the terms of redistribution, see the file named README in the less distribution. Homepage: http://www.greenwoodsoftware.com/less > PING A trivial test module, this module always returns `pong' on successful contact. It does not make sense in playbooks, but it is useful from `/usr/bin/ansible' EXAMPLES: # Test 'webservers' status ansible webservers -m ping
- モジュールっていうのはAnsibleのAPIの単位みたいなの
- うまくいけばpongが返ってくる
- さっそくやってみる。
$ ansible 192.168.59.103 -m ping -i hosts 192.168.59.103 | success >> { "changed": false, "ping": "pong" }
- -iでさっき書いたhostsファイルを指定する。
- ssh-agentに秘密鍵が設定してある前提なのでしてなければ、--private-keyで指定するかhostsに書いておく
- inventoryの書き方はけっこう柔軟
playbookを書く
ここまででけっこう好感を持ったのでplaybook(chefのrecipe的なもの)でリモートホスト(CentOS7 on docker)にgitをインストールする、というのを書いてみる。
- 何はともあれcowsayを入れておく
$ brew install cowsay
- 環境変数をセット
$ export ANSIBLE_COW_SELECTION=random
- 以下の内容を適当な名前のymlファイル(ここではfoo.yml)で保存
--- - hosts: all tasks: - name: Install git sudo: true yum: name=git state=latest
$ ansible-playbook foo.yml -i hosts ____________ < PLAY [all] > ------------ \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || _________________ < GATHERING FACTS > ----------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || ok: [192.168.59.103] ___________________ < TASK: Install git > ------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || changed: [192.168.59.103] ____________ < PLAY RECAP > ------------ \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || 192.168.59.103 : ok=2 changed=1 unreachable=0 failed=0
- ちなみにcowsayを入れなければこんなことにはならない
- 確認してみる
$ docker exec -it 349 sudo yum list installed | grep git git.x86_64 1.8.3.1-4.el7 @base
- chefと同じく冪等性が確保されているのでもう一発打っても同じ結果が返ってくる
- 厳密には結果の最後のchangedが0になっている(すでに入っているgitのインストールはされない=変更はされないから)
まとめ
Ansible、chefより取っ付きやすい気がする。ドキュメントひと通り読んでこれやっているんだけど、chefにあるものはだいたいあるっぽい。 これもうちょっと深く行ってみようと思う。