AnsibleでDockerコンテナを操作してみよう
こんにちは、ひよこ大佐です。 いよいよ2017年も今日が最後の日となりました。皆様いかがお過ごししょうか。 大掃除もようやく終わり、無事今年も新年を迎えることができそうです。
そういえば、大掃除という習慣ですが、その起源は神道の「煤払い」から来ているとのことです。
家を綺麗にし歳神様をお迎えする習わしが、その宗教的意義が薄れ年末の恒例行事として定着したもののようです。 何気なくやっている新年の恒例行事も、調べてみるといろいろな発見がありますね。
Ansible Connection Pluginについて
さて、今日はAnsibleの記事です。 実はAnsibleからDockerコンテナにたいして操作をすることが可能です。 Ansibleには「Connection Plugin」というPluginの一種として、ターゲットノードへの接続方法を拡張することができます。
通常Ansibleはターゲットノードと接続する際にSSHを使用しますが、それ以外にも現時点で下記の方式で接続することが可能です。今後も拡張が予定されています。
- buildah - Interact with an existing buildah container
- chroot - Interact with local chroot
- docker - Run tasks in docker containers
- funcd - Use funcd to connect to target
- iocage - Run tasks in iocage jails
- jail - Run tasks in jails
- libvirt_lxc - Run tasks in lxc containers via libvirt
- local - execute on controller
- lxc - Run tasks in lxc containers via lxc python library
- lxd - Run tasks in lxc containers via lxc CLI
- netconf - Use netconf to run command on network appliances
- network_cli - Use network_cli to run command on network appliances
- paramiko_ssh - Run tasks via python ssh (paramiko)
- persistent - Use a persistent unix socket for connection
- saltstack - Allow ansible to piggyback on salt minions
- winrm - Run tasks over Microsoft’s WinRM
- zone - Run tasks in a zone instance
AnsibleでDockerコンテナを操作する
さて、実際にAnsibleからDockerコンテナを操作してみましょう。 今回はAWS上のCentOS 7にdockerとansibleをインストール、CentOS7のdocker imageからコンテナを作成し検証しています。
Dockerのコンテナを作成する
※dockerのコンテナイメージは事前にpullしておきます。
$ sudo docker run -itd --name test-01 centos /bin/bash $ sudo docker run -itd --name test-02 centos /bin/bash $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 220b31f3c7c0 centos "/bin/bash" 3 seconds ago Up 2 seconds test-02 1be95b60e618 centos "/bin/bash" 59 seconds ago Up 58 seconds test-01
inventoryとplaybookを定義する
以下のようにinventoryとplaybookを定義します。
test_inventory
ローカルのdockerコンテナへの接続となるので、コンテナの名前のみをinventoryに記載しています。
[test_servers] test-01 test-02
docker_test.yml
playbookの内容は非常にシンプルで、ディレクトリとファイルを作成しているだけです。 ここでのキモは、「connection: docker」という行。 これにより、dockerコンテナへの操作であることを定義しています。
--- - hosts: test_servers connection: docker tasks: - name: create directory file: path: /home/test/ state: directory mode: 0755 - name: create file file: path: /home/test/test.txt state: touch mode: 0644
Playbookの文法チェックをする
下記コマンドで実行前にPlaybookの文法をチェックすることができます。 実行した際に文法エラーで弾かれることを未然に防ぐ事ができるため、Playbookを作成および変更した際には必ず実施しましょう。
$ sudo ansible-playbook -i ./test_inventory ./docker_test.yml --syntax-check playbook: ./docker_test.yml
ansibleでテスト実行する
実際にAnsibleで実行する前に、テスト実行します。 --checkオプションをつけることで実際に実行することなくどのように変更されるのか確認できます。--diffオプションで変更後の差分も表示可能です。
$ sudo ansible-playbook -i ./test_inventory ./docker_test.yml --check --diff PLAY [test_servers] ******************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [test-01] ok: [test-02] TASK [create directory] **************************************************************************************************************** --- before +++ after @@ -1,4 +1,4 @@ { "path": "/home/test/", - "state": "absent" + "state": "directory" } changed: [test-01] --- before +++ after @@ -1,4 +1,4 @@ { "path": "/home/test/", - "state": "absent" + "state": "directory" } changed: [test-02] TASK [create file] ********************************************************************************************************************* --- before +++ after @@ -1,4 +1,4 @@ { "path": "/home/test/test.txt", - "state": "absent" + "state": "touch" } changed: [test-01] --- before +++ after @@ -1,4 +1,4 @@ { "path": "/home/test/test.txt", - "state": "absent" + "state": "touch" } changed: [test-02] PLAY RECAP ***************************************************************************************************************************** test-01 : ok=3 changed=2 unreachable=0 failed=0 test-02 : ok=3 changed=2 unreachable=0 failed=0
実際に実行する
Playbookを実行する準備ができました。 早速実行してみましょう。
$ sudo ansible-playbook -i ./test_inventory ./docker_test.yml --diff PLAY [test_servers] ******************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [test-01] ok: [test-02] TASK [create directory] **************************************************************************************************************** --- before +++ after @@ -1,4 +1,4 @@ { "path": "/home/test/", - "state": "absent" + "state": "directory" } changed: [test-02] --- before +++ after @@ -1,4 +1,4 @@ { "path": "/home/test/", - "state": "absent" + "state": "directory" } changed: [test-01] TASK [create file] ********************************************************************************************************************* --- before +++ after @@ -1,4 +1,4 @@ { "path": "/home/test/test.txt", - "state": "absent" + "state": "touch" } changed: [test-01] --- before +++ after @@ -1,4 +1,4 @@ { "path": "/home/test/test.txt", - "state": "absent" + "state": "touch" } changed: [test-02] PLAY RECAP ***************************************************************************************************************************** test-01 : ok=3 changed=2 unreachable=0 failed=0 test-02 : ok=3 changed=2 unreachable=0 failed=0
問題なく実行できました。
ファイルが存在することを確認する
$ sudo docker attach test-02 [root@220b31f3c7c0 /]# [root@220b31f3c7c0 /]# [root@220b31f3c7c0 /]# cd /home/test/ [root@220b31f3c7c0 test]# ls -ltr total 0 -rw-r--r--. 1 root root 0 Dec 31 09:58 test.txt
test.txtファイルが存在していることが確認できます。
おわりに
最後までお付き合いいただきありがとうございます。 Ansibleは様々な環境にたいして操作をすることが可能な柔軟性を兼ね備えています。 いろいろなことがあった2017年。 2018年は、Ansibleをもっと活用してみませんか?
ご意見、ご感想など、コメント欄やTwitterでリプライいただければ励みになります! 2018年も、ひよこ大佐をよろしくお願いいたします!
それでは、良いお年をお迎えください!