Ansible と Docker Compose

少し前に、Ansible 2.0 がリリースされ、Dockerなどが標準サポートされました。
これを使うことで、Docker Compose で行っていたような、コンテナの上げ下げができるようになりました。

…が、ここで問題は、 Docker Compose とのすみわけをどうすればいいか、ということでした。
いっそ、サービスの記述は Docker Compose で行い、それの上げ下げを Ansibleでできればいいなぁ・・・と思ってました。

そしたら、今月頭リリースされた Ansible 2.1 で Docker Compose の操作がサポートされました。モジュール名は docker_service です。

というわけで試してみました。
結構やっつけで作ったので、もう少しいい書き方がありそうですが、そこは今後 Ansible力/Docker力 がついたら書き直してみます。

  • 前提
    • 題材: Minecraft サーバを起動・終了する
    • 操作側: Windows 10 / Cygwin64 / Ansible 2.1
    • 被操作側: Arch Linux, Docker 1.11.2 / Docker Compose 1.8.0-rc1

操作側 (Windows 10 / Cygwin)

まず、docker_service に docker-compose のバインディングが必要になるため、操作側でインストールしておきます。

% pip2 install docker-compose

あとは適当なディレクトリにこんな感じでファイルを置いていきます。

├── ansible.cfg
├── hosts
└── start_minecraft.yml
[defaults]
hostfile = ./hosts
transport = paramiko
retry_files_enabled = False

Cygwinで、AnsibleをSSH経由で利用するためには transport = paramiko (コマンドラインから指定するには -c paramiko)が必要になります。あと、失敗した場合に retry ファイルができるのが鬱陶しかったので作成されないようにしてみました。

[localdev]
192.168.0.100
- name: "Start Minecraft"
  hosts: localdev
  user: user_name
  vars:
      ansible_python_interpreter: python2
  tasks:
      - name: "Up minecraft server"
        docker_service:
            project_src: "/var/compose/minecraft"
            docker_host: '127.0.0.1:2375'
            state: present

ansible_python_interpreter は ArchLinuxをAnsibleで操作するために必要(AnsibleはPython2 を前提としますが、Arch Linux の既定のPythonは Python3 のため)。
また、今使用しているDocker環境はSocketでつなぐように設定しているため、docker_host も設定しておきます。

ちなみに、 state: absent であるファイルを用意すれば、サービスの停止ができます。

被操作側 ( Arch Linux )

Arch Linux を Ansible で操作するには Python2 が必要です(インストール方法は割愛)。

ここは、普通に Docker Compose でMinecraft サービスを記述していきます。

├── docker-compose.yml
└── recipe
    ├── Dockerfile
    └── eula.txt
server:
    build: recipe/
    volumes:
        - ./work:/work
    ports:
        - 25565:25565

今回は、自前でDockerfile を作るので、 build を指定します。もし、Docker Hub からありもののイメージを取得する場合は、 image: …. と指定すればよいです。

FROM pottava/java:8
MAINTAINER naou <monaou@gmail.com>

RUN mkdir /minecraft
ADD https://s3.amazonaws.com/Minecraft.Download/versions/1.9.4/minecraft_server.1.9.4.jar /minecraft/server.jar
COPY eula.txt /minecraft/eula.txt
RUN mkdir /work
WORKDIR /work
VOLUME /work
EXPOSE 25565
CMD cp /minecraft/eula.txt /work/eula.txt && java -jar /minecraft/server.jar nogui

やっつけで作った Minecraft Server のレシピ。

#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#Wed May 25 12:56:08 UTC 2016
eula=true

そして、Minecraft server を立ち上げるためには EULA(MINECRAFT END USER LICENSE AGREEMENT)への同意が必要なので、その意思表明をしたファイルを用意します。

動かしてみる

これで、あとは被操作側から、

ansible-playbook start_minecraft.yml

で起動できます!
あとは同じ手口で、いろんなサービスをAnsible経由で上げ下げできます。

余談…

完全な余談ですが、CygwinにAnsible をインストールしようとしたところ、いくつか問題に当たったので備忘録。

apt-cyg install openssl-devel libffi6 libffi-devel python-crypto
easy_install-2.7 pip
pip install ansible

詳細は割愛しますが、Ansibleインストール中にあれがない、これがない、ビルドに失敗・・・といろいろ問題起こすので、
上記の通り、 openssl-devel libffi6 , libffi-devel, python-crypto をあらかじめインストールしておくとうまくいくようです。
(apt-cyg を利用していない環境の場合は setup.exe でインストールできます)

コメント

タイトルとURLをコピーしました