はじめに
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 のインストール
$ 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 が
ssl
やhashlib
モジュールで必要とする API を提供できていないようです。以下の追加対策を試してみてください。追加の解決策:
- OpenSSL のバージョンを確認
OpenSSL のバージョンが古い場合、Python 3.12.4 が求める API に対応できていない可能性があります。openssl version
OpenSSL 1.1.x 以上が必要です。もし 1.0.x の場合は、最新版をインストールしてください。
- 最新の 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
- 環境変数を設定
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"
- Python を再インストール
OpenSSL を正しく認識させた上で、Python を再インストールします。CFLAGS="-I/usr/local/openssl/include" LDFLAGS="-L/usr/local/openssl/lib" pyenv install --force 3.12.4
- 再確認
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 が入ったことを確認できました。