悩み
タイトル通りに,virtualenvを用いて,ansibleのlocal action利用するときに,
module not foundのようなエラーに遭遇した.
具体的に,ansible2.3のvmware_guestを利用したくて,ansible2.3のvirtualenvを作りました.
それで,問題発見.
vmware_guest.py がpyvmomi.py に依存.
virtualenvに,pyvmomiをいれました.
なのに,pyvmomiがみつからないという理由で,vmware_guest.pyに怒られました.
答え(気が短い方へ)
チューニングして,解決した.
[local]
localhost ansible_python_interpreter=python
チューニング経緯
インベントリファイル無
(ansible2.3)$ ansible-playbook gathervm.yml --extra-vars "vmname=t1-malts-230"
[WARNING]: Host file not found: hosts
[WARNING]: provided hosts list is empty, only localhost is available
PLAY [localhost] ********************************************
TASK [gather VM facts "t1-malts-230"] ************************
ok: [localhost]
TASK [debug] ***********************************************
ok: [localhost] => {
...
}
PLAY RECAP ******************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
うまくいくけど,[WARNING]がでます.
インベントリファイル有
[WARNING]をクリアするために,hosts追加
(ansible2.3)$ cat hosts
[local]
localhost
(ansible2.3) ~/p/vsphere ansible-playbook gathervm.yml --extra-vars "vmname=t1-malts-230"
PLAY [localhost] *******************************************
TASK [gather VM facts "t1-malts-230"] *********************************
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "pyvmomi module required"}
PLAY RECAP ***********************************************
localhost : ok=0 changed=0 unreachable=0 failed=1
これで,問題発見.
virtualenvにあるのに
(ansible2.3)$ pip list | grep pyvmomi
pyvmomi (6.5.0.2017.5)
(ansible2.3)$
(ansible2.3)$ deactivate
systemにないけど
$ pip list | grep pyvmomi
$
答え
インベントリファイルの書き方によって,利用するpythonインタプリタが違います.
↓ /path/to/system/python (mac の場合,/usr/bin/python)
[local]
localhost
↓ /virtualenv/python
[local]
localhost ansible_python_interpreter=python
↓ /virtualenv/python
(空)
/path/to/system/python と /virtualenv/pythonは,別物だ.
今回のエラーの原因は,それぞれのsys.path違うからだ.