ansible で docker pull しようとした時にハマった事

Ansible の docker module でイメージを pull しようとした時にハマったのでメモ

# まずは結論
docker モジュールの pull を活用したい場合、ansible.cfg に次の設定をする事。

```ini
[defaults]
host_key_checking = False
```
以下の設定があっても上手く動作しないので注意

```ini
[ssh_connection]
ssh_args = -o StrictHostKeyChecking=false
```
# 問題発見と解決までの流れ
## Ansible の Docker Module で pull に失敗する。
Ansible の core module に docker module があるということで早速簡単な playbook を作って試してみることに

```yaml
# check docker module
- hosts: all
  user: "{{ os_user }}"
  sudo: no
  tasks:
  - name: Pull docker
    sudo: yes
    docker:
      image: hellow-world
      state: restarted
      pull: always
```
そうすると以下のようなエラーが出てきて止まる。

```
TASK: [Pull docker] *********************************************************** 
failed: [192.168.66.10] => {"failed": true, "parsed": false}
BECOME-SUCCESS-fyaiucvovdzzumtoljxztardifekorky
Traceback (most recent call last):
  File "/home/vagrant/.ansible/tmp/ansible-tmp-1443408143.03-143168444233585/docker", line 3185, in <module>
    main()
  File "/home/vagrant/.ansible/tmp/ansible-tmp-1443408143.03-143168444233585/docker", line 1482, in main
    docker_api_version = dict(required=False, default=DEFAULT_DOCKER_API_VERSION, type='str'),
NameError: global name 'DEFAULT_DOCKER_API_VERSION' is not defined
OpenSSH_6.7p1 Ubuntu-5ubuntu1.3, OpenSSL 1.0.1f 6 Jan 2014
...中略...
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
f4:c4:33:2b:87:ab:77:e4:9a:6f:35:e9:a4:13:52:3f.
```
最初は `DEFAULT_DOCKER_API_VERSION` とかの問題なのかと思ってオプション見てちょこちょこイジってもエラーが消えない。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
```
このエラーはsshの known_hosts に入ってるデータと接続先のデータが違う時に見かけるエラーなので、どうも原因は ssh 周りにありそう。

## SSH Option の設定を確認
って事で ssh 関係の設定をしている ansible.cfg を確認してみる。

```ini
[defaults]
inventory = hosts

[ssh_connection]
ssh_args = -o StrictHostKeyChecking=false
```

StrictHostKeyChecking は ssh に known_hosts との確認を行なわないという設定。
known_hosts に入る情報は Vagrant で `vagrant destroy -f && vagrant up` とかやるとすぐに変わってエラーを吐かれるので、ここでknown_hostsの確認は行なわないようにしている。
ここで設定しているにも関わらず docker pull の時にはうまく動いていない。。。

そこで調べてみると ssh のオプション設定とは別に known_hosts を無視させる設定を発見

## host_key_checking
この設定と ssh_args の設定とどう変わるのか分からないけど、ssh_connection の方は ansible がサーバーに接続する場合の設定で host_key_checking は ansible でアクセスしたサーバーがどこか他のサーバーにアクセスする時も無視するようになってるんじゃないかと思う。

```
# ssh_connection の ssh_args の適用範囲
+---------+              +--------+
| Main PC | =[ansible]=> | Server |
+---------+              +--------+

# host_key_checking の適用範囲
+---------+              +--------+          +--------------+
| Main PC | =[ansible]=> | Server | =[ssh]=> | Other Server | 
+---------+              +--------+          +--------------+
```
挙動から見た予測なので違ってもあしからず :stuck_out_tongue: 

なにはともあれ、この設定をする事でエラーが出なくなった。
Ansible のドキュメントは相当しっかりしている方だけど、似たような option を設定できる時はもうちょいドキュメントが欲しいとこ :sweat: 
あと Magic Variable のドキュメントがもうちょい欲しい。

そんな感じで。