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

今更感ありますが、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のテストはVagrantVirtualbox立てるのがいいですと書いてあるところが多かったです。
まぁそこはしかし、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 コンテナを普通に

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

として立ち上げていたのですが、この立ち上げ方に問題がありました。
こちらの記事に詳しいのですが、centos7ではsystemctlがデフォルトで効かない都合上、httpdをserviceから起動させる箇所で

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

と言われ続けました。

$ 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の検証環境に最適かと思っています。

CINRAでの活動について

CINRAでは、受託案件及び自社案件本当に様々なインフラ環境があります。
以前までは、Vagrant + Virtualboxで開発環境を用意していたのですが、1年弱前くらいからは開発環境の構築は全てDockerで構築するようになってきました。
これによって、

  • 実装エンジニアの環境構築が早くなるので初動が早くなった
  • 比較的過去の案件でも問題なく環境構築を再現できる

といったメリットがあり、環境構築周りが非常にスムーズになりました。
この辺りは、マネージャー濱田にいつか話して欲しいトピックだったりします。