CentOS 7.9 に 新し目の python と ansible をインストールする

はじめに

CentOS7 は 2024/06/30 に EOL を迎え、もはや新規にインストールするべきではないディストリビューションです。とはいえ、まだ almalinux-8/9 等に移行できていない既存のインスタンスも存在します。本日は、このようなインスタンスに python-3.12.4 と ansible-10.2.0 をインストールする必要性が生じたので、作業ログを残すことにします。

スタンスとして、インストール済みの python3(3.7.3) や ansible(2.8.0) は触らず、/opt/pyenv に python-3.12.4 を、/opt/venv 配下に venv および ansible-core-2.17.12 をインストールすることとします。ちょっとハマったので、必要に応じて AI(Copilot Chat) に聞きながら作業を行いました。

pyenv のインストール

参照:pyenv+venvによるpython実行環境の設定

$ sudo yum -y install bzip2-devel libffi-devel openssl-devel readline-devel libsqlite3x-devel mysql-devel xz-devel python3-devel
$ git clone https://github.com/pyenv/pyenv.git /opt/pyenv

次に pyenv を有効化します。他のユーザーでも有効にするため、ここでは /etc/bashrc に設定を追加しました。

export PYENV_ROOT=/opt/pyenv
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

python のインストール

次に pyenv を使って python をビルドしますが、手元の環境では openssl で引っかかってうまくいきませんでした。

$ pyenv install 3.12.4
(中略)
Installing Python-3.12.4...
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/opt/pyenv/versions/3.12.4/lib/python3.12/ssl.py", line 100, in <module>
    import _ssl             # if we can't import it, let the error propagate
(以下略)

ビルドのログを見てみると、どうも OpenSSL が古そうに見えます。

checking for --with-openssl-rpath...
checking whether OpenSSL provides required ssl module APIs... no
checking whether OpenSSL provides required hashlib module APIs... no

AI に聞いたら以下のように答えてくれました。

ログを見る限り、OpenSSL はコンパイルされているものの、Python が sslhashlib モジュールで必要とする API を提供できていないようです。以下の追加対策を試してみてください。

追加の解決策:

  1. OpenSSL のバージョンを確認
    OpenSSL のバージョンが古い場合、Python 3.12.4 が求める API に対応できていない可能性があります。
   openssl version

OpenSSL 1.1.x 以上が必要です。もし 1.0.x の場合は、最新版をインストールしてください。

  1. 最新の OpenSSL を手動でインストール
    もし OpenSSL のバージョンが古ければ、ソースからインストールしてみてください。
   sudo yum install -y perl-WWW-Curl
   wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
   tar -xzf openssl-1.1.1.tar.gz
   cd openssl-1.1.1
   ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
   make -j$(nproc)
   sudo make install
  1. 環境変数を設定
    Python に新しい OpenSSL を認識させるために、環境変数を設定します。
   export PATH="/usr/local/openssl/bin:$PATH"
   export LD_LIBRARY_PATH="/usr/local/openssl/lib"
   export PKG_CONFIG_PATH="/usr/local/openssl/lib/pkgconfig"
  1. Python を再インストール
    OpenSSL を正しく認識させた上で、Python を再インストールします。
   CFLAGS="-I/usr/local/openssl/include" LDFLAGS="-L/usr/local/openssl/lib" pyenv install --force 3.12.4
  1. 再確認
    Python を起動して ssl モジュールが正しくロードできるか確認してください。
   python -c "import ssl; print(ssl.OPENSSL_VERSION)"

確かに条件を満たしていないようです。

$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

AI の指示に従い、無事に OpenSSL-1.1.1 と python-3.12.4 がインストールできました。python / ansible の実行時にも /usr/local/openssl 配下が必要になるので、環境変数の設定は、pyenv と同様に /etc/bashrc に行いました。

$ CFLAGS="-I/usr/local/openssl/include" LDFLAGS="-L/usr/local/openssl/lib" pyenv install --force 3.12.4
Downloading Python-3.12.4.tar.xz...
-> https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tar.xz
Installing Python-3.12.4...
Installed Python-3.12.4 to /opt/pyenv/versions/3.12.4

venv の構築

次に /opt/venv 配下に python の venv 環境を作成します。

$ cd temp
$ pyenv local 3.12.4
$ python -V
Python 3.12.4
$ python -m venv /opt/venv

ansible のインストール

venv 環境に ansible をインストールします。

$ . /opt/venv/bin/activate
$ pip install ansible==10.2.0
$ pip list
Package      Version
------------ -------
ansible      10.2.0
ansible-core 2.17.12
cffi         1.17.1
cryptography 45.0.3
Jinja2       3.1.6
MarkupSafe   3.0.2
packaging    25.0
pip          24.0
pycparser    2.22
PyYAML       6.0.2
resolvelib   1.0.1

ansible のバージョン確認

$ ansible --version
ansible [core 2.17.12]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/hotta-m/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /opt/venv/lib/python3.12/site-packages/ansible
  ansible collection location = /home/hotta-m/.ansible/collections:/usr/share/ansible/collections
  executable location = /opt/venv/bin/ansible
  python version = 3.12.4 (main, Jun  3 2025, 13:44:47) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] (/opt/venv/bin/python)
  jinja version = 3.1.6
  libyaml = True

想定する ansible-core 2.17.2 が入ったことを確認できました。

タイトルとURLをコピーしました