ansible-containerでvagrant上のdocker-ceにコンテナを作成する

[前回](https://qiita.com/va034600/items/2425f97bcc7f70130add)はdocker for macにansible-containerを使ってdockerコンテナを作成しましたが、今回はvagrant上のdockerにdockerコンテナを立ち上げます。
ポイントはdocker apiを使っているので、ホストからvagrantのdockerにアクセスできるようにするところです。


# 環境
+ vagrant
+ ansible-container 0.9.2(0.9.1はうまくいかないので注意)

# ansible-containerのインストール

```
$ pip install ansible-container[docker]
```

# ソースコード

作成するのは以下のファイルです。

+ Vagrantfile
+ hosts
+ docker.yml
+ container.yml

```:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos72"
  config.vm.network "private_network", ip: "192.168.33.10"
end
```

```:hosts
[vagrants]
192.168.33.10 ansible_ssh_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/default/virtualbox/private_key
```

ホスト側からdocker apiにアクセスできるようにするため、
ansibleのreplaceコマンドでdocker.serviceを編集しています。

[How do I expose the docker API over TCP?](https://serverfault.com/questions/843296/how-do-i-expose-the-docker-api-over-tcp)


```
	replace: dest=/lib/systemd/system/docker.service regexp='^ExecStart.*$' replace='ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock' backup=yes

```

設定をしていないと以下のようなエラーが出ました。

	192:ansible-container-remote us$ ansible-container build
	ERROR	The connection to Docker was refused. Check your Docker environment configuration.	




```yaml:docker.yml
- hosts: vagrants
  user: vagrant
  become: yes
  tasks:
    - name: install yum-utils
      yum: name=yum-utils state=present

    - name: add docker repo
      shell: "yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo"
      args:
        chdir: "/etc/yum.repos.d"
        creates: docker-ce.repo

    - name: install docker-ce
      yum: name=docker-ce state=present

    - name: Docker グループにユーザー追加
      user: name=vagrant groups=docker append=yes
      tags: dockerhost
      become: True

    - name: replace ExecStart
      replace: dest=/lib/systemd/system/docker.service regexp='^ExecStart.*$' replace='ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock' backup=yes

    - name: restart docker
      systemd:
        name: docker.service
        state: restarted
        daemon_reload: yes
        enabled: yes
```


```yaml:container.yml
version: "2"
settings:
  conductor_base: centos:7

services:
  db:
    from: "mysql:latest"
    ports:
      - "13306:3306"
    environment:
      MYSQL_MAJOR: 5.7
      MYSQL_VERSION: 5.7.17
      MYSQL_DATABASE: sample
      MYSQL_USER: sample
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
registries: {}
```

# 実行

２つ目のポイントです。
環境変数 DOCKER_HOST にdockerのipを設定しています。

```
$ vagrant up
$ export DOCKER_HOST="tcp://192.168.33.10:2375"
$ ansible-playbook -i hosts docker.yml
$ ansible-container build
$ ansible-container run
```

# 確認

MySQL Workbenchでtcp over SSHで接続して確認します。

![スクリーンショット 2017-09-27 23.03.28.png](https://qiita-image-store.s3.amazonaws.com/0/203946/90d51d7c-7413-dc58-e54a-1e9dfdfd4b46.png)

これでdocker上のMySQLに接続確認ができました。


# 確認コマンド
```
$ curl -vvv http://192.168.33.10:2375/version
$ vagrant ssh
[vagrant@10 ~]$ docker exec -it ansiblecontainerremote_db_1 bash
[vagrant@10 ~]$ docker network ls
[vagrant@10 ~]$ docker network inspect ansiblecontainerremote_default
[vagrant@10 ~]$ docker logs ansiblecontainerremote_db_1
```

[github サンプル](https://github.com/va034600/sample-server/tree/master/ansible/ansible-container-remote)