ひよこインフラてっく!

ひよこインフラエンジニア「ひよこ大佐」による技術ブログ的なもの。インフラ技術や仮想化、Pythonなど。

AnsibleでDockerコンテナを操作してみよう

こんにちは、ひよこ大佐です。 いよいよ2017年も今日が最後の日となりました。皆様いかがお過ごししょうか。 大掃除もようやく終わり、無事今年も新年を迎えることができそうです。

そういえば、大掃除という習慣ですが、その起源は神道の「煤払い」から来ているとのことです。

jinja.jp

家を綺麗にし歳神様をお迎えする習わしが、その宗教的意義が薄れ年末の恒例行事として定着したもののようです。 何気なくやっている新年の恒例行事も、調べてみるといろいろな発見がありますね。

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

Connection Plugins — Ansible Documentation

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年も、ひよこ大佐をよろしくお願いいたします!

それでは、良いお年をお迎えください!