【備忘録】Ansibleでdockerプロビジョニングを根本的に勘違いしていた

■はじめに

以前のエントリでAnsibleでのプロビジョニングを行っていたのですが、根本的に勘違いをしていたので今回のエントリはその対応エントリになります。

■何が問題だったのか

ボクはサーバプロビジョニングで単純にdocker-engineを仕込んでしまえばとりあえず問題ないだろうと思って、

    - name: docker再インストール # apt-get install 再び
      apt:
        name:
          - docker-ce=5:19.03.11~3-0~ubuntu-bionic
          - docker-ce-cli=5:19.03.11~3-0~ubuntu-bionic
          - containerd.io

という記述をしていたのですが、結論から言って全く無意味なことやってました。

というのは、別にubunts内にdocker仕込んでもAnsibleがそれを介して実行するかということとは全く別だからです。

■何が起こったか

今回新しくplaybookに以下の記述を追加しました。

    - name: chromeブラウザのpull
      docker_image:
        name: selenoid/vnc_chrome:83.0
        source: pull

これはAnsibleでのdocker用モジュールです。単純にimageをpullしてくるだけですね。

これを実行するとどうなるか。

TASK [chromeブラウザのpull] ******************************************************************************************************************************
fatal: [FQDN]: FAILED! => {"changed": false, "msg": "Failed to import the required Python library (Docker SDK for Python: docker (Python >= 2.7) or docker-py (Python 2.6)) on VM名's Python /usr/bin/python. Please read module documentation and install in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter, for example via `pip install docker` or `pip install docker-py` (Python 2.6). The error was: No module named requests.exceptions"}


pipからdockerをインストールしろ、と怒られます。
そう、Ansibleのdockerモジュール操作ではdocker-SDK for pythonが前提となっているようなのです。

docs.ansible.com

■対応方法

改めて公式ページを確認しつつ、まずはpython-pipをインストールします。

    - name: 基本インストール # apt-get installはこれ
      apt:
        name:
          - apt-transport-https
          - ca-certificates
          - curl
          - gnupg-agent
          - software-properties-common
          - python-pip # この行を追加


次にdockerをpipからインストールします。

    - name: dockerのインストール Ansible用
      pip:
        name: docker


実行しましょう。

TASK [chromeブラウザのpull] ******************************************************************************************************************************
changed: [FQDN]
PLAY RECAP ******************************************************************************************************************************************
FQDN : ok=19   changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  


行きましたね。
Ansibleでのプロビジョニングをする場合、今までの文脈をそのままモジュールに置き換えても動かないんですね。。
(冷静に考えれば当たり前なんですが)
逆にAnsibleのインターフェースが用意されているものは、素直にAnsibleのお作法に従っていれば、今まで色々コマンド打っていた部分はかなり楽になるとも思いました。

ではでは。