Ansible:docker_containerモジュールを使ってみた
AnsibleでDockerコンテナを実行したいと思って調べていたらdocker_containerモジュールなるものを見つけました。
ドキュメントを見るとオプションの多さに面食らいます…
ひとまず、細かいオプションは置いておいてコンテナを起動してみました。
準備
docker_containerモジュールを使うための大前提として、ターゲットホスト上にdockerがインストールされていなければなりません。(dockerのインストール方法については割愛)
また、pythonからdockerを操作するためのDocker SDKをインストールする必要があります。Docker SDKはpipでインストールできます。
$ pip install docker
※公式ドキュメントにも記載されていますが、Python2.6を使う場合は「pip install docker」ではなく「pip install docker-py」する必要があります。
コントロールノード側では、community.generalというコレクションのインストールが必要です。
$ ansible-galaxy collection install community.general Process install dependency map Starting collection install process Installing 'ansible.netcommon:1.4.1' to '/home/muknow/.ansible/collections/ansible_collections/ansible/netcommon' Installing 'google.cloud:1.0.1' to '/home/muknow/.ansible/collections/ansible_collections/google/cloud' Installing 'community.general:1.3.1' to '/home/muknow/.ansible/collections/ansible_collections/community/general' Installing 'community.kubernetes:1.1.1' to '/home/muknow/.ansible/collections/ansible_collections/community/kubernetes'
nginxコンテナを起動する
nginxを立ち上げる簡単なプレイブックを書きました。コンテナ側の80番ポートをホスト側の8080番ポートにフォワーディングしています。
ちなみに、ansible_python_interpreterを使ってpythonバージョンを指定しています。今回の環境では、リモートホストはpyenvを使いpythonの環境を分けています。Docker SDKがインストールされたpython環境で、Ansibleがコマンド実行できるようにするため、ansible_python_interpreterで環境を指定しています。
--- - hosts: all become: yes become_method: su tasks: - name: Create nginx community.general.docker_container: name: nginx image: nginx:latest state: started container_default_behavior: compatibility network_mode: bridge published_ports: 0.0.0.0:8080:80 vars: ansible_python_interpreter: /root/.pyenv/versions/3.8.1/bin/python
以下がプレイブックの実行結果です。
ansible-playbook -i hosts run_nginx.yml PLAY [all] ************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************** ok: [CentOS7.6] TASK [Create nginx] ***************************************************************************************************************************** changed: [CentOS7.6] PLAY RECAP ************************************************************************************************************************************** CentOS7.6 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
リモートホスト側で「docker ps」した結果が以下です。起動成功してそうです。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d9f0b5bc6c23 nginx:latest "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp nginx