ansibleのdocker connection plugを使ってみました。
環境
ansibleとdockerのバージョンは、下記の通りです。
$ ansible --version ansible 2.0.1.0 config file = /home/vagrant/.ansible.cfg configured module search path = Default w/o overrides (0)21:07:12 vagrant@vivid64$ (0)21:07:12 vagrant@vivid64$ docker version Client: Version: 1.9.1 API version: 1.21 Go version: go1.4.2 Git commit: a34a1d5 Built: Fri Nov 20 13:16:54 UTC 2015 OS/Arch: linux/amd64 Server: Version: 1.9.1 API version: 1.21 Go version: go1.4.2 Git commit: a34a1d5 Built: Fri Nov 20 13:16:54 UTC 2015 OS/Arch: linux/amd64 $
最初は、手動でコンテナを起動します。
コンテナ作成時に--name
オプションで名前を指定します。ansibleは、この名前でコンテナを識別します。
$ docker run --name target -td ubuntu:14.04 bash 909d3137c6d28f02ed261bba2974dc2ed1d50a7313a2843a6da2cec09ab8f61b (0)20:54:49 vagrant@vivid64$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 909d3137c6d2 ubuntu:14.04 "bash" 3 seconds ago Up 3 seconds target $
docker connection pluginは、python必須なのでコンテナにpythonをインストールします。
$ docker exec target "apt-get install -y python"
疎通確認
ansibleコマンドで疎通を確認します。
-c docker
を指定することで通常ssh
で接続するところをdocker exec
でコマンドを実行します。
$ ansible -i "target," target -c docker -a hostname target | SUCCESS | rc=0 >> 909d3137c6d2 $
playbookの準備
下記のようなplaybookを準備します。
$ cat sample.yml --- - name: start up docker container hosts: localhost tasks: - add_host: name=target - name: configure container hosts: target connection: docker tasks: - command: id register: id_result - debug: var=id_result.stdout when: id_result | success $
実行
$ ansible-playbook -i "localhost," sample.yml PLAY [start up docker container] *********************************************** TASK [setup] ******************************************************************* ok: [localhost] TASK [add_host] **************************************************************** changed: [localhost] PLAY [configure container] ***************************************************** TASK [setup] ******************************************************************* ok: [target] TASK [command] ***************************************************************** changed: [target] TASK [debug] ******************************************************************* ok: [target] => { "id_result.stdout": "uid=0(root) gid=0(root) groups=0(root)" } PLAY RECAP ********************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0 target : ok=3 changed=1 unreachable=0 failed=0 $