😀

Ansible MoleculeをDocker-outside-of-Docker(DOOD)で動かす

2020/09/28に公開

Ansible MoleculeをDocker-outside-of-Docker(DOOD)パターンで動かす方法です。DOODで動かすことによりMoleculeをOSヘインストールする必要がなくなります。

検証環境

  • CentOS7 (GCE)

Dockerをインストールする

Docker公式サイトにあるInstall Docker Engine on CentOS | Docker Documentation に従います。

MoleculeをDocker outside of Dockerで起動する

Ansible Moleculeのドキュメントの Common Molecule Use Cases — Molecule documentation に従います。

Ansible Role / Playbookのディレクトリへ移動し docker run コマンドを実行します。

chmod 666 /var/run/docker.sock

cd path/to/ansible-role

docker run --rm -it \
    -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \
    -v /usr/bin/docker:/usr/bin/docker \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -w /tmp/$(basename "${PWD}") \
    quay.io/ansible/molecule:3.0.8 \
    molecule test

その他

docker run コマンドが長いため ~/.bashrc へaliasでショートカットを作成すると良いでしょう。

例えば実行環境がAWS EC2ならログインユーザーの ~/.bashrc へ以下のように記述します。

~/.bashrc
alias molecule='sudo docker run --rm -it \
                -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \
                -v /var/run/docker.sock:/var/run/docker.sock \
		-v /usr/bin/docker:/usr/bin/docker \
                -w /tmp/$(basename "${PWD}") \
                quay.io/ansible/molecule:3.0.8 \
                molecule'

これで docker run コマンドから呼び出されるmoleculeコマンドがrootに変更せずに 通常のmolecule コマンドとして実行出来るようになります。

また ansible-playbookansible-lint のコマンドにもaliasを採用すると良いかと思います。

最終的な ~/.bashrc はこのようになります。

~/.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

alias molecule='sudo docker run --rm -it \
                -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \
                -v /var/run/docker.sock:/var/run/docker.sock \
		-v /usr/bin/docker:/usr/bin/docker \
                -w /tmp/$(basename "${PWD}") \
                quay.io/ansible/molecule:3.0.8 \
                molecule'

alias ansible='sudo docker run --rm -it \
                -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \
                -v /var/run/docker.sock:/var/run/docker.sock \
		-v /usr/bin/docker:/usr/bin/docker \
                -w /tmp/$(basename "${PWD}") \
                quay.io/ansible/molecule:3.0.8 \
                ansible'

alias ansible-lint='sudo docker run --rm -it \
                -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \
                -v /var/run/docker.sock:/var/run/docker.sock \
		-v /usr/bin/docker:/usr/bin/docker \
                -w /tmp/$(basename "${PWD}") \
                quay.io/ansible/molecule:3.0.8 \
                ansible-lint'

alias ansible-galaxy='sudo docker run --rm -it \
                -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \
                -v /var/run/docker.sock:/var/run/docker.sock \
		-v /usr/bin/docker:/usr/bin/docker \
                -w /tmp/$(basename "${PWD}") \
                quay.io/ansible/molecule:3.0.8 \
                ansible-galaxy'

alias ansible-playbook='sudo docker run --rm -it \
                -v "$(pwd)":/tmp/$(basename "${PWD}"):ro \
                -v /var/run/docker.sock:/var/run/docker.sock \
		-v /usr/bin/docker:/usr/bin/docker \
                -w /tmp/$(basename "${PWD}") \
                quay.io/ansible/molecule:3.0.8 \
                ansible-playbook'

Discussion