そういえばAnsibleのテストで、毎回vagrantを使っていたんですが、どうせなら検証環境はdockerのコンテナで自動的にコンテナが立ち上がって勝手にパッケージインストールして….みたいなことをしたいと思い、いろいろ調べたところ。。Ansible 2.0からDocker Connection Pluginという、Docker Remote APIを利用したコンテナのプロビジョニングが可能となったので、
一通りやってみました。
■そもそもDocker Connection Pluginってなに
通常sshを使って対象となるホストにAnsibleが接続するんですが、Connection Pluginを使うことで、接続方式を切り替えることができるようになったそうです。以前はlost connectionを使用したり、sshdをインストールして設定する必要がなくなったので、非常に便利になりました。(その以前を使っていないからなんとも言えないw)Ansible実行環境からDockerホストへRemote APIを実行できる環境であれば、
Dockerコンテナでsshdを起動しておく必要がない!
■環境
1 2 3 4 5 |
# docker -v Docker version 1.11.2, build b9f10c9 $ docker-machine -v docker-machine version 0.7.0, build a650a40 |
■ローカルでansibleインストール
Macにansible最新バージョンをgithubからもらってきましょう。
1 2 3 |
$ pip install git+https://github.com/ansible/ansible.git or $ brew install ansible |
・確認
1 2 3 4 |
$ pip list |grep ansible ansible (2.2.0) or $ ansible --version |
■Dockerホスト環境設定
1 |
$ eval "$(docker-machine env adachin-docker01)" |
・確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 4 Server Version: 1.11.2 Storage Driver: aufs Root Dir: /mnt/sda1/var/lib/docker/aufs Backing Filesystem: extfs Dirs: 36 Dirperm1 Supported: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge null host Kernel Version: 4.4.12-boot2docker Operating System: Boot2Docker 1.11.2 (TCL 7.1); HEAD : a6645c3 - Wed Jun 1 22:59:51 UTC 2016 OSType: linux Architecture: x86_64 CPUs: 1 ~省略~ |
■Ansibleイベントファイル作成
1 2 3 4 5 6 |
$ vim hosts [docker_host] adachin-docker01 [container] test-container |
1 2 3 4 5 6 7 |
$ vim ssh_config Host adachin-docker01 HostName 192.168.99.100 User docker UserKnownHostsFile /dev/null IdentityFile ~/.docker/machine/machines/adachin-docker01/id_rsa StrictHostKeyChecking no |
1 2 3 4 5 6 7 |
$ vim ansible.cfg [defaults] inventory = hosts [ssh_connection] ssh_args = -F ssh_config scp_if_ssh = True |
※/etc/ansible or /usr/local/etc/ansible/にhostsをコピーして上げてください。ansibleディレクトリがない場合は作りましょう。他にも新しいコンテナもプロビジョニングしたい場合も追記しましょう。(ansibleのplaybookが見に行かないので)
■Dockerホストに接続できるか確認
その前に・・・DockerホストにPythonが入っていないのでインストールします。
・Pythonのインストール
1 |
docker@adachin-docker01:~$ tce-load -wi python |
1 2 |
docker@adachin-docker01:~$ python --version Python 2.7.10 |
1 |
docker@adachin-docker01:~$ curl https://bootstrap.pypa.io/get-pip.py | sudo python - |
1 2 |
docker@adachin-docker01:~$ sudo pip install docker-py ⇛あとでansible実行時にエラーが出るのでこれもインストール |
1 2 |
docker@adachin-docker01:~$ sudo ln -s /usr/local/bin/python /usr/bin/python ⇛シンボリックリンク設定します |
・これで接続確認
1 2 3 4 5 |
$ ansible -i hosts adachin-docker01 -m ping adachin-docker01 | SUCCESS = { "changed": false, "ping": "pong" } |
※pythonがインストールできない場合
そもそもtce-load -wi pythonしたときにtinycorelinux.netからダウンロードしているのですが、結構な頻度で落ちている場合があります。他にもやり方があるので、以下にまとめます。
・スクリプトの作成
1 |
$ chmod +x python-install.sh |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
VERSIONS=${VERSIONS:-"2.7.8.10"} | |
# make directory | |
mkdir -p /opt/bin | |
cd /opt/bin | |
wget http://downloads.activestate.com/ActivePython/releases/${VERSIONS}/ActivePython-${VERSIONS}-linux-x86_64.tar.gz | |
tar -xzvf ActivePython-${VERSIONS}-linux-x86_64.tar.gz | |
mv ActivePython-${VERSIONS}-linux-x86_64 apy && cd apy && ./install.sh -I /opt/bin/python/ | |
ln -s /opt/python/bin/easy_install /bin/easy_install | |
ln -s /opt/python/bin/pip /bin/pip | |
ln -s /opt/python/bin/python /bin/python | |
ln -s /opt/python/bin/virtualenv /bin/virtualenv | |
ln -s /opt/python/bin/python /usr/bin/python |
・実行
1 |
$ sudo /bin/sh ./pythoninstall.sh |
これで問題なし。
■Ansible Playbookの作成とDocker Connection Pluginを使ってプロビジョニング
テストとしてテストコンテナが自動で立ち上がり、かつApacheもインストールして起動するかやってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ vi docker-site.yml --- - hosts: adachin-docker01 become: yes remote_user: docker tasks: - name: deploy centos container docker: image=centos:centos6 name=test-container ports=80:80 expose=80 tty=yes - hosts: test-container connection: docker #Docker Connection Pluginを使用する場合は挿入 tasks: - name: install packages yum: name={{item}} state=installed with_items: - httpd - name: start services service: name={{item}} enabled=yes state=started with_items: - httpd |
・実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ ansible-playbook docker-site.yml PLAY *************************************************************************** TASK [setup] ******************************************************************* ok: [adachin-docker01] TASK [deploy centos container] ************************************************* changed: [adachin-docker01] PLAY [test-container] ************************************************************ TASK [setup] ******************************************************************* ok: [test-container] TASK [install packages] ******************************************************** changed: [test-container] (item=[u'httpd']) TASK [start services] ********************************************************** changed: [test-container] (item=httpd) PLAY RECAP ********************************************************************* docker01 : ok=2 changed=1 unreachable=0 failed=0 test-container : ok=3 changed=2 unreachable=0 failed=0 |
・ちゃんとコンテナが立ち上がっているか確認
1 2 3 |
root@adachin-docker01:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9fbc512669a2 centos:6 "/bin/bash" 54 minutes ago Up 54 minutes 0.0.0.0:80-80/tcp test-container |
・ブラウザで確認
http://192.168.99.100:8080/
apacheが立ち上がっていればOK
■まとめ
Dockerを使ってansibleのテストが可能になったので満足!Docker本番運用の場合でもDockerfile使わなくてもAnsibleで問題なさそうですね。でも、docker attachができない・・・openssh-serverいれてdockerホストからsshすれば問題ないけど!docker execコマンドでも入れたわ!
1 2 |
$ docker exec -it name /bin/bash こんな感じ |
参考:http://tdoc.info/blog/2015/12/03/docker_connection_plugin.html
http://dev.classmethod.jp/server-side/os/ansible-docker-connection-plugin/
0件のコメント