無能が苦悩したメモ

無能な著者が学んだことを忘れないための覚え書きです...

Ansible:docker_containerモジュールを使ってみた

AnsibleでDockerコンテナを実行したいと思って調べていたらdocker_containerモジュールなるものを見つけました。

docs.ansible.com


ドキュメントを見るとオプションの多さに面食らいます…
ひとまず、細かいオプションは置いておいてコンテナを起動してみました。

実行環境

コントロールノード

  • Ansibleバージョン: 2.10.4
  • Pythonバージョン: 3.7

リモートホスト

  • Dockerバージョン: 19.03.8
  • Docker APIバージョン: 1.40
  • Docker SDK for Python: 4.4.1
  • Pythonバージョン: 3.8

準備

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