Ansibleチートシート（実行周り）

Playbookの書き方はググればいくらでもサンプルがでてくるんですが、実行の仕方とかまとまってない気がしたので。

 Ansibleのセットアップ
======================

ドキュメント読もう。Ubuntu系ならPPAあります。
http://docs.ansible.com/intro_installation.html

 Inventory
===========

http://docs.ansible.com/intro_inventory.html

シンプルな例

```
192.168.0.1
192.168.0.2:12345
```

`/etc/ansible/hosts`に置くか、適当なとこにおいて`-i`(`--inventory`)オプションないし`ANSIBLE_HOSTS`環境変数でパスを指定。

なおInventoryファイルに実行権限(+x)があるとDynamicInventoryと勘違いされ、実行できないよ！！みたいなエラーが出るので注意。Windowsの共有フォルダをマウントしたら全ファイルに+xついてて嵌りました。

http://docs.ansible.com/intro_dynamic_inventory.html

 これ作るの面倒
---------------

カンマで区切れば引数で直接指定できるようです。カンマで区切れば、なので、一つだけ指定したい時も先頭か末尾にカンマをつける必要があります。

http://stackoverflow.com/questions/17188147/how-to-run-ansible-without-specifying-the-inventory-but-the-host-directly
https://github.com/ansible/ansible/blob/release1.6.2/lib/ansible/inventory/__init__.py#L70

 host-pattern
--------------

ansibleコマンドやplaybookのhosts:節で指定するのはhost-patternと呼ばれるもので、Inventoryに記述されたホストを絞り込むパターン文字列です。このため、例えIPアドレスであってもInventoryファイルに記述がなければエラーになります。

http://docs.ansible.com/intro_patterns.html

 実行
=====

```bash
# モジュールの実行
# 適当にsshコマンドを走らせて、known_hostsに入れておく
# 公開鍵認証とかでパスワード不要なら-k(--ask-pass)はいらない
ansible -k -m apt -a "pkg=vim state=present"

# Playbookの実行
# オプションはansibleコマンドとだいたい同じ
ansible-playbook -k main.yml
```

 その他のオプション
==================

 Playbookでsudo使いたい
-----------------------

http://docs.ansible.com/playbooks_intro.html の中ほどにある話。
playbookで`sudo:yes`と書く他に、`-s`(`--sudo`)オプションでも指定できます。
NOPASSWDにしてないなら`-K`(`--ask-sudo-pass`)使いましょう。

 テストしたい
-------------

`-C`(`--check`)があります。`ansible`と`ansible-playbook`どちらでも使えます。
ただし、changedになる処理を行わなずに続行するだけなので

* `apt: update_cache=true`とかするとローカルキャッシュが更新されます
（aptモジュールのchange処理ってパッケージの追加・削除なので）
* 前のタスクに依存してるとこけたりします。例えば

```yaml
tasks:
  - name: インストールしておく
    apt: pkg=hoge state=present
  - name: 上でインストールされたファイルをごにょごにょ
    lineinfile: path=/etc/hoge/foo.cfg ... # ファイルがない！
```

 ローカルでの実行
================

`--connection`オプションで接続方法を指定できますが、ここでlocalを指定するとsshを一切使わずに実行することができます。

http://docs.ansible.com/playbooks_delegation.html#local-playbooks

この指定は接続方法を切り替えることしかしません。なのでInventoryは必要ですし、対象がlocalhostでなくても（勿論ローカルで）実行されますし、条件に該当するホストが複数あればローカルで複数回実行されます。

またマニュアルには書かれていませんが、現時点(1.6.2)では`localhost`と`127.0.0.1`に限り、Inventoryに記述がなくてもhost-patternとして使うことができるようです。この場合、`--connection local`が自動的に指定されます。

但し、Inventoryに`localhost`や`127.0.0.1`の記述があればそちらが優先されます。この場合は自動localが働かないので、Inventoryに`ansible_connection=local`と書くか、`--connection`オプションが必要です。

https://github.com/ansible/ansible/blob/release1.6.2/lib/ansible/inventory/__init__.py#L315

```bash
# local実行. localhostはInventoryにあってもなくても指定できる.
ansible localhost -c local

# Inventoryにlocalhostが"なければ"local実行
# Inventoryに記述があればそれが使われる
ansible localhost

# localhost/127.0.0.1なら空のファイルを指定してもok
# それ以外のhost-patternだと"No hosts matched"
ansible localhost [-c local] -i /dev/null

# -c localを指定した場合、ホストに関わらずローカルで実行される
ansible all -c local -i example.com,
```

playbookをこのように実行したい場合・・・

* いつもlocalで実行したい
    * playbookに`hosts: localhost`と記述する
    * Inventoryは適当に1ホスト分用意すればいいですが、localhostを書いてしまうと自動local働かないので注意。心配ならplaybookに`connection: local`も書いておきましょう。
* 時々localで実行したい
    * グループを使わず`hosts: all`と書いているなら、実行時に`-c local -i hoge,`を付ける（hogeの部分は適当なホスト名）
    * でなければ、グループごとに`localhost ansible_connection=local`が書かれただけのinventoryファイルを用意

Inventoryファイルを作成する方法が汎用性高くてよさそうですね。

なお`ansible`コマンドと違い、`hosts: localhost`と指定しても、Inventoryは何か指定しないといけないようです。

```bash
ansible-playbook -c local -i /dev/null
# ERROR: provided hosts list is empty

ansible-playbook -c local -i ,
# ERROR: provided hosts list is empty
```