vagrant
docker
Ansible
docker-compose

ansible(docker_service)でdocker-composeを実行してvagrantのdocker-ceにコンテナを作成する

前回はvagrant上のdockerにansible-containerを使ってdockerコンテナを作成しましたが、今回はvagrant上のdockerにdocker-composeを使ってdockerコンテナを立ち上げます。
ansible-containerはdocker apiを必要とするのに対して、docker_serviceはsshで起動できるので、こちらの方がportなどの管理が楽です。
docker-composeはansibleのdocker_serviceを使って起動します。
ポイントはdockerをインストールしたサーバにdocker-composeをインストールすることと、docker-compose.ymlファイルをdockerがインストールしているサーバに転送することです。

環境

  • vagrant
  • ansible 2.4(2.3は要注意)

ソースコード

├── docker-compose-install.yml
├── docker-install.yml
├── docker-service.yml
├── hosts
├── site.yml
├── Vagrantfile
└── transfer
    ├── docker-compose.yml
    └── db
        ├── Dockerfile
        └── conf
            └── custom.cnf
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
site.yml
- import_playbook: docker-install.yml
- import_playbook: docker-compose-install.yml
- import_playbook: docker-service.yml
docker-install.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: restart docker
      systemd:
        name: docker.service
        state: restarted
        daemon_reload: yes
        enabled: yes

ポイントはdocker-pyをインストールしないことです。
もうひとつのポイントは、ansible2.3とdocker-compose 1.16は相性問題があるのも要注意です。
詳しくはansibleでdocker_serviceを使った時に Error: cannot import name splitdrive が出た時の対応にまとめました。

docker-compose-install.yml
- name: "install docker-compose"
  hosts: vagrants
  user: vagrant
  become: yes
  tasks:
    - name: Installing packages
      action: "{{ ansible_pkg_mgr }} pkg={{ item }} state=present"
      with_items:
        - python-setuptools

    - name: Installing dependencies
      easy_install:
        name: pip

    # - name: "install docker-py"
    #   pip:
    #     name: "docker-py"
    #     version: 1.7.1
    #     state: present

    - name: Installing docker compose
      pip:
        name: docker-compose
        # ansible 2.3 と docker-compose 1.16 は 相性問題がある
        #version: 1.15.0
        state: present

ここのポイントはファイルをdockerがインストールされているvagrantに転送していることです。
project_src は転送先の絶対パスにしました。

docker-service.yml
- name: "docker service execute"
  hosts: vagrants
  user: vagrant
  become: yes
  vars:
    ansible_python_interpreter: python2
  tasks:
    - name: copy docker-compose file
      copy: src=./transfer dest=/home/vagrant

    - name: "Up db server"
      docker_service:
        project_src: "/home/vagrant/transfer"
        state: present

よくあるdocker-compose.ymlファイルです。

docker-compose.yml
version: '2'
services:
  db:
    build: ./db
    image: sample/db:1.0.0
    container_name: sample-db
    privileged: true
    environment:
      MYSQL_ROOT_PASSWORD: "password"
    volumes:
      - ./data/mysql:/var/lib/mysql
Dockerfile
FROM mysql:5.7.17

COPY ./conf/custom.cnf /etc/mysql/mysql.conf.d/custom.cnf
custom.cnf
[mysqld]
transaction-isolation = READ-COMMITTED

character-set-server = utf8mb4
collation-server = utf8mb4_bin
skip-character-set-client-handshake

実行

$ vagrant up
$ ansible-playbook -i hosts site.yml

確認

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

スクリーンショット 2017-09-27 23.03.28.png

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

ansible-containerはより、こっちの方が楽ですね。

github サンプル