Docker
Ansible

AnsibleのPlaybookのテストにDockerのコンテナを利用した話

More than 1 year has passed since last update.

今更感ありますが、Ansible触る機会があったので触って見ました。


開発環境について

$ docker -v

$ Docker version 17.06.0-ce, build 02c1d87

$ docker-machine -v
$ docker-machine version 0.12.0, build 45c69ad

$ ansible --version
$ ansible 2.4.0.0


なぜAnsible?

プロダクションのデプロイに対して、Docker環境構築するのはちょっと重い(予算的にも規模的にも)ことはまぁあると思います。

ただ、development, staging, production とミドルウェアの環境構築はコードで管理したい。


そこでの最適解が、現状Ansibleかなと考えます。


なぜDocker Container?

色々見ていると古い情報が多いっていうのもありますが、Ansible PlaybookのテストはVagrantでVirtualbox立てるのがいいですと書いてあるところが多かったです。

まぁそこはしかし、Virtualboxのダウンロードがめちゃくちゃ時間かかります。

これ、今回CentOS7のPlaybookだけれど、次回CentOS6だったら?Ubuntu環境,Windows環境だったら?と考えると絶望的な気分になりました。


そこでDocker Containerですよね。


実際にやってみた


Ansible構成

CentOS: 7

Apache: latest

MySQL: 5.7

PHP: 7.1

redis: latest

git: latest


調査

早速調査したところ、感謝すべき先人達がたくさんいますね。

特に参考になったのは、GMOのAdachiさんが書いてくださったこちらの記事です。

この記事通りやれば、問題なく立ち上がると思います。

私の場合は、先にコンテナを立ち上げていて、その立ち上げ方に問題がありいくらか時間を使ってしまいました。

以下にログとして残しておきます。


service httpdがdocker containerで動かない

導入検証時、centos:7 コンテナを普通に

sh

$ docker run --name testcontainer -it -d centos:7



として立ち上げていたのですが、この立ち上げ方に問題がありました。

こちらの記事に詳しいのですが、centos7ではsystemctlがデフォルトで効かない都合上、httpdをserviceから起動させる箇所で

sh

$ fatal: [testcontainer]: FAILED! => {"changed": false, "failed": true, "msg": "Could not find the requested service httpd: host"}



と言われ続けました。

sh

$ docker run --name testcontainer --privileged -d centos:7 /sbin/init



と、特権モードでコンテナを作成して/sbin/initで起動しておくことで解決できます。

Docker Containerのplaybook動作確認時、service絡みで同様にエラーを吐く場合は、もしかしたらcontainerの起動方法で解決できるかもしれないです。

今回の成果物の簡易版を置いておくので、よかったら参考にしてみてください。


改めてVirtualBoxとの比較

Playbook検証環境の用意、実は最初Virtualboxダウンロードをしようとしていたのですが


VirtualBoxのダウンロード60分くらいに対してDockerのimage pull30秒くらい


で終わりました(笑)

また、Playbookの設定ミスってOSのクリーンインストールからやり直したいって場合も、vagrant destoryからvagrant upと比較して、コンテナの再作成も相当差があるのではないでしょうか。


せっかくDocker環境があるなら、手軽に再作成できるのでPlaybookの検証環境に最適かと思っています。