少し前に、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 でインストールできます)
コメント