読者です 読者をやめる 読者になる 読者になる

Dockerを使ってAnsible Playbookのテストをする

packer docker docker engine ansible インフラ

Ansible PlaybookをDockerコンテナに対して実行することでAnsibleのテストを行う。

参考

dev.classmethod.jp

tdoc.info

tdoc.info

本題

今回は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