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の実行が可能となります。
ニッチなケースかもしれませんが、ご活用ください。