はじめに
AWX や Ansible Tower では、デフォルトで用意されている venv (/var/lib/awx/venv/ansible
)の他に、でカスタムした Ansible 環境を用意して利用できます。
「設定 > システム 」画面の「カスタムの仮想環境パス」という項目で、仮想環境を配置する親ディレクトリを指定します。
AWX はコンテナで動作するため、このパスはコンテナから見たパスです。とはいえ、コンテナ内に直接 ディレクトリを作って、venv を作成するのも違う気がします。
正攻法は、AWX のインストーラーの inventory ファイル内の、custom_venv_dir
変数の設定によって、ホストのディレクトリをコンテナ側にマウントする方法のようです。
試してみましたので、まとめます。
- 動作確認環境
- AWX 10.0
- RHEL 8.0
■ 設定の編集とインストール
inventory の編集
AWX インストールのために git clone https://github.com/ansible/awx.git
してくると、awx/installer/inventory
というファイルがあります。中には設定のための変数が定義されています。
デフォルトではコメントアウトされていますが、custom_venv_dir
で指定していしたホストのディレクトリが、コンテナ側にマウントされます。
#custom_venv_dir=/opt/my-envs/
これを有効にします。今回は /opt/my-envs/
とします。
custom_venv_dir=/opt/my-envs/
上記で指定したディレクトリをホスト側に作成しておきます。
$ sudo mkdir /opt/my-envs $ sudo chmod 0755 /opt/my-envs
インストール Playbook の実行
inventory の編集が終わったら、インストールのための Playbook を実行します。
$ sudo ansible-playbook -i inventory install.yml
すでにインストールしたあとで、再度実行しても有効なようです。
マウント状態の確認
AWX 10.0 現在、インストールすると、以下のコンテナが起動します。
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 86108b05cdca ansible/awx_task:10.0.0 "/tini -- /bin/sh -c…" 49 seconds ago Up 34 seconds 8052/tcp awx_task d1d63dde9846 ansible/awx_web:10.0.0 "/tini -- /bin/sh -c…" 54 seconds ago Up 33 seconds 0.0.0.0:80->8052/tcp awx_web d7aa133ea7de postgres:10 "docker-entrypoint.s…" About an hour ago Up 33 seconds 5432/tcp awx_postgres eeff0c4f41a3 redis "docker-entrypoint.s…" About an hour ago Up 34 seconds 6379/tcp awx_redis 6ad7a6204d8e memcached:alpine "docker-entrypoint.s…" About an hour ago Up 34 seconds 11211/tcp awx_memcached
これらのうち、コンテナ awx_task
と、awx_web
にマウントされました。
awx_task
での確認例
$ sudo docker inspect awx_task // ...(略)... "Mounts": [ // ...(略)... { "Type": "bind", "Source": "/opt/my-envs", "Destination": "/opt/my-envs", "Mode": "rw", "RW": true, "Propagation": "rprivate" }, // ...(略)...
この後の環境設定方法は、以下のブログや Ansible Tower の公式ドキュメント参考になりますので、ぜひご覧ください。
- Ansible Towerのカスタムvirtualenvを活用する - 赤帽エンジニアブログ
- 4. Using virtualenv with Ansible Tower — Ansible Tower Upgrade and Migration Guide
一応、本記事でも設定を進めます。
■ venv の準備
ここまでは、/opt/my-envs
という親ディレクトリを作成しただけで、実際に venv はまだ作っていません。
まず、素の venv を作成します。名前は a296
にします。
# cd /opt/my-envs/ # python3 -m vevn a296
作成した venv を有効にして、ansible をはじめ、必要なパッケージを pip でインストールします。 今回は、ansible 2.9.6、paramiko、ncclient、psutil を入れたものを作成します。
# source /opt/my-envs/a296/bin/activate (a296)# pip install ansible==2.9.6 paramiko ncclient psutil ...(略)... (a296)# deactivate #
なお、こちらのブログにも説明がありますが、psutil
は、Ansible Tower 3.6 (おそらくAWXも)が依存しているパッケージとのことです。
これのインストールのためには、私の環境では yum install gcc python3-devel
が必要でした。
ここまでで、カスタムの仮想環境(venv)、/opt/my-envs/a296
ができました。
■ カスタムの仮想環境パスの設定
AWX 全体の設定として、カスタムの仮想環境を検索するパスを設定します。この記事で「親ディレクトリ」と呼んでいる /opt/my-envs/
です。
AWX の 「設定 > システム」画面を開き、「カスタムの仮想環境パス」欄に /opt/my-envs
を入力して設定を保存します。
なお、うまくマウントできていなかったりすると、以下のようなエラーになります。 マウント状態を再確認しましょう。
■ プロジェクトへの割当
作成したカスタムの仮想環境である /opt/my-envs/a296
をAWX の プロジェクトに割り当てます。
プロジェクト作成画面に、今までなかった「Ansible環境」という設定項目が表示されるようになりました。
ここで /opt/my-envs/a296
を選択します。
これで、このプロジェクト実行時に カスタムの仮想環境/opt/my-envs/a296
が利用されるようになりました。
なお、カスタムの仮想環境は、プロジェクトの他にも、組織、ジョブテンプレート、ワークフロージョブテンプレートの単位でも割当できます。
■ おわりに
コンテナにマウントすることで、カスタムの仮想環境のパスを認識させる方法をご紹介しました。
Ansible Tower と AWX は内部アーキテクチャが異なるので、ときどき AWX 固有の事情を意識する必要がありそうです。