ブログ
AnsibleをDocker環境に対して実行してみる
こんにちは、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の「Docker Machine」を使って「VirtualBox」上に「Dockerホスト」という仮想サーバを作成し、
その「Dockerホスト」上に「Dockerコンテナ」を作成する。
さらに、その「Dockerコンテナ」に対して、今回はApacheをインストールして、動作確認を実施する。
その一連の作業を、Ansibleを使って対応します。
作業の前提条件として、自PCには作業環境が整っている事が必要となります。
自PC上に「Docker Machine」を使って、「Dockerホスト」を作成し、自PCから「Dockerホスト」に接続出来るか確認する。
$ docker-machine create --driver virtualbox test-docker
$ docker-machine status test-docker 〜〜(出力内容)〜〜 Running 〜〜(上記のように何かしらのステータスが出力すれば成功)〜〜
$ docker-machine start test-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 〜〜(上記が出力すれば成功)〜〜
$ eval $(docker-machine env test-docker)
$ docker info 〜〜(出力内容)〜〜 Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 〜〜(以下は省略。上記のように出力すれば成功。)〜〜
$ docker-machine ssh test-docker 〜〜(出力内容)〜〜 ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\_______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| Boot2Docker version 1.12.1, build ************************ Docker version 1.12.1, build ********* docker@test-docker:~$ 〜〜(上記が出力すれば成功)〜〜
Dockerホスト「test-docker」にはデフォルトでDocker環境は整っているので、
追加としてAnsibleを使うための設定をDockerホストに設定する。
ここでの作業は、Dockerホスト上での作業となり、ログインユーザ「docker」で作業していきます。
$ docker images 〜〜(出力内容)〜〜 REPOSITORY TAG IMAGE ID CREATED SIZE 〜〜(以上。Dockerホストにdocker imageが存在しないため何も出力しない。)〜〜
$ docker ps 〜〜(出力内容)〜〜 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 〜〜(以上。DockerホストにDockerコンテナが存在しないため何も出力しない。)〜〜
$ tce-load -wi python 〜〜(出力内容省略。以下は最期の部分。)〜〜 python.tcz 100% |**********************************************************| 7980k 0:00:00 ETA python.tcz: OK 〜〜(上記が出力すれば成功)〜〜
$ python --version 〜〜(出力内容)〜〜 Python 2.7.10 〜〜(上記のようにバージョンが出力すれば成功)〜〜
$ 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 〜〜(上記が出力すれば成功)〜〜
$ 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 〜〜(上記が出力すれば成功)〜〜
$ sudo ln -s /usr/local/bin/python /usr/bin/python
$ 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」(タイニー・コア・リナックス)らしい。
自PCからDockerホストに対してAnsibleを実行するため、自PCのAnsibleを設定し、実行する。
$ mkdir -m 777 ~/doc-ansible
$ cd ~/doc-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 〜〜(以上)〜〜
$ vi hosts 〜〜(以下を記載)〜〜 [docker_hosts] test-docker [containers] aws_web01 〜〜(以上)〜〜
$ vi ansible.cfg 〜〜(以下を記載)〜〜 [defaults] hostfile = ./hosts [ssh_connection] ssh_args = -F ssh_config scp_if_ssh = True 〜〜(以上)〜〜
$ ansible docker_hosts -m ping 〜〜(出力内容)〜〜 test-docker | SUCCESS ⇒; { "changed": false, "ping": "pong" } 〜〜(上記が出力すれば成功)〜〜
Dockerホスト上にDockerコンテナ「aws_web01」を作成し起動させるため、
ansible-playbookを作成し自PCから実行する。
今回は見やすいように、1ファイルのplaybookにまとめています。
$ cd ~/doc-ansible
$ ls 〜〜(出力内容)〜〜 ansible.cfg hosts ssh_config 〜〜(上記が出力すれば成功)〜〜
$ 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 〜〜(以上)〜〜
$ 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 〜〜(上記が出力すれば成功)〜〜
$ 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 〜〜(上記のように出力すれば成功)〜〜
⑥$ docker images 〜〜(出力内容)〜〜 REPOSITORY TAG IMAGE ID CREATED SIZE amazonlinux latest 5b52b314511a 20 seconds ago 292.3 MB 〜〜(上記のように出力すれば成功)〜〜
※補足:「Docker」モジュールは非推奨(wariningが出力する)のため、「docker_container」モジュールを使用しています。
ここから新機能「Docker Connection Plugin」の出番です。
Dockerホスト上のDockerコンテナ「aws_web01」に対してApacheをインストールするため、
ansible-playbookを作成し、自PCから実行する。
$ cd ~/doc-ansible
$ ls 〜〜(出力内容)〜〜 ansible.cfg docker.yml hosts ssh_config 〜〜(上記が出力すれば成功)〜〜
$ 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 〜〜(以上)〜〜
$ 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 〜〜(上記が出力すれば成功)〜〜
$ 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 〜〜(上記のように出力すれば成功)〜〜
目的どおりDockerを使用して開発環境を構築出来ました。
また、Ansibleも使用出来るようになりましたので、Ansibleを使ってのテストも今後可能となります。
これで「Dockerfile」を使わずに、ansible-playbookだけで問題なさそうです。
もう少し手を加えたいところは、「Dockerホスト」に対しての「Python」など追加作業も、
ansible化して手間を省きたいと思いました。
関連記事
2024.09.30
2024.09.30
2024.04.08