3
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-01

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

まずは結論

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

[defaults]
host_key_checking = False

以下の設定があっても上手く動作しないので注意

[ssh_connection]
ssh_args = -o StrictHostKeyChecking=false

問題発見と解決までの流れ

Ansible の Docker Module で pull に失敗する。

Ansible の core module に docker module があるということで早速簡単な playbook を作って試してみることに

# 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 を確認してみる。

[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 のドキュメントがもうちょい欲しい。

そんな感じで。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5