GMOアドマーケティングのインフラ開発本部あだちんです。
久しぶりにDockerネタなのですが、
今までローカル開発環境はVagrantを使用していました。
Vagrantだとリソースも食うし、IPも管理しないといけないし、なによりも重いんですね。
なので全てDocker(Docker machine)で検証するようにしました。
そこで、インフラチームのリーダに構成管理ツールは「ansible」に統一しましょう!
となったのでansible playbookのテストとして、
Dockerのコンテナがansibleで自動で立ち上がって自動でパッケージ入れて
そんなこと出来ないかなと考えていたわけです。
■Docker connection pluginについて
その前にDocker connection pluginについて説明しましょう。
これはDocker remote APIを利用したコンテナのプロビジョニングが可能となり、
ansible実行環境からDockerホストへのremoteAPIを実行できる環境であれば、
Dockerコンテナでsshdを起動する必要はなくなりました。
以前までは結構めんどくさくなっていたようです。
■イメージ
■環境
1 2 3 4 5 6 7 8 9 10 11 |
# docker -v Docker version 1.11.2, build b9f10c9 $ docker-machine -v docker-machine version 0.7.0, build a650a40 $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS docker01 - virtualbox Running tcp://192.168.99.100:2376 v1.12.1 docker02 - virtualbox Stopped Unknown docker03 - virtualbox Stopped Unknown |
■Macにansibleをインストール
1 2 3 4 5 |
$ brew install anible $ ansible --version ansible 2.2.0 config file = configured module search path = Default w/o overrides |
■Dockerホスト開発設定
1 |
$ eval "$(docker-machine env docker01)" |
1 2 3 4 5 6 |
$ docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 4 →こんな感じで情報が出ればOK |
■ansibleイベントファイル作成
1 2 3 4 5 6 |
$ vim hosts [docker_host] docker01 [container] test01 |
1 2 3 4 5 6 7 |
$ vim ssh_config Host docker01 HostName 192.168.99.100 User docker UserKnownHostsFile /dev/null IdentityFile ~/.docker/machine/machines/docker01/id_rsa StrictHostKeyChecking no |
1 2 3 4 5 6 7 |
$ vim ansible.cfg [defaults] inventory = hosts [ssh_connection] ssh_args = -F ssh_config scp_if_ssh = True |
1 2 |
$ sudo mkdir -p /etc/ansible $ sudo cp hosts /etc/ansible |
■DockerホストにPython系をインストール
1 |
docker@docker01:~$ tce-load -wi python |
1 2 |
docker@docker01:~$ python --version Python 2.7.10 |
1 |
docker@docker01:~$ curl https://bootstrap.pypa.io/get-pip.py | sudo python - |
1 |
docker@docker01:~$ sudo pip install docker-py |
1 |
docker@docker01:~$ sudo ln -s /usr/local/bin/python /usr/bin/python |
・接続確認
1 2 3 4 5 |
$ ansible -i hosts docker01 -m ping docker01 | SUCCESS = { "changed": false, "ping": "pong" } |
これで準備OKです。
■ansible playbookの作成
テストとしてCentOS7のイメージを使ってコンテナが自動で立ち上がり、勝手にユーザ作成できるかやってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ cat docker-site.yml - hosts: docker01 become: yes remote_user: docker tasks: - name: deploy centos container docker: image=centos:7 name=LB-test01 privileged=yes ports=7070:7070 expose=80 tty=yes command=/sbin/init - hosts: test01 connection: docker tasks: - include: roles/common/tasks/yum_update.yml tags: yum_update - include: roles/common/tasks/repos7.yml tags: yum_repos - include: roles/common/tasks/main-cent7.yml tags: main - include: roles/common/tasks/user.yml tags: useradd |
・実行
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ ansible-playbook docker-site.yml PLAY *************************************************************************** TASK [setup] ******************************************************************* ok: [docker01] TASK [deploy centos container] ************************************************* changed: [docker01] PLAY [test01] ************************************************************ TASK [setup] ******************************************************************* ok: [test01] TASK [up date] ******************************************************** ~省略~ |
■先ほどの立ち上がったコンテナにログイン
1 2 3 |
root@docker01:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9fbc512669a2 centos:7 "/bin/bash" xx minutes ago Up xx minutes 0.0.0.0:80-80/tcp test01 |
1 2 3 4 |
root@docker01:~# docker exec -it test01 /bin/bash root@9fbc512669a2:~# root@9fbc512669a2:~# cat /etc/passwd |grep adachin adachin:x:1004:1004::/home/adachin:/bin/bash →出来てる! |
■まとめ
これでDockerでも問題なくansibleの検証ができました。
Dockerfileでも構成管理できますが、またDockerfile用に作るのもめんどくさいし、
工数もかかるので構成管理ansibleを使っているならこちらでいいかと思います。
Chefとかどうなんだろ….
Dockerだと入ってないパッケージがあったり(sudoなど)するのでいろいろansibleもメンテしなくては….
ちなみに先日行われたGMO APエンジニアナイト(交流会)でも同じ内容をLTやりました。
プレゼンも以下で見れますので、イベントレポートは後日のお楽しみに!
77a5ba13cea567e2af8323cbfa5a2286