Python 仮想実行環境で Ansible を動かそう!

みなさんこんにちは。レッドハットの杉村です。Ansible のテクニカルサポートをしています。

今回は10月に書いた記事の続きとして、Python の venv での実行環境の話をします。もう Python 2.7 については触れず、Python 3 での実行環境のみを扱うことにします。

rheb.hatenablog.com

以前の Ansible での venv の利用シーンとしては、複数のバージョンの Ansible Engine を利用したいということがありました。いまもそれは変わらないのですが、Collections と組み合わせて使うために必要となることが増えてきました。例えば、AWS を扱うための amazon.aws collection であれば、boto などの Python ライブラリを利用する、などです。

github.com

Azure のための collection についてもよくお問い合わせいただきます。

github.com

基本的な流れとしましてはこのようになります。

  • 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の評価ライセンスリクエストはこちらからご利用いただけます。

www.redhat.com

Happy Automation!

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