はじめに
通常dockerコンテナを構築する際、イメージのビルドの為にdockerfileの記述を行います。
しかしながら、イメージレイヤーを減らすためにRUNにAND演算子をひたすら繋げたコマンドを記述する必要があるため、
少々処理が追いにくくなることが難点です。
また、ansible用のロールをコンテナに適用する事を考えたときに、いちいち処理を書き直すのは面倒だなー…と
思っていた矢先にAnsibleのConnection Pluginの存在を知りました。
Connection Plugin
簡単に言えば、Ansibleサーバーとリモートホストの接続方式を切り替えられるプラグインのことです。
デフォルトではAnsibleサーバーとリモートホストの接続はsshが用いられますが、
Ansible 2.0からはdockerコンテナと接続できるDocker Connection Pluginも用意されていました。
ので、今回はこちらのプラグインを使用してみたいと思います。
詳しくは以下の参考元などをご覧ください。
ちなみにdocker connection pluginを使用する際は、connection: docker
を指定すれば良いとのことです。
実行例
例に倣ってとりあえず試してみました。
環境
項目名 | バージョン |
---|---|
CentOS | 7.3.1611 |
ansible | 2.3.1.0 |
pip | 9.0.1 |
手順
-
Ansible(=>2.0)をインストール
# yum install openssl-devel python-devel # pip install ansible
-
docker-pyをインストール
# pip install docker-py
-
以下のようにrole,playbookを記述
今回は単純にCentOS6のベースイメージから作成したコンテナ上に、某界隈で有名なslをインストールしてみます。tree. |-- ansible.cfg |-- playbook | `-- docker | `-- test.yml `-- roles |-- docker | `-- docker-run | |-- defaults | | `-- main.yml | `-- tasks | |-- docker_run.yml | `-- main.yml |-- remi | `-- tasks | |-- epel.yml | `-- main.yml `-- sl `-- tasks |-- main.yml `-- sl.yml
ansible.cfg[defaults] roles_path = roles
playbook/docker/test.yml--- - hosts: localhost connection: local roles: - { role: docker/docker-run } - hosts: test connection: docker roles: - { role: epel } - { role: sl }
roles/docker/docker-run/defaults/main.ymldocker_image: centos:6.9 docker_hostname: test
roles/docker/docker-run/tasks/docker_run.yml--- - name: Dockerコンテナ起動 docker_container: image={{ docker_image }} name={{ docker_hostname }} detach=yes tty=yes command=/bin/bash - name: Dockerコンテナをホストとして追加 add_host: name={{ docker_hostname }}
roles/remi/tasks/epel.yml--- - name: "epel install" yum: name=epel-release
roles/sl/tasks/sl.yml--- - name: "sl install" yum: name=sl state=latest enablerepo=epel
-
ansible-playbook
# ansible-playbook playbook/docker/test.yml
-
コンテナ内で確認
# docker exec -ti test /bin/bash [root@b3a5b2f0ebe1 /]# sl (@@) ( ) (@) ( ) @@ () @ O @ O @ ( ) (@@@@) ( ) (@@@) ==== ________ ___________ _D _| |_______/ \__I_I_____===__|_________| |(_)--- | H\________/ | | =|___ ___| _________________ / | | H | | | | ||_| |_|| _| \_____A | | | H |__--------------------| [___] | =| | | ________|___H__/__|_____/[][]~\_______| | -| | |/ | |-----------I_____I [][] [] D |=======|____|________________________|_ __/ =| o |=-~~\ /~~\ /~~\ /~~\ ____Y___________|__|__________________________|_ |/-=|___|=O=====O=====O=====O |_____/~\___/ |_D__D__D_| |_D__D__D_| \_/ \__/ \__/ \__/ \__/ \_/ \_/ \_/ \_/ \_/
上記のようにslが走り出したら、成功です!
参考元
Ansible公式:Developing Plugins
Ansible Docker Connection Pluginを使う