良い感じのタイトルにならない💦
CentOS7やRHEL7にyum
を使ってAnsibleをインストールすると、Python2系を使う構成のAnsibleがインストールされると思います。
↓のpython version
の部分。
$ ansible --version ansible 2.9.2 config file = /home/zaki/ansible/expect/ansible.cfg configured module search path = [u'/home/zaki/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
このAnsibleの構成で、お気軽に別途インストールしたPython3系を使おうとする場合、/usr/bin/python3
にインタプリタがある場合は、ansible.cfgなどで以下のように設定すれば、ターゲットノードでの動作も含めて/usr/bin/python3
が使用されます。
[defaults] interpreter_python=/usr/bin/python3
ここまでで基本的なAnsibleの動作は問題ないと思いますが、モジュールの実行に追加のPythonライブラリが必要な場合(ドキュメントのRequirementsに記載があるもの。nmcliとかexpectとか)は、このままだと3.6用のパスを見てくれません。
で、どうにも自力で解決できそうになかったのでうまく動かんと諦めのツイートしてみたら、神の助けが…
PYTHONPATH も設定が要るかもです
— すぎむら (@sugitk) 2020年1月10日
Pythonが使用する環境変数で、ライブラリを検索するパスを指定するPYTHONPATH
という環境変数があり、これを設定すれば良いということ。
Perl(Perl5)でいうPERL5LIB
と同じかな?
ということで、
$ cat ansible.cfg [defaults] host_key_checking = False stdout_callback = yaml interpreter_python=/usr/bin/python3 $ export PYTHONPATH=/usr/lib/python3.6/site-packages $ ansible-playbook -i inventory.ini playbook.yml
と実行すれば、外部ライブラリを必要とするモジュールを使うプレイブックも実行できました。
TLのつよつよエンジニアに感謝です!
(´-`).。oO(仕事中もこれくらい情報収集がやりやすければいいのになぁ。。(SNSはアク禁)
Python2系、2020年4月に最後のバージョンがリリースされることになったけど、サポート自体はもう終了したって認識でいいんかな。。ようわからん。
ansible.cfg
で設定するinterpreter_python
は、playbook内でホスト変数やインベントリ変数などで指定する場合は ansible_python_interpreter
でも指定できる。