zaki work log

作業ログやら生活ログやらなんやら

Python Versionが2.7なAnsibleでpython3をinterpreter_pythonで指定する場合のライブラリ参照

良い感じのタイトルにならない💦

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用のパスを見てくれません。

で、どうにも自力で解決できそうになかったのでうまく動かんと諦めのツイートしてみたら、神の助けが…

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月に最後のバージョンがリリースされることになったけど、サポート自体はもう終了したって認識でいいんかな。。ようわからん。

forest.watch.impress.co.jp


ansible.cfgで設定するinterpreter_pythonは、playbook内でホスト変数やインベントリ変数などで指定する場合は ansible_python_interpreterでも指定できる。