ブロックチェーン・AI・システム開発の株式会社INDETAIL

AnsibleとDocker Composeの相性問題に気づいた話

2017.03.13
tacck

札幌の雪もだいぶ溶けてきて、春が近づいてきていることを実感しているtacckです。
本州だとスギ花粉の時期ですね。北海道にはスギ花粉はありませんが、白樺花粉での花粉症はあるそうですよ。

さて、今回は久しぶりにAnsible+Dockerネタです。

個人的に長いことさくらインターネットさんのVPSを契約しているのですが、しばらく活用していませんでした。

そこで、Dockerで遊ぶ環境を作ろうと思い立って色々と作業してみて、タイトル通りAnsibleDocker Composeの相性問題が発生したので、その点をまとめてみます。

余談: AnsiblePlaybookにしておくことで、サーバ環境を「何度でも元の状態」に手軽に構築できるようになります。
Ansible自体については、私の過去の記事もご覧ください。

環境

Ansible実行マシン(ホスト)

macOS Sierra: 10.12.3
Ansible: 2.2.1.0
Python: 2.7.13

セットアップ対象マシン(リモートサーバ)

Ubuntu: 16.04
Python: 2.7.12

やること

今回は、作成したファイルをGitHubのリポジトリに格納しています。
(inventoryファイルは入れていません。)

今回の実行に必要なファイルリストは、下記です。

接続するリモートサーバの情報を、inventoryファイルに記載します。

実行するロールをmain.ymlに記載します。

今回は、システムのアップデート(system_update)をし、Dockerをインストールし(docker)、
ついでにDockerの管理システムであるPortainer(portainer)のインストールまで行ないます。

この、Portainer自身もDockerのコンテナでインストールできます。便利ですね。

下記のようにコマンドを実行すれば、セットアップを実行できます。
オプションの-kKとしているのは、SSH接続時のパスワードと、sudo実行時のパスワードを入力するためです。

Dockerのインストール

このロールでは、パッケージ管理可能な状態でインストールを行なっています。
Ansibleのモジュールとしてはaptpipを使うことで、これを実現しています。

Dockerだけでなく、コンテナ間の連携を行ないやすくするためのDocker Composeもここではインストールしています。

PortainerのインストールとDocker Composeの利用で問題発生

本来であれば、Ansibleのモジュールdocker_containerを使ってDockerのコンテナを構築できます。
ただし、今回はこれを使うことで問題が発生しました。

docker_containerモジュールは、リモートサーバにdocker-pyというpipでインストール可能なパッケージが必要です。
(参照: docker_container Requirements)

しかし、今回インストールしたDocker Composeは、docker-pyがインストールされていると使えない、という仕様になっています。
(参照: https://github.com/docker/docker-py/issues/1395)

当初はdocker_containerを使ってロールを作成したのですが、環境構築後にリモートサーバでdocker-composeを実行するとエラーが発生しました。

そのエラーメッセージでdocker-pyというパッケージをアンインストールしてね、と出たのですが、これをアンインストール(ロールでインストールしないように調整)するとdocker_containerが実行できない、、、という事態になりました。

というわけで、今回Portainerについては、shellモジュールを使ってインストールすることにしました。

まとめ

目的は達成したのですが、どうやら現時点ではAnsibleDocker Composeの相性がイマイチということがわかりました。
docker_containerDocker ComposeもDockerコンテナ管理の仕組みなので、どちらか一方に集中させておいた方が良さそうです。

ということで、今回はDocker Composeを使うことを優先させて環境構築を行ないました。
意外なところで相性問題というのも発生するものです。みなさまもお気をつけください。

関連タグ:

tacck Takuya KIHARA

エンジニア (モバイルアプリ、フロントエンド、バックエンド、インフラ) 得意なことは、領域をまたいで考え、開発すること。 ブログでは、主にAnsible、Docker、Raspberry Piのことを書いています。 好きなフィギュアスケートの技は、スプレッド・イーグルです。