Ansibleの事例とちょっとしたTips


2013/11/30時点でAnsibleについて書いてくれる方が8名(私除く)もいて嬉しいです！
まだまだ枠には余裕がありますので、できれば2回書いてください(笑)
Ansibleを使っているけど、また登録してない！という方の参加もお待ちしています。
ちなみに、Qiita以外(はてなブログなど)に書くなどでもOKです。
カレンダーへの記事登録時にコメント欄にブログのURLを書けばリンクされるようです。

技術的なTipsを書こうかと思ったのですが、1日目なのでかるーいお話です。

# Ansibleってどんなところで使われているの？
Ansibleのユーザカンファレンスで国外での事例が紹介されています。
基本的には自社向けにライブラリを自製しているところが多いようです。
ライブラリの作りやすさというのも良さの1つだと思います。


## 海外事例 Ansible Fest  - Ansible User Conference
2013/10/22にサンフランシスコ(RackSpace社オフィス)で行われました。
RackSpace,Google,Redhat,Arista,Kiip,MapRの方が講演しています。
海外ではこんなところで使われているようです。

AnsibleFestの資料のリンクがMLにあったので、転載します。
Jesse Keating, Rackspace -- ansible -- turbo
http://prezi.com/tyasc3-vj_id/ansible-turbo/
Eric Johnson, Google - ansible and GCE
https://speakerdeck.com/erjohnso/ansible-with-google
Adam Miller, Red Hat - deploying OpenShift Origin with Ansible
https://speakerdeck.com/maxamillion/deploying-openshift-origin-with-ansible
Peter Sprygada, Arista - Ansible and EOS
https://speakerdeck.com/privateip/automation-from-the-inside-out-with-ansible-and-eos
Robby Colvin, Kiip - MIgrating from Another Configuration Management System
https://speakerdeck.com/geetarista/migrating-from-another-configuration-management-system

(Redhat+RackSpaceと言えばOpenstackが思い浮かびますが、Openstackの簡易インストーラーであるRDOはpuppetを使っていました。Ansibleに切り替わったりしませんかね。。)

## 国内事例
国内だとBacklogやCacooで有名なヌーラボさんで既に運用しているようです。
ヌーラボさんでの事例は[こちら](http://www.slideshare.net/ikikko/ss-25675759)にあります。

----

# Ansibleで困ったときにはどうすればいいの？
##  メーリングリスト
Ansibleのメーリングリストは3つ(ユーザ用・開発用・広報用)あります。
もともとユーザ用の1つあり、2013年9月頃に2つ(開発用・広報用)が追加されています。
ちなみに全部英語です。

 + [ユーザ用ML　ansible-project](https://groups.google.com/forum/#!forum/ansible-project)
最も活発なMLです。
2013/11/30(JST)までの時点で2525 件のスレッドが有ります。
最初の投稿が2012/02/25で、およそ1日に4件ほど新規投稿されています。
ただ、直近の3ヶ月以内では600件の新規投稿があったので、徐々に活発になってきているようです。

 + [開発用ML　ansible-devel](https://groups.google.com/forum/#!forum/ansible-devel)
開発用のMLです。
2013/11/30までの時点で39 件のスレッドが有ります。
最初の投稿が2013/09/14で、およそ2日に1回に投稿されています。

 + [広報用ML　ansible-announce](https://groups.google.com/forum/#!forum/ansible-announce)
広報用のMLです。Read−Onlyで、ぶっちゃけ、意味はないような気がしますが、AnsibleWorks CTOのMichael DeHaanさんご本人が書いています。
2013/11/30までの時点で7 件のスレッドが有ります。
最初の投稿が2013/09/13で、およそ10日に1回に投稿されています。

## Twitter
 #ansibleで呟くと誰か助けれくれるかもしれません。

# Ansibleの人気ってどうなの？
## Google Trend
ユーザ用MLの盛り上がりとともに、人気度が上がっています。

http://www.google.co.jp/trends/explore?q=ansible#q=ansible&date=today%2012-m&cmpt=q

chef, puppet, fabricとかと比較して見たかったのですが、他の用語と混じってうまく行きませんでしたorz

----
#Tips
さて、ここからはAdventCalendarらしく技術的なTipsです。
MLで見かけたTipsを少しだけやってみました。
Mac(OS X 10.7.5)に次のバージョンのAnsibleをインストールしています。
インストールターゲットはCentOS 6.4です。

```bash
$ ansible-playbook --version
ansible-playbook 1.4.1 (1.4.1 7bf799af65) last updated 2013/11/30 14:23:28 (GMT +900)
```

##Reboot
AnsibleのTask内で再起動させたい時のTipsです。(どうもPyfesでの@r_rudiさんのスライドと、重複してしまったようですorz)
URL:https://groups.google.com/forum/#!msg/ansible-project/9KVUY8yBKww/FHnX6FUvrH8J

wait_forモジュールを使用することで、Ansibleの実行を待機させることが出来ます。

次はSElinuxをpermissiveに変更、再起動してSELinuxの設定を確認するサンプルです。

```yaml
---
- name: Install libselinux-python
  yum: name=libselinux-python state=present

- name: Check status of selinux
  shell: getenforce

- name: Permissive selinux
  selinux: policy=targeted state=permissive

- name: reboot after change selinux
  shell: sleep 2s && /sbin/reboot &

- name: wait for the server to go down (reboot)
  local_action: wait_for host={{ inventory_hostname }} port=22 state=stopped

- name: wait for the server to come up
  local_action: wait_for host={{ inventory_hostname }} port=22 delay=30

- name: Check status of selinux
  shell: getenforce
```

wait_forのdelay=30で30秒間待機するように指定しています。


##  action文の分割
actionを複数行で書きたい時のTipsです。
URL:https://groups.google.com/forum/#!searchin/ansible-project/yum/ansible-project/07MZw5Qd9zs/2PS7JjepqW4J

ML上で推奨されていた2つやり方を紹介します。
(サンプル中の(1)~(4)はML上での採番に合わせています。)

まずは普通の書き方です。

```yaml
- name: Normal Template epel.repo
  template: src=epel.repo dest=/etc/yum.repos.d/epel.repo mode=0644
```

複数行での書き方その1( : でkey-valueをつなぐ)

```yaml
- name: MultiLine(1) Template epel.repo
  template: 
    src: epel.repo
    dest: /etc/yum.repos.d/epel.repo
    mode: 0644
```

複数行での書き方その2( = でkey-valueをつなぐ)

```yaml
- name: MultiLine(3) Template epel.repo
  template: 
    src=epel.repo
    dest=/etc/yum.repos.d/epel.repo
    mode=0644
```

なお、actionは省略できるので、次のようにactionでモジュールを指定するやり方は推奨していないようです。

```yaml
- name: MultiLine(4) Template epel.repo
  action: template
    src=epel.repo
    dest=/etc/yum.repos.d/epel.repo
    mode=0644
```


明日(2日目)は[myaaaaa_chan](http://qiita.com/myaaaaa_chan/items/f3473ae27f8e1b2abcac)さんです。