Ansible Towerのカスタムvirtualenvを活用する

皆様こんにちは、今年も残すところあと1か月となってしまいましたが、いかがお過ごしでしょうか。

Red Hatでテクニカルサポートエンジニアをしている八木澤(ひよこ大佐)です。

Ansible Towerを使っていると、「新しくリリースされたAnsible Engineを検証したいけど、今の環境を置き換えたくない」「一部のPlaybookで互換性の問題があるので、古いバージョンのAnsible Engine」を使いたいというケースが出てくるかと思います。今回の赤帽エンジニアブログでは、Ansible Towerの「カスタムvirtualenv(venv)」機能について解説します。

virtualenvとは?

virtualenvとは、システムと分離された仮想のPython環境を作成できるソフトウェアです。例えば、検証のためにPython環境を用意しなければならないようなケースで、システムのデフォルトの環境に影響を与えずに新しいPython環境を作成することができます。

Ansible Towerでは、デフォルトでvirtualenvの仕組みを利用しており、「/var/lib/awx/venv」というパスの下に、「ansible」「awx」という2つのvirtualenvがはじめから存在します。これらの中には、Ansible Towerがジョブを実行する際に利用するPythonパッケージなどがあらかじめインストールされています。

カスタムvirtualenvで何ができるのか

Ansible Tower 3.3以降では、virtualenvを自分で作成し、Playbookの実行に必要なPythonパッケージやAnsible Engineをインストールすることができます。これを「カスタムvirtualenv」と呼んでいます。

カスタムvirtualenvを作成すると、前述したように古いバージョンのAnsible Engineを共存させたり、デフォルトの環境に影響を与えることなく、特定のジョブテンプレートのみ指定したvirtualenv内のパッケージを使用するよう指定できたりします。新しいAnsible Engineと互換性のないPlaybookなどをAnsible Towerで利用する必要があるケースでは、既存の環境に影響を与えないため非常に便利です。また、作成したvirtualenvは単一のディレクトリとして存在するため、手軽にバックアップを取得したり、削除したりすることができます。

カスタムvirtualenvを作成する

※本記事では、本稿執筆時点(2019年12月2日)の最新版であるAnsible Tower 3.6.1での手順を前提に解説します。その他のバージョンをお使いの場合は、該当するバージョンのAnsible Towerドキュメントを参照してください。また、本稿で紹介しているデフォルトのvirtualenvのパス(/var/lib/awx/venv/)以外にカスタムvirtualenvを作成する方法は、Ansible Tower 3.5.0以降でのみ利用可能です。

公式ドキュメントに詳細な手順が紹介されていますので、そちらも併せてご確認ください。 https://docs.ansible.com/ansible-tower/3.6.1/html/upgrade-migration-guide/virtualenv.html

1. カスタムvirtualenv用のディレクトリを作成する(オプション)

デフォルトのvirtualenvのパス(/var/lib/awx/venv/)直下以外でカスタムvirutalenvを作成する場合、まずカスタムvirtualenv用のディレクトリを作成し、適切なパーミッション(0755)を指定します。

デフォルトのvirtualenvのパスに作成する場合は、この手順は不要です。

# mkdir /opt/my-envs
$ chmod 0755 /opt/my-envs

また、作成したディレクトリへのパスを通す必要がありますので、Tower UIの「設定」から「システム」を開き、「CUSTOM VIRTUAL ENVIRONMENT PATHS」にカスタムvirtualenvを作成したディレクトリのパスを追記します。

f:id:hiyokotaisa:20191202105655p:plain

2. カスタムvirtualenvを作成する

以下のコマンドを実行しカスタムvirtualenvを作成します。

# virtualenv /opt/my-envs/custom-venv
New python executable in /opt/my-envs/custom-env/bin/python
Installing setuptools, pip, wheel...done.

Python3用のカスタムvenvを作成する場合は、以下のコマンドを実行します。Python 2とPython 3で手順が異なりますので注意してください。

# python3 -m venv /opt/my-envs/custom-venv

カスタムvirtualenvを作成すると、指定したパスに以下のようなディレクトリが生成されます。

# ls -la /opt/my-envs/custom-env/
total 0
drwxr-xr-x 5 root root  56 Dec  2 10:25 .
drwxr-xr-x 3 root root  24 Dec  2 10:25 ..
drwxr-xr-x 2 root root 248 Dec  2 10:25 bin
drwxr-xr-x 2 root root  23 Dec  2 10:25 include
drwxr-xr-x 3 root root  23 Dec  2 10:25 lib
lrwxrwxrwx 1 root root   3 Dec  2 10:25 lib64 -> lib

3. カスタムvirtualenvを有効化する

では、早速作成したカスタムvirtualenvを有効化してみましょう。「bin」ディレクトリ内のactivateという実行ファイルを指定することでカスタムvirtualenvを有効化できます。

# source /opt/my-envs/custom-venv/bin/activate

コマンドを実行すると、プロンプトの左側が「(custom-env)」に変化したことがわかります。これにより、現在virtualenvが有効化されていることがわかります。

4. パッケージをインストールする

では、実際にパッケージをインストールしてみましょう。今回は、Ansible 2.7.15をあらたにインストールします。psutilは、Ansible Tower 3.6が依存しているパッケージです。

(custom-env) # pip install -U pip
(custom-env) # pip install psutil
(custom-env) # pip install -U "ansible == 2.7.15"

psutilのインストール時にエラーが発生する場合は以下のパッケージがインストールされていない可能性がありますので、インストールしてから再度試してみてください。

# yum -y install gcc gcc-c++ kernel-devel python-devel

インストールが完了したら、カスタムvirtualenv内に存在しているパッケージを確認してみましょう。pip freezeコマンドで、現在virtualenvにインストールされているパッケージの一覧が確認できます。

(custom-env) # pip freeze
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
ansible==2.7.15
bcrypt==3.1.7
cffi==1.13.2
cryptography==2.8
enum34==1.1.6
ipaddress==1.0.23
Jinja2==2.10.3
MarkupSafe==1.1.1
paramiko==2.6.0
psutil==5.6.7
pycparser==2.19
PyNaCl==1.3.0
PyYAML==5.1.2
six==1.13.0

正常にAnsible 2.7.15がインストールされていることがわかります。virutalenvから抜けるには、deactivateコマンドを実行します。

(custom-env) # deactivate

これで、カスタムvirtualenvの作成は完了です。

5. カスタムvirtualenvを指定してジョブテンプレートを実行する

ジョブテンプレートに先程作成したvirtualenvを指定します。このTowerノードには、Ansible 2.9.1がシステムワイドにインストールされています。

# ansible --version
ansible 2.9.1

Ansible Towerに同梱されている「Demo Job Template」を実行してみましょう。ジョブテンプレートの設定で「詳細度」を「3」にすることで、実行したAnsible Engineのバージョンが出力されます。 f:id:hiyokotaisa:20191202105727p:plain

ご覧の通りAnsible 2.9.1で実行されています。そこで、ジョブテンプレートの設定から、「ANSIBLE 環境」の設定を「デフォルト環境の使用」から「/opt/my-envs/custom-env/」に変更します。 f:id:hiyokotaisa:20191202105741p:plain

設定を変更したら、再度ジョブテンプレートを実行してみましょう。すると、カスタムvirtualenv内のAnsible 2.7.15で実行されていることがわかります。 f:id:hiyokotaisa:20191202105759p:plain

このように、カスタムvirtualenvを活用することで、既存のAnsible Towerの環境に影響を与えることなく、特定のAnsible Engineのバージョンを共存させたりすることができるようになります。Ansible TowerでのAnsible実行環境の管理に悩んでいる方は、ぜひ一度お試しください。

Happy Automation!

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。