どうも、Tです。
AWXでPlaybook実行時に警告が出て、モヤっとするので解消した備忘録です。
目次
環境
コントロールノード
AWX(Ansibleを実行しているノード)
AWX
24.6.1
AWX EEコンテナ
24.6.1 ※ansible-coreは、2.15.12

ターゲットノード
Ansibleによって操作されるノード
Oracle Linux 9.6(6.12.0-1.23.3.2.el9uek.x86_64)
問題
AWXでPlaybookを実行すると下記のWARNINGが表示されました。無視してもとりあえずは問題ありませんが、気持ち悪いので解消します。
[WARNING]: Platform linux on host 192.168.10.102 is using the discovered Python interpreter at /usr/bin/python3.11, but future installation of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible- core/2.15/reference_appendices/interpreter_discovery.html for more information
筆者日本語訳
[警告]: ホスト 192.168.10.102 上のプラットフォーム Linux は、/usr/bin/python3.11 で検出された Python インタープリターを使用していますが、将来別の Python インタープリターをインストールすると、そのパスの意味が変わる可能性があります。詳細については、https://docs.ansible.com/ansible-core/2.15/reference_appendices/interpreter_discovery.html を参照してください。
原因
ターゲットノードにもPythonが必要
Ansibleというとターゲットノード(AinsbleのPlaybookによって自動化対象とされるホスト)がLinuxの場合、SSH接続できればOKと考えがち(私がそうでした)ですが、ターゲットノード側にPythonが必要な場合もあります(ほとんどの場合必要です)。問題で掲載しているWARNINGは、ターゲットノード側のPythonのことについて出力しているのですね。
AWX内部で使われているansible-coreのドキュメントには以下のように記載されています。
Managed node requirements
The managed node (the machine that Ansible is managing) does not require Ansible to be installed, but requires Python to run Ansible-generated Python code. The managed node also needs a user account that can connect through SSH to the node with an interactive POSIX shell.筆者日本語訳
管理対象ノードの要件
管理対象ノード(Ansible が管理するマシン)には Ansible がインストールされている必要はありませんが、Ansible によって生成された Python コードを実行するには Python が必要です。また、管理対象ノードには、対話型 POSIX シェルを使用して SSH 経由でノードに接続できるユーザーアカウントも必要です。
ターゲットノードのPython検出の方式がある
今回のターゲットノードには複数のPtyhonを導入しており、警告にあるように検出されたのは、Python 3.11でした。
# ls -lha /usr/bin/ | grep python lrwxrwxrwx. 1 root root 9 3月 9 02:56 python -> ./python3 lrwxrwxrwx. 1 root root 9 3月 9 02:56 python3 -> python3.9 -rwxr-xr-x 1 root root 16K 7月 2 19:10 python3.11 -rwxr-xr-x 1 root root 16K 7月 2 19:03 python3.12 -rwxr-xr-x. 1 root root 16K 3月 9 02:56 python3.9
ターゲットノードのPythonの検出は、Interpreter Discoveryという機能によって行われています。今回、特に設定などしていないのでデフォルトのautoで検出されているはずです。
auto(default in 2.12)
Detects the target OS platform, distribution, and version, then consults a table listing the correct Python interpreter and path for each platform/distribution/version. If an entry is found, uses the discovered interpreter. If no entry is found, or the listed Python is not present on the target host, searches a list of common Python interpreter paths and uses the first one found; also issues a warning that future installation of another Python interpreter could alter the one chosen.
筆者日本語訳
auto(2.12 ではデフォルト)
ターゲット OS プラットフォーム、ディストリビューション、およびバージョンを検出し、各プラットフォーム/ディストリビューション/バージョンに適した Python インタープリタとパスをリストしたテーブルを参照します。エントリが見つかった場合は、検出されたインタープリタを使用します。エントリが見つからない場合、またはリストされた Python がターゲットホスト上に存在しない場合は、一般的な Python インタープリタのパスのリストを検索し、最初に見つかったものを使用します。また、将来別の Python インタープリタがインストールされると、選択されたインタープリタが変更される可能性があることを示す警告も表示します。
「パスをリストしたテーブルを参照」が何を指しているか明確に説明はありませんでしたが、ansible-coreではなくAnsibleのドキュメントを読んでいると下記のINTERPRETER_PYTHON_FALLBACKを指していると思われます。
AnsibleとPythonにはバージョンの関係性がある
Pythonのバージョン検出があるというこで、Pythonのバージョンにも要件が存在します。
今回はansbile-core 2.15.12を利用しているので、ターゲットノードにはPython2.7、Python3.5-3.11のいずれかが必要になっています(Interpreter Discoveryでは、サポート対象範囲の最新が検出されていたようです)。
最新のAWXを導入してデフォルトデプロイされるEEコンテナ(ansbile-core 2.15.12)を利用しているのにサポート切れなのか…。
こちらの問題が解決して早く新しいバージョンをリリースして欲しいところです…。

対応方法を検討
解決方法は大きく2つ
Ansibleのドキュメントでは大きく2つの解決方法が説明されています。
- for individual hosts and groups, use the
ansible_python_interpreter
inventory variable- globally, use the
interpreter_python
key in the[defaults]
section ofansible.cfg
筆者日本語訳
- 個々のホストおよびグループの場合は、ansible_python_interpreter インベントリ変数を使用します。
- グローバルの場合は、ansible.cfg の [defaults] セクションにある interpreter_python キーを使用します。
AWXでは、設定値の変更などは少々難しそうなのとPlyabookに固定値を記述したくないため、ansible_python_interpreter変数を使って解消していきます。
下記のような変数を設定することにより回避することができます。
ansible_python_interpreter: <PythonコマンドPATH>
どのPythonを使うべきか
今回のターゲットノードには複数バージョンのPythonを導入しています。
# ls -lha /usr/bin/ | grep python lrwxrwxrwx. 1 root root 9 3月 9 02:56 python -> ./python3 lrwxrwxrwx. 1 root root 9 3月 9 02:56 python3 -> python3.9 -rwxr-xr-x 1 root root 16K 7月 2 19:10 python3.11 -rwxr-xr-x 1 root root 16K 7月 2 19:03 python3.12 -rwxr-xr-x. 1 root root 16K 3月 9 02:56 python3.9
今回はansible-coreのサポート範囲であり、かつサポート期間の一番長いPython 3.9を利用することにしました。
RHEL 9互換OSのPythonに関しては下記の記事にまとめました。

RHEL9系のPython 3.9はPlatform-Pythonであり、Ansibleなどの処理で利用することにいささか不安はありますが、赤帽の人がPlatform-Pythonを利用していたので大きな問題はなさそうと結論付けました
ということで、AWXで下記の変数を定義してあげれば警告が解消できそうです。
ansible_python_interpreter: /usr/bin/python3
ターゲットノードのPythonのバージョンが違う場合も、python3を叩ければいいので、PATHさえ合っていればバージョン指定が不要なのがメリットです。また、RHEL9互換ではOSインストール時には存在しているためわざわざ別のPythonを導入する必要もありません。
ただ、どのバージョンのPythonを利用しているのかAWX側の設定側からはわからない点がデメリットになります。
どこに変数を設定すべきか
AWXに変数を設定できる箇所は複数あります。個人的にパッとわかりやすい設定箇所は下記3か所です。各変数には優先順位があるため、どこに設定するか意識しておく必要があります。
今回はインベントリー設定の変数に定義することで解消します。インベントリー設定で行うことにより、複数のターゲットノードがあった場合でも統一して定義することができ、異なる環境のターゲットノードがインベントリーに含まれる場合は、ホスト設定の変数定義で上書きするなど柔軟を持たせた対応が可能です。
優先度 | 箇所 | 説明 |
---|---|---|
1 | テンプレート設定の変数 | 最も優先される。 一括して設定できるため便利ではあるが、環境が異なるターゲットノードだけ変数を変更したいなどの柔軟性がなくなるため避けたい。 |
2 | ホスト設定の変数 | ターゲットノード単位で指定する。 確実ではあるが、ターゲットノードすべてに設定を入れるため手間であり設定箇所が分散しやすい。 |
3 | インベントリー設定の変数 | ターゲットノードの集合であるインベントリーで定義する。 ある程度設定を集約することができ、異なる環境のターゲットノードがある場合は、ホスト設定側の定義で上書きすることができる。 |
上記では主要な設定箇所のみ確認していますが、他にもインベントリグループなど変数を定義できる箇所はあります。それぞれの優先度についてAWXのドキュメントに記載はありませんでしたが、Ansibleのドキュメントで詳細に記載されています。
AWXの管理画面の項目と一致しないものも多いですが参考になります。
対応方法
「リソース」->「インベントリー」画面を開き対象のインベントリー「今回はtest-inventory」をクリックします。
「編集」をクリックします。
「変数」に下記を追記し「保存」をクリックします。
ansible_python_interpreter: /usr/bin/python3
ジョブテンプレートを実行(Playbookを実行)すると警告が表示されなくなります。
参考


まとめ
AWXのバージョンアップ(正確にはEEコンテナの変更)やターゲットノード構成で変わる部分のため気を付けたいところです。