みなさんこんにちは。レッドハットの杉村です。Ansible のテクニカルサポートをしています。
今回は10月に書いた記事の続きとして、Python の venv での実行環境の話をします。もう Python 2.7 については触れず、Python 3 での実行環境のみを扱うことにします。
以前の Ansible での venv の利用シーンとしては、複数のバージョンの Ansible Engine を利用したいということがありました。いまもそれは変わらないのですが、Collections と組み合わせて使うために必要となることが増えてきました。例えば、AWS を扱うための amazon.aws collection であれば、boto などの Python ライブラリを利用する、などです。
Azure のための collection についてもよくお問い合わせいただきます。
基本的な流れとしましてはこのようになります。
- Python 3 をインストールする
- venv を作成する
- Ansible 2.9 をインストールする
- ビルドが必要なモジュールのために開発環境をインストールする
- pip でモジュールをインストールする
RHEL や macOS で同じように試していただけますが、Windows はあまり詳しくないもので触れません。
なお、この方式でインストールした Ansible はサポート対象にはなりません。サポートを必要とされる場合には、Ansible Automation のサブスクリプションをご購入いただき、Ansible Tower をご利用ください。Ansible Tower に付属する venv では、AWS や Azure などに接続するために必要なモジュールはあらかじめインストールされているため、追加の作業なくご利用いただけます。ただ、新しい Collections を使いたい場合にはやはり新しいモジュールが必要となることがありますので、そのときにはここで説明する手順で新しく venv を作っていただくことになります。
RHEL 7.6 以前のとき
Python 3 は RHSCL (Red Hat Software Collections) からインストールします。scl enable コマンドで環境を作って利用するのが少々面倒ではあります。
$ sudo subscription-manager repos --enable=rhel-server-rhscl-7-rpms リポジトリー 'rhel-server-rhscl-7-rpms' は、このシステムに対して有効になりました。 $ sudo yum install rh-python36-python rh-python36-python-devel … $ sudo yum install gcc openssl-devel … $ scl enable rh-python36 /bin/bash $ python --version Python 3.6.12
venv を作ってその中に pip でインストールしていきます。初めに使える pip コマンドは古いので、更新してからのほうが失敗しにくいです。
$ pwd /home/sugimura $ umask 0022 $ mkdir venv $ python -m venv venv/2.9 $ source venv/2.9/bin/activate (2.9) $ pip --version pip 9.0.1 from /home/sugimura/venv/2.9/lib64/python3.6/site-packages (python 3.6) (2.9) $ pip install --upgrade pip … (2.9) $ pip --version pip 21.1 from /home/sugimura/venv/2.9/lib64/python3.6/site-packages/pip (python 3.6) (2.9) $ pip install ansible==2.9.20 … (2.9) $ ansible --version ansible 2.9.20 config file = None configured module search path = ['/home/sugimura/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /home/sugimura/venv/2.9/lib64/python3.6/site-packages/ansible executable location = /home/sugimura/venv/2.9/bin/ansible python version = 3.6.12 (default, Sep 15 2020, 12:49:50) [GCC 4.8.5 20150623 (Red Hat 4.8.5-37)]
続いて、AWS と Azure に接続するためのモジュールをインストールしてみます。エラーが出ないことを確認してください。
(2.9) $ pip install -r https://raw.githubusercontent.com/ansible-collections/amazon.aws/main/requirements.txt (2.9) $ pip install -r https://raw.githubusercontent.com/ansible-collections/azure/dev/requirements-azure.txt
あとは Collections をインストールして、playbook を書けば使えます。今回は実行環境についての説明までにしますので、実際に playbook を動かすところまでは行いません。
(2.9) $ ansible-galaxy collection install amazon.aws Process install dependency map Starting collection install process Installing 'amazon.aws:1.5.0' to '/home/sugimura/.ansible/collections/ansible_collections/amazon/aws' (2.9) $ ansible-galaxy collection install azure.azcollection Process install dependency map Starting collection install process Installing 'azure.azcollection:1.5.0' to '/home/sugimura/.ansible/collections/ansible_collections/azure/azcollection'
RHEL 7.7 以降のとき
RHEL 7.7 以降では、OS 標準のリポジトリからも Python 3 が提供されるようになりました。scl コマンドで一段入れることなく使えますので、使いやすくなったと思います。
python3-devel は rhel-7-server-optional-rpms から入れる必要があることに注意が必要です。
$ sudo subscription-manager repos --enable rhel-7-server-optional-rpms リポジトリー 'rhel-7-server-optional-rpms' は、このシステムに対して有効になりました。 $ sudo yum install python3 python3-devel gcc openssl-devel … $ python3 --version Python 3.6.8
あとは先ほどの RHEL 7.6 以前のときと同様に、venv を作って同じように進めることができます。python コマンドですと 2.7.5 を使いますので、python3 コマンドにすることがポイントです。
$ pwd /home/sugimura $ umask 0022 $ mkdir venv $ python3 -m venv venv/2.9 $ source venv/2.9/bin/activate (2.9) $ pip install --upgrade pip (2.9) $ pip install ansible==2.9.20 (2.9) $ ansible --version ansible 2.9.20 config file = None configured module search path = ['/home/sugimura/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /home/sugimura/venv/2.9/lib64/python3.6/site-packages/ansible executable location = /home/sugimura/venv/2.9/bin/ansible python version = 3.6.8 (default, Aug 13 2020, 07:46:32) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
Collections のためのモジュールのインストールは同じですので割愛します。
RHEL 8 のとき
RHEL 8 では標準で有効になっている AppStream から Python 3.6 か 3.8 が利用できますが、今回は 3.6 を使ってみます。
新しいものですので当然ではありますが、もっとも簡単に構築することができます。
$ sudo dnf install python36 python36-devel gcc openssl-devel $ python3 --version Python 3.6.8
$ pwd /home/sugimura $ umask 0022 $ mkdir venv $ python3 -m venv venv/2.9 $ source venv/2.9/bin/activate (2.9) $ pip install --upgrade pip (2.9) $ pip install ansible==2.9.20 (2.9) $ ansible --version ansible 2.9.20 config file = None configured module search path = ['/home/sugimura/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /home/sugimura/venv/2.9/lib64/python3.6/site-packages/ansible executable location = /home/sugimura/venv/2.9/bin/ansible python version = 3.6.8 (default, Aug 18 2020, 08:33:21) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
おわりに
RHEL のそれぞれのバージョンでの venv の作り方と利用方法についてまとめてみました。
ここでは Ansible は 2.9.20 をインストールしてみましたが、この方法でコミュニティから新しくリリースされている 2.11 などを試してみることもできます。
Ansible に限らず、例えば Django のアプリケーション開発を RHEL でやってみたいという方にも参考にしていただけましたらと思います。
Ansible Towerの評価ライセンスリクエストはこちらからご利用いただけます。
Happy Automation!