docker
Ansible
docker-for-mac
ansible-container

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の実行が可能となります。

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