AWXで複数バージョンのAnsibleを実行出来るようカスタム仮想環境を用意する

前ふり

yassan.hatenablog.jp

これの続き。

よこちさんに教えてもらったのでやってみた。

前提環境

CentOS:7.8
Python:3.6.8
AWX:15.0.1
カスタム仮想環境のパス:/opt/awx-envs/

AWXはインストーラ使ってセットアップしたdocker-composeで稼働。管理用RDBはAWXと同じ Docker Compose内のServiceとする。
※今回はAWXがどうのこうのは関係ないのでセットアップについては割愛。詳細は、 awx/INSTALL.md at devel · ansible/awx を参照。

結論

出来たけど罠があるので注意。
仮想環境には pip で psutil を入れないとダメ。

詳細

正しい手順は awx/custom_virtualenvs.md at devel · ansible/awx となります。 おそらく、 Feature: custom virtual environment directories by vismay-golwala · Pull Request #3320 · ansible/awx にて仮想環境を変更出来る機能が追加されてたようです。

実施する前に、デフォルトの仮想環境でインストールしているpipをチェック。

$ docker-compose exec task bash
bash-4.4# cat /var/lib/awx/venv/ansible/requirements.txt/requirements.txt 
jinja2
kubernetes ~= 11.0.0
python-string-utils
ruamel.yaml >= 0.15
six

仮想環境の作成

作成したい仮想環境を作成

mkdir /opt/awx-envs/
cd /opt/awx-envs/
python3 -m venv ansible2-7
source ansible2-7/bin/activate

pip install向けに ansible2-7/requirements.txt を作成

cat ansible2-7/requirements.txt
psutil
ansible ~= 2.7.0
jinja2
python-string-utils
ruamel.yaml >= 0.15
six

※ポイントは、最低でもpsutilとansibleは必要です。

pip install実施

pip install -r ansible2-7/requirements.txt

セットアップされたライブラリはこちら。

(ansible2-7) [root awx-envs]# pip freeze
ansible==2.7.18
bcrypt==3.2.0
cffi==1.14.3
cryptography==3.2.1
Jinja2==2.11.2
MarkupSafe==1.1.1
paramiko==2.7.2
psutil==5.7.3
pycparser==2.20
PyNaCl==1.4.0
python-string-utils==1.0.0
PyYAML==5.3.1
ruamel.yaml==0.16.12
ruamel.yaml.clib==0.2.2
six==1.15.0

必要であれば、他にも同様にして、ansible ~= 2.9.0 にした ansible2-7ansible ~= 2.10.0 にした ansible2-10 なども作成する。
※他にも必要なライブラリがあれば入れる。

インストーラでcustom_venv_dirを利用するよう変更

AWXのインストーラの設定( awx/installer/inventory )で、以下のように custom_venv_dirコメントアウトして、custom_venv_dir の設定にフルパスで指定

# AWX custom virtual environment folder. Only usable for local install.
# require: psutil -> sudo yum install gcc python3-devel
custom_venv_dir="/opt/awx-envs/"

インストーラを実行して設定を反映。 AWXのインストール先のdocker-compose.ymlのwebとtaskのserviceに custom_venv_dir で指定したパスをマウントしているのが分かります。

  (略)
         :
  web:
    image: ansible/awx:15.0.1
    container_name: awx_web
    depends_on:
      - redis
      - postgres
    ports:
      - "80:8052"
    hostname: awxweb
    user: root
    restart: unless-stopped
    volumes:
      - supervisor-socket:/var/run/supervisor
         :
      - "/opt/awx-envs/:/opt/awx-envs/:rw"   ・・・・★
         :
  (略)

  task:
    image: ansible/awx:15.0.1
    container_name: awx_task
    depends_on:
      - redis
      - web
      - postgres
    command: /usr/bin/launch_awx_task.sh
    hostname: awx
    user: root
    restart: unless-stopped
    volumes:
      - supervisor-socket:/var/run/supervisor
         :
      - "/opt/awx-envs/:/opt/awx-envs/:rw"   ・・・・★
  (略)

AWXの設定変更

AWXの起動後、AWXのWeb UIで設定。

AWXの「設定」→「システム」にて、下図のようにカスタム仮想環境のパスに /opt/awx-envs を入れて、「保存」ボタンを押下して反映。

f:id:yassan0627:20201101183333p:plain
カスタム仮想環境のパス

次に、設定したカスタム仮想環境を利用したいプロジェクトを選択して、下図のように、「ANSIBLE環境」から利用したいカスタム仮想環境を選択し、「保存」ボタンを押下して反映。

f:id:yassan0627:20201101183441p:plain
プロジェクトの設定

動作確認

使えるか確認。 テンプレートから設定したプロジェクトのジョブテンプレートを選択して実行。

f:id:yassan0627:20201101184913p:plain
実行の確認

環境がカスタム仮想環境になっているのが分かります。

最後に

これまでは、AWXのインストーラで指定する最新のAnsibleバージョンを使い続けなければならず、AWXの更新が大変でした。
今回のカスタム仮想環境を利用することで、実行するAnsibleのバージョンを固定出来るので、頻繁にAWXをアップデートする更新に追随するもの楽になると思います。

注意事項

custom_venv_dirは「フルパス」で1つだけ。

awx/docker-compose.yml.j2 at 17b5b531bf36e337995aa46735c1b598b2e686fb · ansible/awx · GitHub

をみると分かりますが

    volumes:
      - supervisor-socket:/var/run/supervisor
   :
    {% if custom_venv_dir is defined %}
      - "{{ custom_venv_dir +':'+ custom_venv_dir +':rw' }}"    ・・・★
    {% endif %}

docker-composeのテンプレが上のとおり、custom_venv_dirをそのままマウントするのでフルパス指定が必要です。
下手にホームディレクトリのどっかを指定してしまうとハマるかも。無難に /opt とか /var/lib 辺りに作成するのが良いかも。

cf. volumes - Compose file version 2 reference | Docker Documentation

おまけ

他のカスタム仮想環境の設定方法

http://XXXX/api/v2/settings/system/ にアクセスすると設定値が見えます。

f:id:yassan0627:20201101190736p:plain
REST API

おそらく下図の用に変更してもCUSTOM_VENV_PATHSの変更出来るはず。

f:id:yassan0627:20201101190825p:plain

awx/custom_virtualenvs.md at devel · ansible/awx · GitHub にあった

$ HTTP PATCH /api/v2/settings/system/ {'CUSTOM_VENV_PATHS': ["/opt/my-envs/"]}

あたりのくだりはそういう意味だったのね。。。