AWXで複数バージョンのAnsibleを実行出来るようカスタム仮想環境を用意する
前ふり
これの続き。
よこちさんに教えてもらったのでやってみた。
カスタムvirtualenvの作成なんですが、インストール時の inventory の custom_venv_dir って設定を有効にすると、コンテナにマウントしてくれるので、コンテナ内に直接作らなくってすみました!https://t.co/u3nwyRPy1M
— よこち(yokochi) (@akira6592) 2020年6月28日
前提環境
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-7
や ansible ~= 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
を入れて、「保存」ボタンを押下して反映。
次に、設定したカスタム仮想環境を利用したいプロジェクトを選択して、下図のように、「ANSIBLE環境」から利用したいカスタム仮想環境を選択し、「保存」ボタンを押下して反映。
動作確認
使えるか確認。 テンプレートから設定したプロジェクトのジョブテンプレートを選択して実行。
環境がカスタム仮想環境になっているのが分かります。
最後に
これまでは、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/ にアクセスすると設定値が見えます。
おそらく下図の用に変更してもCUSTOM_VENV_PATHSの変更出来るはず。
awx/custom_virtualenvs.md at devel · ansible/awx · GitHub にあった
$ HTTP PATCH /api/v2/settings/system/ {'CUSTOM_VENV_PATHS': ["/opt/my-envs/"]}
あたりのくだりはそういう意味だったのね。。。