てくなべ (tekunabe)

ansible / network / automation

[Ansible/AWX] AWX でカスタムの仮想環境(venv)パスを認識させる方法

はじめに

AWX や Ansible Tower では、デフォルトで用意されている venv (/var/lib/awx/venv/ansible)の他に、でカスタムした Ansible 環境を用意して利用できます。

参考: Ansible Tower のドキュメント

「設定 > システム 」画面の「カスタムの仮想環境パス」という項目で、仮想環境を配置する親ディレクトリを指定します。

AWX はコンテナで動作するため、このパスはコンテナから見たパスです。とはいえ、コンテナ内に直接 ディレクトリを作って、venv を作成するのも違う気がします。

正攻法は、AWX のインストーラーの inventory ファイル内の、custom_venv_dir 変数の設定によって、ホストのディレクトリをコンテナ側にマウントする方法のようです。

試してみましたので、まとめます。

 

  • 動作確認環境


■ 設定の編集とインストール

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 の公式ドキュメント参考になりますので、ぜひご覧ください。

一応、本記事でも設定を勧めます。


■ 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 を入力して設定を保存します。

f:id:akira6592:20200405195120p:plain
無事に認識できるようになった

なお、うまくマウントできていなかったりすると、以下のようなエラーになります。 マウント状態を再確認しましょう。

f:id:akira6592:20200405195003p:plain
マウントできなかった場合のエラー


■ プロジェクトへの割当

作成したカスタムの仮想環境である /opt/my-envs/a296 をAWX の プロジェクトに割り当てます。

プロジェクト作成画面に、今までなかった「Ansible環境」という設定項目が表示されるようになりました。 ここで /opt/my-envs/a296 を選択します。

f:id:akira6592:20200405201603p:plain
プロジェクトへのカスタムの仮想環境の割当

これで、このプロジェクト実行時に カスタムの仮想環境/opt/my-envs/a296 が利用されるようになりました。

なお、カスタムの仮想環境は、プロジジェクとの他にも、組織、ジョブテンプレート、ワークフロージョブテンプレートの単位でも割当できます。


■ おわりに

コンテナにマウントすることで、カスタムの仮想環境のパスを認識させる方法をご紹介しました。

Ansible Tower と AWX は内部アーキテクチャが異なるので、ときどき AWX 固有の事情を意識する必要がありそうです。


参考