皆様こんにちは、今年も残すところあと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を作成したディレクトリのパスを追記します。
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のバージョンが出力されます。
ご覧の通りAnsible 2.9.1で実行されています。そこで、ジョブテンプレートの設定から、「ANSIBLE 環境」の設定を「デフォルト環境の使用」から「/opt/my-envs/custom-env/」に変更します。
設定を変更したら、再度ジョブテンプレートを実行してみましょう。すると、カスタムvirtualenv内のAnsible 2.7.15で実行されていることがわかります。
このように、カスタムvirtualenvを活用することで、既存のAnsible Towerの環境に影響を与えることなく、特定のAnsible Engineのバージョンを共存させたりすることができるようになります。Ansible TowerでのAnsible実行環境の管理に悩んでいる方は、ぜひ一度お試しください。
Happy Automation!