AWXコンテナで仮想(venv)環境作成


はじめに

AWXには複数バージョンのAnsibleを使い分けられる機能があります。

↑こんなの。

AWXをKubernetesクラスタ上で動かすときに、複数バージョンのAnsibleを予め仕込んだコンテナを作るにはどうしたらいいんだろう?、と思っていたら公式ドキュメントに答えが載ってました。

備忘を兼ねて、試した記録を残しておきます。

環境

k3s v1.18.9+k3s1
AWX 15.0.0

やりかた

以下のようなYAMLを作ります。

venv_vars.yaml
---
custom_venvs:
  - name: 2.9.12
    python: python3
    python_ansible_version: 2.9.12
  - name: pip
    python_ansible_version: 2.9.13
    python_modules:
      - pyvmomi

各項目の内容は以下のとおり。

key 説明 必須
name 仮想環境の名前(ディレクトリ名) Yes
python_ansible_version Ansibleのバージョン Yes
python Pythonのバージョン(指定のない場合は2系)
python_modules 導入したいpipモジュール

あとはデプロイ時のansible-playbookコマンドに以下のようにextra-varsオプションを加えるだけです。

$ ansible-playbook -i inventory install.yml --extra-vars "@venv_vars.yaml"

デプロイ完了後、Podが起動完了するまで以下のような状態で少し時間がかかります。

$ kubectl get pod -n awx
NAME                          READY   STATUS     RESTARTS   AGE
awx-postgresql-postgresql-0   1/1     Running    0          2d19h
awx-64f65bbdc4-qcbtm          0/3     Init:0/1   0          66s

AWX上の設定

Podが起動したらAWXにログインし、「設定」->「システム」を開きます。

「カスタムの仮想環境パス」に『/opt/custom-venvs<改行>』と入力し、保存します。
行末尾に改行を入れないといけないようなので忘れずに入れましょう。
※このパスは任意のパスに変更可能です。変更したい場合はinventoryファイルのcustom_venv_dirで定義できます。

設定が完了すると、プロジェクトの設定画面に「ANSIBLE 環境」というリストが表示され、作成した仮想環境が選択可能になります。

Ansible 2.9.12の環境を指定した上で、適当に以下のようなPlaybookを作って実行してみると、

show_version.yaml
---
- name: Sample
  hosts: all
  tasks:
    - name: Show Ansible Version
      debug:
        msg: "{{ ansible_version }}"

2.9.12として実行されました。(AWX 15.0.0のデフォルトAnsibleバージョンは2.9.13です)

どういう仕組み?

どうやって仮想環境をセットアップしてるのか気になったので調べてみました。
Kubernetes用のDeployment.ymlテンプレートファイルの中で、

  1. custom_venvsの変数定義が存在したら、initContainersでCentOS7のコンテナを起動
  2. custom_venv_dirで定義されたディレクトリをEmptyDirとしてマウント
  3. その上にvirtualenvで仮想環境を構築
  4. 同じディレクトリをawx-web,awx-taskコンテナでもマウント

という流れでインストールを実施しているようです。
これならPodが落ちても仮想環境は再起動時に作られるので安心です。

おわりに

当初はコンテナのリビルドが必要だと思っていましたが、比較的簡単に実現できる方法が用意されていてよかったです。

また、AWXの設定は以下サイトを参考にさせていただきました。
[Ansible/AWX] AWX でカスタムの仮想環境(venv)パスを認識させる方法