ansiblerへの道 - ansibleのテストをDockerで

概要

昔こんな記事を書いたことがあった。

www.kimoton.com

ssh接続できるDockerイメージを作成してansibleのtargetノードとして使用する、的なモノだ。
まぁこの記事ではssh接続できるようにしただけで終わってたのだけど。。

Docker イメージをansibleのテスト環境として使用すれば、仮想環境を使用するよりも時間を短縮することができます。

必要なモノ

ansibleのターゲットノードとして必要な条件は以下の通り。

  • Python 2 (version 2.6 or later) or Python 3 (version 3.5 or later)
  • ssh (scp/sftp)

本来であればこれらが必要。 つまり前回のように、SSHデーモンを起動したコンテナを作成する必要があります。

Version 2.0以降では「Connection Plugin」というPluginの一種として、ターゲットノードへの接続方法を拡張することができるようになりました。 つまるところSSHデーモンを立てなくてもコンテナの操作ができるようになったわけです。

今回はこの方式でansibleのテストを行いたいと思います。

準備

コンテナ

立てるだけです。 -itd を指定してコンテナをバックグラウンドで常時起動します。

$ sudo docker run -itd --name test-01 centos /bin/bash
$ sudo docker run -itd --name test-02 centos /bin/bash

inventoryファイル

inventoryファイルには、以下のようにコンテナ名を指定します。 test_serversに属するtest-01、test-02コンテナをターゲットノードとして指定しています。

[test_servers]
test-01
test-02

playbook

playbookは以下の通り。 ディレクトリを作成し、さらにその中にファイルを作成します。

---
- 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

syntaxチェック

 $ ansible-playbook -i ./test_inventory ./docker_test.yml --syntax-check

こんな感じに教えてくれます。

$  ansible-playbook -i ./test_inventory ./docker_test.yml --syntax-check
ERROR! Syntax Error while loading YAML.
  mapping values are not allowed here

The error appears to have been in '/home/kimoton/project/private/ansible/docker_test.yml': line 11, column 19, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


            - name: create file
                  ^ here

シンタックスが問題なければ以下のようにplaybookのパスが表示されます。

$  ansible-playbook -i ./test_inventory ./docker_test.yml --syntax-check

playbook: ./docker_test.yml

テスト実行

playbookに書いた処理を実際に行うとどういった変更が行われるか、 --checkオプションを付けると予めテストできる。

$ ansible-playbook -i ./test_inventory ./docker_test.yml --check --diff

PLAY [test_servers] *******************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************
ok: [test-02]
ok: [test-01]

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] ********************************************************************************************************************************
changed: [test-01]
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 ansible-playbook -i ./test_inventory ./docker_test.yml --diff


PLAY [test_servers] *******************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************
ok: [test-02]
ok: [test-01]

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

無事に実行が完了しました。

参考

https://hiyoko-infratech.hateblo.jp/entry/2017/12/31/191043