Ansible PlaybookをDockerコンテナに対して実行することでAnsibleのテストを行う。
参考
本題
今回はPacker + AnsibleでGoogle Compute Engine のイメージを作成したかったので、 そのPlaybookのテストをDockerで行うことにした。 Docker Imageを作ることが目的ではない。
余談だが、自分は今の所Dockerイメージを作るのにAnsibleは使っていない。 Dockerfileで良いと思っている。真面目にImage作るならDocker HubやQuay.ioでAutomated Buildするのが良いと思うし。
今回はGCEのUbuntu Server(16.04)をベースにイメージを作成したかったため、 公式のubuntu:16.04 Dockerイメージを使用する。 ただし、Ansibleでは対象のマシンにPython 2 が必要だが、ubuntu:16.04にはインストールされていなかったため、 python2をインストールしたイメージを用意し、それを使うことにした。
suzukishunsuke/python2:ubuntu1604-0.1.0
ちょっと困ったのが、 Docker Connection Plugin は su, sudoをサポートしていない点である。
Become (Privilege Escalation) — Ansible Documentation
root権限で実行したいコマンドがある場合、su, sudoが使えない以上一般ユーザで実行できない。 なのでリモートユーザはrootで実行した。
一方、GCEではリモートユーザは一般ユーザとして実行し、root権限が必要なタスクではbecome: yesを使う。
しかし、playbookにbecome:yes と書いてしまうと、Dockerに対して実行できない。
そこで以下のようにユーザがrootかどうかで、root権限が必要なところでbecomeするか判定するようにした。
vars: become: "{{ (ansible_env.HOME == '/root') | ternary('no', 'yes') }}"
become: {{ become }}
USERではなくHOMEを見ているのは、DockerコンテナでUSERが定義されていなかったから。
Dockerでテストする問題点
ansible_kernelが使えない。 値がホスト(ローカル)の値になる。
例えば自分はArch Linux使っているので 4.6.4-1-ARCH