Documentation

4. Ansible Tower での virtualenv の使用

Virtualenv は、分離された Python 環境を構築して依存関係での競合やバージョンの相違による問題を回避します。Virtualenv は、特定のバージョンの Python に必要な実行ファイルや依存関係をすべて含むディレクトリーを作成するだけで機能します。Ansible Tower は、インストール時に 2 つの virtualenv を作成します。1 つは、Tower の実行に、もう 1 つは Ansible の実行に使用します。これにより、Tower は安定した環境で実行でき、Playbook の実行に必要なモジュールを Ansible Python 環境に追加または更新できるようになります。virtualenv の詳細は、Python Guide の「Virtual Environments」および「Python virtualenv」プロジェクト自体を参照してください。

デフォルトでは、virtualenv はファイルシステムの /var/lib/awx/venv/ansible に配置されていますが、カスタムのディレクトリーを作成して、インベントリーインポートで使用できます。これにより、インベントリーソースがカスタムの仮想環境を使用するため、インベントリーインポートの実行方法を選択できるようになります。

さらに Tower は、(EC2、OpenStack、Azure など) 各種クラウドプロバイダーとの統合ポイントとなるように、さまざまなサードパーティーのライブラリー/SDK サポートをこの virtualenv に事前インストールします。以下に詳しく説明されているように、この virtualenv に、定期的に別の SDK サポートを追加することもできます。

注釈

仮想環境にパッケージをインストールする前に umask 0022 を実行することを強く推奨します。パーミッションを適切に設定しておかないと、Tower サービスに失敗します。以下は例となります。

# source /var/lib/awx/venv/ansible/bin/activate
# umask 0022
# pip install --upgrade pywinrm
# deactivate

以下の説明にあるように、Ansible の実行に Tower が使用する virtualenv にモジュールを追加するだけでなく、virtualenvs を新たに作成することができます。

4.1. 新しいカスタムの virtualenv の準備

Tower でジョブテンプレートを実行する場合に、異なる virtualenv を指定できます。これには、 virtualenv が配置されているディレクトリーを指定する必要があります。/var/lib/awx/venv/ 内にカスタムの virtualenv を保持することもできますが、カスタムのディレクトリーを作成することを強く推奨します。以下の例では、プレースホルダーのディレクトリー /opt/my-envs/ を使用していますが、任意で指定したディレクトリーパスに置き換えることができます。

  1. 新しいカスタム virtualenv を準備するには、virtualenv パッケージがプリインストールされている必要があります。

$ sudo yum install virtualenv
  1. カスタムの virtualenv 向けのディレクトリーを作成します。

$ sudo mkdir /opt/my-envs
  1. ディレクトリーに適切な書き込み権限、実行権限、および所有権を必ず付与してください。

$ sudo chmod 0755 /opt/my-envs
$ sudo chown awx:awx /opt/my-envs
  1. 任意で、作成したディレクトリーを以下のように CUSTOM_VENV_PATHS 設定に追加して、カスタムの virtualenv 用のどのディレクトリーを検索するか、Tower で指定できます。

$ curl -X PATCH 'https://user:[email protected]/api/v2/settings/system/' \
    -d '{"CUSTOM_VENV_PATHS": ["/opt/my-envs/"]}'  -H 'Content-Type:application/json'

複数のディレクトリーに virtualenv がまたがる場合には、全パスを追加してください。Tower が指定した全パスから virtualenv を累積します。

$ curl -X PATCH 'https://user:[email protected]/api/v2/settings/system/' \
    -d '{"CUSTOM_VENV_PATHS": ["/path/1/to/venv/", "/path/2/to/venv/", "/path/3/to/venv/"]}' \
    -H 'Content-Type:application/json'
  1. virtualenv のディレクトリーが設定されたので、その場所に仮想環境を作成します。

$ sudo virtualenv /opt/my-envs/custom-venv

注釈

複数の Python バージョンがサポートされていますが、Python 3 で virtualenv を作成する構文は若干変更されています: $ sudo python3 -m venv /opt/my-envs/custom-venv

  1. 次に、gcc をインストールして、psutil をコンパイルできるようにします。

$ yum install gcc
  1. 新規作成した virtualenv は、Playbook を正しく実行するには、基本的な依存関係が必要です (例: ファクトの収集):

$ sudo /opt/my-envs/custom-venv/bin/pip install psutil

ここから、Ansible 自体に適した各 virtualenv バージョンなど、追加で Python の依存関係をインストールできます。

$ sudo /opt/my-envs/custom-venv/bin/pip install -U "ansible == X.Y.Z"

または、Tower のベースインストールに含まれていない、サードパーティーの SDK を別途追加することができます。

$ sudo /opt/my-envs/custom-venv/bin/pip install -U python-digitalocean

コピーする場合は、pip freeze を使用してTower のデフォルトの virtualenv に含まれるライブラリーを見つけ出すことができます。

$ sudo /var/lib/awx/venv/ansible/bin/pip freeze

Tower のクラスターインストールでは、同じ virtualenv が全ローカルファイルシステムの /opt/my-envs/ に存在することを確認する必要があります。カスタムの virtualenv は、分離インスタンスでサポートされます。カスタムの仮想環境を使用する場合は、Tower ノードだけでなく、使用する分離ノードでコピーまたは複製する必要があります。コンテナーにカスタムの仮想環境を設定する方法は、『Ansible Tower Administration Guide』の「Build custom virtual environments」を参照してください。

4.2. カスタムの virtualenv の割り当て

カスタムの virtualenv を作成したら、組織、プロジェクト、ジョブテンプレートのレベル別に割り当ててジョブ実行に使用できます。インベントリーソースにカスタムの virv でインベントリーの更新を実行できるように、このカスタムの virv を設定できます。そのインベントリーを使用したジョブでは、独自のルールに準拠し、この venv は使用しません。SCM インベントリーソースで venv が選択されていない場合は、リンクしたプロジェクトの venv を使用できます。組織にカスタムの venv を割り当てることができます。ただし、組織にカスタムの venvを割り当てる場合には、ジョブ実行にだけ使用されるため、この組織のインベントリー更新では使用されません。

以下では、任意のレベルでカスタムの venv を正しく割り当てる方法を説明します。

PATCH https://awx-host.example.org/api/v2/organizations/N/
PATCH https://awx-host.example.org/api/v2/projects/N/
PATCH https://awx-host.example.org/api/v2/job_templates/N/
PATCH https://awx-host.example.org/api/v2/inventory_sources/N/

Content-Type: application/json
{
        'custom_virtualenv': '/opt/my-envs/custom-venv'
}

/api/v2/config/ への HTTP GET 要求では、インストール済みの virtualenvs の検出一覧が返されます。

{
        "custom_virtualenvs": [
                "/opt/my-envs/custom-venv",
                "/opt/my-envs/my-other-custom-venv",
        ],
...
}

Ansible Tower ユーザーインターフェースの対象の編集画面から、組織、プロジェクトおよびジョブテンプレートに割り当てる仮想環境を指定することも可能です。以下の例で示されるように、Ansible 環境 ドロップダウンメニューから virtualenv を選択してください。

_images/organizations-ansible-env-virtualenv-list.png

ジョブテンプレートの起動時に、ジョブの詳細ペーで指定した virtualenv も表示されます。

_images/jobs-show-job-details-venv.png