logo-sm

お問い合わせは Webフォームから

ブログ

AnsibleをDocker環境に対して実行してみる

2017.01.30

はじめに

こんにちは、SAITOです。

もう今年も終わり近づいて来ましたね。
1年を振り返ると、自分自身に経験がない事に挑戦する事が多かったですが、
自分の身にはなったなぁと実感出来た2016年でした。

今回は、今年最期に挑戦したDocker関連を自分なりに調べながら内容をまとめましたので、
それを載せて頂きます。

概要

Ansibleバージョン2.0からの新機能「Docker Connection Plugin」を使用して、Dockerコンテナを作成するというものです。

もともと開発環境に対してAnsibleとVagrantのペアを使っていましたが、Dockerを使うプロジェクトも出てきたため、AnsibleとDockerのペアを試しました。
ただ、Dockerを使うにあたり、dockerfileを一から作成するのが大変なのと、構成管理ツールはAnsibleで統一したいという思いがあり、
また、本番環境でも使用できるansible-playbookを作成するために、開発環境のDockerでテストしたいという考えもありましたので、
今回のチャレンジに至りました。

では、新機能の「Docker Connection Plugin」を簡単に説明しますと、
Ansibleの接続方式を切り替える事によって、対象サーバにAnsibleが実行できるようにするというものです。
Ansibleは通常sshを使って接続するため、Dockerコンテナにはsshを設定しておく必要がありますが、
「Docker Connection Plugin」を使用する事によって、Dockerコンテナでsshを設定しておく必要がなく、
Ansibleを使用できるようにあります。

作業環境 (私の場合)

  • 自PC=Ansible実行環境(MacOS Sierra 10.12)
    • Ansible (2.2)
    • VirtualBox (5.0.26)
    • Docker for Mac (1.12.1、build: 12133)
    • Python (3.4.3)
  • Docker for Mac
    • Docker Machine (0.8.1、build 41b3b25)
  • docker images
    • amazonlinux

作業内容

自PCの「Docker Machine」を使って「VirtualBox」上に「Dockerホスト」という仮想サーバを作成し、
その「Dockerホスト」上に「Dockerコンテナ」を作成する。
さらに、その「Dockerコンテナ」に対して、今回はApacheをインストールして、動作確認を実施する。
その一連の作業を、Ansibleを使って対応します。

作業の前提条件として、自PCには作業環境が整っている事が必要となります。

Dockerホストを作成する

自PC上に「Docker Machine」を使って、「Dockerホスト」を作成し、自PCから「Dockerホスト」に接続出来るか確認する。

  1. 自PCにて、Dockerホストを作成する。今回は名称を「test-docker」とします。
$ docker-machine create --driver virtualbox test-docker
  1. Dockerホストの状態を確認する。
$ docker-machine status test-docker
〜〜(出力内容)〜〜
Running
〜〜(上記のように何かしらのステータスが出力すれば成功)〜〜
  1. Dockerホストを起動する。ただし、起動していたら不要です。
$ docker-machine start test-docker
  1. Dockerホストの設定と状態を確認する。
$ docker-machine ls
〜〜(出力内容)〜〜
NAME          ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
test-docker   -        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.1  
〜〜(上記が出力すれば成功)〜〜
  1. 環境変数にDockerホストの設定を追記する。
$ eval $(docker-machine env test-docker)
  1. Dockerホストに接続出来ているか確認する。
$ docker info
〜〜(出力内容)〜〜
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
〜〜(以下は省略。上記のように出力すれば成功。)〜〜
  1. 自PCからDockerホスト「test-docker」にsshログインする。
$ docker-machine ssh test-docker
〜〜(出力内容)〜〜
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.12.1, build ************************
Docker version 1.12.1, build *********
docker@test-docker:~$ 
〜〜(上記が出力すれば成功)〜〜

Dockerホストに追加構築する

Dockerホスト「test-docker」にはデフォルトでDocker環境は整っているので、
追加としてAnsibleを使うための設定をDockerホストに設定する。
ここでの作業は、Dockerホスト上での作業となり、ログインユーザ「docker」で作業していきます。

  1. Dockerホスト上の「docker image」を確認する。
$ docker images
〜〜(出力内容)〜〜
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
〜〜(以上。Dockerホストにdocker imageが存在しないため何も出力しない。)〜〜
  1. Dockerホスト上の「Dockerコンテナ」の状態を確認する。
$ docker ps
〜〜(出力内容)〜〜
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                           NAMES
〜〜(以上。DockerホストにDockerコンテナが存在しないため何も出力しない。)〜〜
  1. Pythonをインストールする。
$ tce-load -wi python
〜〜(出力内容省略。以下は最期の部分。)〜〜
python.tcz   100% |**********************************************************|  7980k  0:00:00 ETA
python.tcz: OK
〜〜(上記が出力すれば成功)〜〜
  1. Pythonのバージョンを確認する。
    ※ 「which python」を実行すると「/usr/local/bin/python」と出力される。
$ python --version
〜〜(出力内容)〜〜
Python 2.7.10
〜〜(上記のようにバージョンが出力すれば成功)〜〜
  1. pipをインストールする。
    ※ Pythonのパッケージ管理(rubyのgemと同じ)
$ curl https://bootstrap.pypa.io/get-pip.py | sudo python -
〜〜(出力内容省略。以下は最期の部分。)〜〜
Installing collected packages: pip, setuptools, wheel
Successfully installed pip-9.0.1 setuptools-32.3.0 wheel-0.29.0
〜〜(上記が出力すれば成功)〜〜
  1. docker-pyをインストールする。
    ※ python-clientで、Ansible実行に必要になります。
$ sudo pip install docker-py
〜〜(出力内容省略。以下は最期の部分。)〜〜
Building wheels for collected packages: backports.ssl-match-hostname, websocket-client
  Running setup.py bdist_wheel for backports.ssl-match-hostname ... done
  Stored in directory: /root/.cache/pip/wheels/5d/72/36/b2a31507b613967b728edc33378a5ff2ada0f62855b93c5ae1
  Running setup.py bdist_wheel for websocket-client ... done
  Stored in directory: /root/.cache/pip/wheels/d1/5e/dd/93da015a0ecc8375278b05ad7f0452eff574a044bcea2a95d2
Successfully built backports.ssl-match-hostname websocket-client
Installing collected packages: six, docker-pycreds, backports.ssl-match-hostname, ipaddress, requests, websocket-client, docker-py
Successfully installed backports.ssl-match-hostname-3.5.0.1 docker-py-1.10.6 docker-pycreds-0.2.1 ipaddress-1.0.17 requests-2.12.4 six-1.10.0 websocket-client-0.40.0
〜〜(上記が出力すれば成功)〜〜
  1. Pythonの実行PATHのシンボリックリンクを張る。
    ※ Ansibleが「/usr/bin/python」を参照するため、これを設定しないとansibleコマンドでエラーが発生する。
$ sudo ln -s /usr/local/bin/python /usr/bin/python
  1. Pythonの実行PATHを確認する。
$ ls -l /usr/bin/python
〜〜(出力内容)〜〜
lrwxrwxrwx    1 root     root            21 Dec 25 14:19 /usr/bin/python -> /usr/local/bin/python
〜〜(上記が出力すれば成功)〜〜

※補足
DockerホストのOSは、「Tiny Core Linux」(タイニー・コア・リナックス)らしい。

Dockerホスト「test-docker」に、Ansibleを実行する

自PCからDockerホストに対してAnsibleを実行するため、自PCのAnsibleを設定し、実行する。

  1. 自PCに作業用ディレクトリ「doc-ansible」を作成する。
    ※ 今回は、ホームディレクトリ直下に作成する。
$ mkdir -m 777 ~/doc-ansible
  1. 作業用ディレクトリに移動する。
$ cd ~/doc-ansible
  1. 「ssh_config」を新規作成する。
    ※ 今回は、ホームディレクトリ直下に作成する「ssh_config」を、Ansibleで使用する。
$ vi ssh_config
〜〜(以下を記載)〜〜
Host test-docker
  HostName 192.168.99.100
  User docker
  UserKnownHostsFile /dev/null
  IdentityFile ~/.docker/machine/machines/test-docker/id_rsa
  StrictHostKeyChecking no
〜〜(以上)〜〜
  1. インベントリファイル「hosts」を新規作成する。
$ vi hosts
〜〜(以下を記載)〜〜
[docker_hosts]
test-docker

[containers]
aws_web01
〜〜(以上)〜〜
  1. 「ansible.cfg」を新規作成する。
$ vi ansible.cfg
〜〜(以下を記載)〜〜
[defaults]
hostfile = ./hosts

[ssh_connection]
ssh_args = -F ssh_config
scp_if_ssh = True
〜〜(以上)〜〜
  1. ansibleコマンドで、dockerホスト「test-docker」にpingコマンドを実行する。
$ ansible docker_hosts -m ping
〜〜(出力内容)〜〜
test-docker | SUCCESS ⇒; {
    "changed": false, 
    "ping": "pong"
}
〜〜(上記が出力すれば成功)〜〜

Dockerコンテナ「aws_web01」をデプロイするansible-playbookを実行する

Dockerホスト上にDockerコンテナ「aws_web01」を作成し起動させるため、
ansible-playbookを作成し自PCから実行する。
今回は見やすいように、1ファイルのplaybookにまとめています。

  1. 自PCの作業用ディレクトリ「doc-ansible」に移動する。
$ cd ~/doc-ansible
  1. 作成した以下3ファイルが存在する事を確認する。
    ssh_config、 hosts、 ansible.cfg
$ ls
〜〜(出力内容)〜〜
ansible.cfg hosts   ssh_config
〜〜(上記が出力すれば成功)〜〜
  1. ansible-playbook「docker.yml」を新規作成する。
    ※ 今回は、docker imageに「amazonlinux」を使用。
$ vi docker.yml
〜〜(以下を記載)〜〜
---
- hosts: test-docker
  become: yes
  remote_user: docker
  tasks:
    - name: pull and start amazonlinux container
      docker_container: image=amazonlinux:latest name=awd-web01 ports=8080:80 tty=yes
〜〜(以上)〜〜
  1. ansible-playbook「docker.yml」を実行する。
$ ansible-playbook docker.yml
〜〜(出力内容)〜〜
PLAY [test-docker] *************************************************************

TASK [setup] *******************************************************************
ok: [test-docker]

TASK [pull and start amazonlinux container] **************************************
changed: [test-docker]

PLAY RECAP *********************************************************************
test-docker                : ok=2    changed=1    unreachable=0    failed=0   
〜〜(上記が出力すれば成功)〜〜
  1. Dockerホスト上のDockerコンテナ「aws_web01」の状態を確認する。
$ docker ps
〜〜(出力内容)〜〜
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                           NAMES
693249dcf392        amazonlinux:latest   "/bin/bash"              22 seconds ago      Up 21 seconds       0.0.0.0:8080->80/tcp            aws_web01
〜〜(上記のように出力すれば成功)〜〜
  1. Dockerホスト上の「docker image」を確認する。
⑥$ docker images
〜〜(出力内容)〜〜
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
amazonlinux              latest              5b52b314511a        20 seconds ago         292.3 MB
〜〜(上記のように出力すれば成功)〜〜

※補足:「Docker」モジュールは非推奨(wariningが出力する)のため、「docker_container」モジュールを使用しています。

Dockerコンテナ「aws_web01」にApache設定のansible-playbookを実行する

ここから新機能「Docker Connection Plugin」の出番です。
Dockerホスト上のDockerコンテナ「aws_web01」に対してApacheをインストールするため、
ansible-playbookを作成し、自PCから実行する。

  1. 自PCの作業用ディレクトリ「doc-ansible」に移動する。
$ cd ~/doc-ansible
  1. 作成した以下4ファイルが存在する事を確認する。
    ssh_config、 docker.yml、 hosts、 ansible.cfg
$ ls
〜〜(出力内容)〜〜
ansible.cfg docker.yml  hosts   ssh_config
〜〜(上記が出力すれば成功)〜〜
  1. ansible-playbook「docker.yml」に追記する。
    ※ 「connection: docker」の1行を追加すると、Dockerホスト上のDockerコンテナに対して実行される。
$ vi docker.yml
〜〜(以下を最後の行から追記)〜〜
- hosts: aws_web01
  connection: docker
  tasks:
    - name: install any tools
      yum: name={{ item }} state=latest
      with_items:
        - libselinux-python
    - name: install apache
      yum: name={{ item }} state=latest
      with_items:
        - httpd
        - httpd-devel
        - openssh-server
    - name: chkconfig on
       service: name={{ item.name }} enabled={{ item.chkconfig }} state={{ item.s }}
       with_items:
         - { name: 'httpd', chkconfig: 'yes', s: 'started' }
       ignore_errors: yes
〜〜(以上)〜〜
  1. ansible-playbook「docker.yml」を実行する。
$ ansible-playbook docker.yml
〜〜(出力内容)〜〜
PLAY [test-docker] *************************************************************

TASK [setup] *******************************************************************
ok: [test-docker]

TASK [pull and start amazonlinux container] *********************************************
ok: [test-docker]

PLAY [aws_web01] ***************************************************************

TASK [setup] *******************************************************************
ok: [aws_web01]

TASK [install any tools] *******************************************************
changed: [aws_web01] ⇒ (item=[u'libselinux-python'])

TASK [install apache] **********************************************************
changed: [aws_web01] ⇒ (item=[u'httpd', u'httpd-devel', u'openssh-server'])

TASK [chkconfig on] ************************************************************
changed: [aws_web01] ⇒ (item={u's': u'started', u'chkconfig': u'yes', u'name': u'httpd'})

PLAY RECAP ********************************************************************* 
aws_web01                  : ok=4    changed=3    unreachable=0    failed=0   
test-docker                : ok=3    changed=0    unreachable=0    failed=0   
〜〜(上記が出力すれば成功)〜〜
  1. Dockerホスト上のDockerコンテナ「aws_web01」の状態を確認する。
$ docker ps
〜〜(出力内容)〜〜
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                           NAMES
693249dcf392        amazonlinux:latest   "/bin/bash"                      22 seconds ago      Up 21 seconds       0.0.0.0:8080->80/tcp            aws_web01
〜〜(上記のように出力すれば成功)〜〜
  1. 自PCのブラウザ(以下URL)で、apacheの動作確認をする。
    ■URL:http://192.168.99.100:8080/

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-28-16-35-18

まとめ

目的どおりDockerを使用して開発環境を構築出来ました。
また、Ansibleも使用出来るようになりましたので、Ansibleを使ってのテストも今後可能となります。
これで「Dockerfile」を使わずに、ansible-playbookだけで問題なさそうです。

もう少し手を加えたいところは、「Dockerホスト」に対しての「Python」など追加作業も、
ansible化して手間を省きたいと思いました。

関連記事

  • 自宅に構築!仮想環境 ~BIG-IP VE導入編~
    【導入】 前回は、自宅サーバにProxmoxを導入しました。 今回はその上に仮想マシンとしてBIG-IP VE […]

    2024.09.30

  • 自宅に構築!仮想環境 ~Proxmox導入編~
    【導入】 以前から学習用に自宅仮想環境をつくりたく思っていたところ、BIG-IP(の仮想版)に触れる必要が出て […]

    2024.09.30

  • WindowsのWSL2上のDockerでup時に’ContainerConfig’のエラーが出た。
    当社の開発環境はMacとWindowsが混在したDocker上での開発を行っています。なのでMacでOKだけど […]

    2024.04.08

  • パートナー

  • 人材育成・採用情報