概要
昔こんな記事を書いたことがあった。
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
無事に実行が完了しました。