このエントリーをはてなブックマークに追加

ansibleを使ってみるその2

EC2で試してみる

http://www.capsunlock.net/2012/10/using-ansible-for-ec2.html

を参考にします。

export AWS_ACCESS_KEY_ID=aws_accesskey_id
export AWS_SECRET_ACCESS_KEY=aws_secret_key
export ANSIBLE_HOSTS=$(pwd)/plugins/inventory/ec2.py
export ANSIBLE_SSH_ARGS="-o ForwardAgent=yes"

pip install でbotoを入れてから、ec2.py --listと実行します。 ec2.pyはここにあります。

そうすると、こんな感じのが出てきます。

{
  "ap-northeast-1": [
    "ec2-54-XXX-XX-64.ap-northeast-1.compute.amazonaws.com"
  ],
  "ap-northeast-1b": [
    "ec2-54-XXX-XX-64.ap-northeast-1.compute.amazonaws.com"
  ],
  "i-49a76f4b": [
    "ec2-54-XXX-XX-64.ap-northeast-1.compute.amazonaws.com"
  ],
  "key_ansible": [
    "ec2-54-XXX-XX-64.ap-northeast-1.compute.amazonaws.com"
  ],
  "security_group_quick-start-1": [
    "ec2-54-XXX-XX-64.ap-northeast-1.compute.amazonaws.com"
  ],
  "tag_Name_": [
    "ec2-54-XXX-XX-64.ap-northeast-1.compute.amazonaws.com"
  ],
  "type_t1_micro": [
    "ec2-54-XXX-XX-64.ap-northeast-1.compute.amazonaws.com"
  ]
}

確認したら、これをANSIBLE_HOSTSで指定しておきます。こうすることにより、ec2のinstanceを常に参照できます。

% export ANSIBLE_HOSTS=`pwd`/ec2.py

キャッシュするので、毎回読みに行くわけでは無さそうです。

ssh-add /path-to/my-ec2-keypair してから、-m pingとか打ってみましょう。

% ansible type_t1_micro -u root -m ping
ec2-54-XXX-XX-64.ap-northeast-1.compute.amazonaws.com | success >> {
    "changed": false,
    "ping": "pong"
}

"pong"と返ってきたら成功です。あ、一回sshで入ってknown_hotsに登録する必要はあるかもしれません。

実際に使ってみよう

ということで、ec2を使う準備ができたので、playbookを作って見ました。

このレポジトリにおいたので、参考にしてください。

https://bitbucket.org/r_rudi/ansible-test

ただ、いろいろ試していて、実際には使っていないファイルとかもそのままになっちゃってます…

解説

つっても、たいしたことはしてません。

  • sphinx/python.yml でsphinxを入れる
  • sphinx/apache.yml でapacheを入れる
    • この時、変数をindex.htmlに挿入する
  • sphinx/initialize.yml はこの両方を実行する

という動作を行うplaybookをsphinxディレクトリに入れてあります。

で、これを実行する start.yml というファイルを用意してあります。これだけ引用すると、こんな感じです。

# 実行するには ansible-playbook start.yml
---
- hosts: type_t1_micro
  user: root
- include: sphinx/initialize.yml
  vars:
    hoge: hhh   # hogeだけ上書き

includeでsphinx/initialize.ymlを読み込んでおり、その中で使う変数 hogeだけを上書きしています。sphinx/apache.ymlを見ると、 title 変数も定義されてますが、これはそのまま使われます。

つまり、sphinxディレクトリだけ他所から持ってきて、includeして必要なvarsだけ上書きする、という感じで使えます。cookbookの使い回しと同じような感じですね。

ちなみに、OSやディストリビューション依存の変数については前回を参照してください。

まとめ

chefのいいところは、「Community Cookbook」による再利用性の高さとコミュニティの存在と思っています。残念ながらansibleのコミュニティはそこまで大きくありませんが、再利用の機能は揃っているため、逆に言えば共有する仕組みが整えば、すごく広がる可能性はあります。開発MLもかなり活発なので、今後の展開が楽しみですね。

個人的には対象ホストへのrubyの入れ方で悩むより、対象ホストへの要求があんまりないansibleを使ったほうが(個人で使う分には)楽なんじゃないのかなぁ、とか思ったり。あと、設定ファイル配布とservice restartを行うtaskを分離しておけば、別々に手動で実行させたりとかも簡単にできるので「構築はchefで、運用はfabricで」とかにならなくてすむかもしれないなぁ、と思ったりしています。

ただ、chef-soloの範囲と言われている20台を超えた時にどれぐらいchefserverと違うのかは(chef serverを使ったことがないので)分かりません。chef serverは検索とかできますしね。

と、書いてきましたがどこまで使えるかはまだよく分かってません。感覚的にはfabric + cuisine = ansible という感じが近く、Chefに対して明確な優位性があるかどうかは他の人にも使ってもらって感想を聞きたい感じです。