[Ansible]DockerコンテナとEC2混在環境をインベントリで管理する

2016.04.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチーハ、千葉です。

今日はDockerコンテナとEC2が混在している環境をインベントリで管理してみます。

といってもそんなに難しくありません。

まずは、ansible.cnfでssh_configを設定するを参考にEC2環境ホストのセットアップをします。

EC2向けの設定

ssh_config

Host ec2-1
User ec2-user
HostName xxx.xxx.xxx.xxx
IdentityFile xxx.pem

Host ec2-2
User ec2-user
HostName xxx.xxx.xxx.xxx
IdentityFile xxx.pem

Host ec2-3
User ec2-user
HostName xxx.xxx.xxx.xxx
IdentityFile xxx.pem

ansible.cfg

[ssh_connection]
ssh_args = -F ssh_config

hosts

[ec2]
ec2-[1:3]

疎通確認してみます。

local$ ansible all -i hosts -m ping
ec2-2 | success >> {
    "changed": false,
    "ping": "pong"
}

ec2-3 | success >> {
    "changed": false,
    "ping": "pong"
}

ec2-1 | success >> {
    "changed": false,
    "ping": "pong"
}

できました!

Docker向けの設定

次にDockerコンテナです。今回は、Mac上にDocker ToolBox上でコンテナを起動します。

local$ docker run -itd --hostname docker-1 --name docker-1 centos:centos6 /bin/bash
local$ docker run -itd --hostname docker-2 --name docker-2 centos:centos6 /bin/bash
local$ docker run -itd --hostname docker-3 --name docker-3 centos:centos6 /bin/bash

local$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4cebf1ce2f02        centos:centos6      "/bin/bash"         2 seconds ago       Up 2 seconds                            docker-3
4ad51cdd93ef        centos:centos6      "/bin/bash"         3 seconds ago       Up 2 seconds                            docker-2
6331eadbce40        centos:centos6      "/bin/bash"         48 seconds ago      Up 47 seconds                           docker-1

インベントリにDockerコンテナを追加します。

[ec2]
ec2-[1:3]


docker-[1:3] ansible_connection=docker

ポイントは、接続の種類にdocker pluginでの接続を指定します。

こちらのように、playbook側にconnection: dockerを指定することでも可能ですが、インベントリに接続の種類を指定した方がplaybook側で意識しなくて良く、またansibleコマンドでのモジュールの実行も可能となります。

接続確認してみます。

ansible all -i hosts -m ping
docker-1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
ec2-1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
ec2-3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
ec2-2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
docker-3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
docker-2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

できました。

まとめ

Ansibleを利用することにより、EC2とDockerコンテナの構成管理を行うことができます。

また、開発環境はDockerコンテナ、本番環境はEC2のような構成でもインベントリでコネクションの種類を指定するだけで同じplaybookが実行できます。

Ansible素敵です。