Edited at

Docker for Mac 環境で Docker connection plugin for Ansible を利用する。

More than 1 year has passed since last update.


Docker connection plugin for Ansible とは?

Docker connection plugin for Ansibleは、Ansible 2.0 より利用が可能になった機能です。

Ansibe が Docker API へ接続することで、従来の様にコンテナ上でSSHデーモンを起動させることなく、コンテナファイルを直接操作できるようになりました。


設定

早速、手順に沿って設定します。

手順では、環境変数の DOCKER_HOST に Docker API のホストアドレスを記載するように書かれています。

Docker for Mac での Docker API は、TCPではなく UnixSocket となります。

GitHub上には書かれていませんが、こちらにはUnixSocketかTCPと書かれているので、



export DOCKER_HOST="unix://var/run/docker.sock"



と実行し、環境変数を設定します。


参考

Docker for Mac の挙動は、こちらに詳しく書かれています。


実行

動作検証のために簡単なPlayBookとInventoryを用意しました。Docker上の2つのコンテナにPINGを送信します。


  • hosts

[containers]

high_bardeen
gigantic_almeida


  • sample.yml

- hosts: containers

connection: docker

tasks:
- name: ping
ping:

$ ansible-playbook -i hosts.yml sample.yml

PLAY [containers] **************************************************************

TASK [setup] *******************************************************************
ok: [high_bardeen]
ok: [gigantic_almeida]

TASK [ping] ********************************************************************
ok: [gigantic_almeida]
ok: [high_bardeen]

PLAY RECAP *********************************************************************
gigantic_almeida : ok=2 changed=0 unreachable=0 failed=0
high_bardeen : ok=2 changed=0 unreachable=0 failed=0

はい、成功です。

ですが、ここで落とし穴がありました。

環境変数を設定後Dockerコマンドを実行すると、下記のようになります。

$ docker info

Cannot connect to the Docker daemon. Is the docker daemon running on this host?

[DOCKER_HOST] を設定することで、Docker for Mac に含まれるDockerコマンドが正常に稼働しなくなるようです。

なお、

$ unset DOCKER_HOST

とすることで、設定した[$DOCKER_HOST]は削除でき、Dockerコマンドは正常に動きました。


解決

なんとかして[DOCKER_HOST]を設定する必要があります。

そこで、PlayBook中に[DOCKER_HOST]変数を定義します。


  • sample2.yml

- hosts: containers

connection: docker

vars:
- DOCKER_HOST: "unix://var/run/docker.sock"

tasks:
- name: ping
ping:

$ ansible-playbook -i hosts.yml sample2.yml

PLAY [containers] **************************************************************

TASK [setup] *******************************************************************
ok: [high_bardeen]
ok: [gigantic_almeida]

TASK [ping] ********************************************************************
ok: [gigantic_almeida]
ok: [high_bardeen]

PLAY RECAP *********************************************************************
gigantic_almeida : ok=2 changed=0 unreachable=0 failed=0
high_bardeen : ok=2 changed=0 unreachable=0 failed=0

はい、上手くいきました。

これで、Docker for Mac 上のコンテナへもコンテナ上でSSHデーモンを起動せずにAnsibleの実行が可能となります。

ニッチなケースかもしれませんが、ご活用ください。