AnsibleのInventoryファイル形式をiniからymlに変更した話

## 追記（2017/09/27）

* ansible 2.3.xでは問題がないが、2.4.0では次のようなエラーが発生する。

```
ERROR! Unexpected Exception, this is probably a bug: string indices must be integers
```

* ini形式で戻したら、エラーが無くなった。2.4.0のbugだと思うが、原因が分かり次第、追記する。

## 背景

* 久々にAnsible Inventoryのドキュメントを見たらymlでも作成できるようになっていた。
* まだ慣れてないini形式よりplaybookと同様のymlで直した方がいいと判断した。

## ターゲットノードの一覧

vagrantでlocalで運用中のサーバーの一覧

```
Current machine states:

jumpbox                   running (virtualbox)
dev                       running (virtualbox)
test                      running (virtualbox)
live                      running (virtualbox)
gembox                    running (virtualbox)
proxy                     running (virtualbox)
db1                       running (virtualbox)
db2                       running (virtualbox)
redmine                   running (virtualbox)
chat                      running (virtualbox)
gitlab                    running (virtualbox)
runner                    running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
```

/etc/hostsファイルに一覧に表示されているサーバーの名前でマッピングされている。

## Inventoryファイル

local（macOS Sierra）とターゲットノード（vagrant上のサーバー）をansibleで管理している。
そのときのファイルをini形式からyml形式で直して見た。

```
local:
  hosts: localhost
  vars:
    ansible_connection: local

all:
  hosts:
    jumpbox: jumpbox
    dev: dev
    test: test
    live: live
    gembox: gembox
    proxy: proxy
    redmine: redmine
    chat: chat
    gitlab: gitlab
    runner: runner
  children:
    db:
      hosts: db[1:2]
  vars:
    ansible_connection: ssh
    ansible_user: vagrant
    ansible_password: vagrant
```

## ansible.cfg

Inventoryファイルはリポジトリ内で管理したほうがいろいろ便利である。
僕はansible.cfgファイルを作成してInventoryファイルなどのデフォルトの設定を書いて使っている。

```sh
% cat ansible.cfg
[defaults]
inventory = inventories/hosts.yml
forks = 5
log_path = ~/Library/Logs/ansible.log
host_key_checking = false
gathering = smart
executable = /bin/bash -l
retry_files_save_path = ~/.ansible/retry-files
```

## 検証

* AnsibleでInventoryファイルをちゃんと解析しているのかを確認する。

```sh
% ansible all --list-hosts
  hosts (13):
    jumpbox
    runner
    gitlab
    gembox
    live
    redmine
    dev
    chat
    test
    proxy
    db1
    db2
    localhost
```

* ansibleコマンドで各サーバーについてpingテストを行う。

```sh
% ansible all -m ping
jumpbox | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
gitlab | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
runner | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
live | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
gembox | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
redmine | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
dev | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
test | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
chat | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
proxy | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
db1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
db2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

これで問題なし！

## 参考

* [Ansible Inventory Document](http://docs.ansible.com/ansible/latest/intro_inventory.html)