Ansible Tower 3.0以降ではvirtualenvに対応しています。
ここでは、Ansible Towerでvirtualenvを有効化して使ってみる例を書いてみようと思います。
venvは
組織
プロジェクト
ジョブテンプレート
インベントリのソース
に設定することが可能です。
環境
項目 | バージョン |
---|---|
OS | RHEL 7.6 |
Ansible Tower | 3.5.1 |
Python | 3.6 |
公式ドキュメント
Python3のインストール
ここでは、Python3.6を使ってみようともいます。
RHEL7でPython3.6をインストールするにはscl(Software Collections)からインストールします。
以下のリポジトリが有効になっていることを確認します。
1 2 3 4 5 6 7 8 |
[root@at01 ~]# subscription-manager repos --list-enabled (snip) リポジトリー ID: rhel-server-rhscl-7-rpms リポジトリー名: Red Hat Software Collections RPMs for Red Hat Enterprise Linux 7 Server リポジトリー URL: https://cdn.redhat.com/content/dist/rhel/server/7/$releasever/$basearch/rhscl/1/os 有効: 1 (snip) |
有効になっていない場合は有効化します。
1 2 |
[root@at01 ~]# subscription-manager repos --enable=rhel-server-rhscl-7-rpms |
Python3.6をインストールします。
1 2 |
[root@at01 ~]# yum -y install rh-python36 |
Python3.6が使えるように有効化します。
1 2 |
[root@at01 ~]# scl enable rh-python36 bash |
venvの作成
次に、venvを作成します。
任意の場所にvenvを保存するディレクトリを作成します。
1 2 3 |
[root@at01 ~]# mkdir /opt/project-venvs [root@at01 ~]# chmod 755 /opt/project-venvs/ |
次にAnsible Towerの CUSTOM_VENV_PATH
を登録します。
API直アクセス例
1 2 3 |
[root@at01 ~]# curl -X PATCH 'https://admin:password@127.0.0.1/api/v2/settings/system/' \ -d '{"CUSTOM_VENV_PATHS": ["/opt/project-venvs/"]}' -H 'Content-Type:application/json' -k |
tower-cli例
tower-cli を使って設定することも可能です。
tower-cliはインストールする必要があります。
ログインします。
1 2 3 |
[root@at01 ~]# tower-cli login admin Password: |
CUSTOM_VENV_PATH
を設定します。
1 2 3 4 5 6 7 |
[root@at01 ~]# tower-cli setting modify CUSTOM_VENV_PATHS '["/opt/project-venvs"]' ================= ======================= id value ================= ======================= CUSTOM_VENV_PATHS [u'/opt/project-venvs'] ================= ======================= |
次にvenvを作成します。
ここでは project01
というプロジェクトに紐づけるのでわかりやすいように project01-venv
という名前で作ってみます。
1 2 |
[root@at01 ~]# python3 -m venv /opt/project-venvs/project01-venv |
venvを作成したら必要なパッケージやモジュールをインストールします。
1 2 3 |
[root@at01 ~]# yum -y install gcc [root@at01 ~]# /opt/project-venvs/project01-venv/bin/pip install psutil ansible python-digitalocean freeze |
プロジェクトの作成
次にvenvを紐づけるプロジェクトを作成します。
ここでは、手動で作成します。
1 2 3 |
[root@at01 ~]# mkdir /var/lib/awx/projects/project01 [root@at01 ~]# cd /var/lib/awx/projects/project01/ |
以下のようなPlaybookを作って動かしてみます。
1 2 |
[root@at01 project01]# vi main.yml |
main.yml
の中身は次の通りです。
1 2 3 4 5 6 7 8 9 10 |
--- - name: venv test playbook hosts: localhost gather_facts: no tasks: - shell: ansible --version register: r - debug: var=r |
Ansible Tower側はこんな感じでプロジェクトを作成しておきます。
プロジェクトにvenvを紐づける
次に作成したプロジェクトへ作成したvenvを紐づける必要があります。
API直アクセス例
以下はAPI経由で設定する例です。(WebUIから設定することも可能です)
まず、作成したプロジェクト番号を確認してください。
プロジェクトを作成したページのURLに番号が書かれています。
1 2 |
https://IP/#/projects/6?project_search=page_size:20;order_by:name |
この場合のプロジェクト番号は 6
なので、以下のコマンドのURLのprojectsを6にしています。
1 2 3 |
[root@at01 project01]# curl -X PATCH 'https://admin:password@127.0.0.1/api/v2/projects/6/' \ -d '{"custom_virtualenv": "/opt/project-venvs/project01-venv/"}' -H 'Content-Type:application/json' -k |
tower-cli例
tower-cli を使って設定することも可能です。
tower-cliはインストールする必要があります。
ログインします。
1 2 3 |
[root@at01 ~]# tower-cli login admin Password: |
venvをプロジェクトに紐づけます。
1 2 3 4 5 6 7 8 |
[root@at01 ~]# tower-cli project modify -n project01 --custom-virtualenv=/opt/project-venvs/project01-venv/ Resource changed. == ========= ======== ======= ========== id name scm_type scm_url local_path == ========= ======== ======= ========== 6 project01 project01 == ========= ======== ======= ========== |
上記コマンドを実行してから対象プロジェクトページのブラウザをリロードしてみてください。
先ほどまで表示されていなかった ANSIBLE 環境
が表示されて指定したvenvが設定されていると思います。
これで、venvを選択して実行することができるようになりました。
テンプレートの作成
ここでは、以下のようにテンプレートを作成しています。
実行してみます。
pythonのバージョンが3.6.3で動作していることが分かります 🙂
最後に
自動化が大きくなってくると、プロジェクトや組織毎に環境を分けたいという要望は出てくると思います。
Ansible Tower(AWX)では必要に応じてvenvで環境を分けることができるため、そういうニーズにも対応できて便利ですね 🙂
みんなでハッピーオートメーション!