我用pyenv和ansible遇到了ModuleNotFoundError: No module named ‘ansible’的问题
摘要
-
- 背景
ansibleでローカル開発環境をセットアップしていた。
pyenvをansible使ってインストールした。
課題
pyenvでpythonをglobalで使うpythonをインストールしてからansibleを実行すると、ModuleNotFoundError: No module named ‘ansible’とでるようになった。
Errorとなるためansibleが使えない状況になった。
やったこと
対処としてansibleは絶対パスで実行するようにした/usr/bin/ansible
2022-04-19 修正。嘘書いていました。ごめんなさい。pyenv global systemなどansibleをインストールしているpythonに切り替えないとダメです。
他にやり方を思いつかなかったため、案募集中。
执行环境 (shí shī
-
- Windows 11 バージョン 21H2(OSビルド22000.376)
-
- Ubuntu 20.04LTS on wsl
-
- python 3.8.10
※pyenvインストールしてglobal設定していたpythonは3.10.1
ansible 2.9.6
为什么会出现错误,需要调查一下。
设定用于全局使用的Python,并执行Ansible以再次确认发生的错误。
$ pyenv global 3.10.1
$ ansible
Traceback (most recent call last):
File "/usr/bin/ansible", line 34, in <module>
from ansible import context
ModuleNotFoundError: No module named 'ansible'
$
Ansible已经通过pip进行安装。
$ pip freeze | grep ansible
ansible==2.9.6
由于当前环境中存在多个Python版本,我使用pyenv查找了Ansible是作为哪个Python库安装的。
$ ls -l /usr/bin/ansible
lrwxrwxrwx 1 root root 68 Mar 17 2020 /usr/bin/ansible -> ../lib/python3/dist-packages/ansible/cli/scripts/ansible_cli_stub.py
$ ls -l /usr/bin/ansible
lrwxrwxrwx 1 root root 68 Mar 17 2020 /usr/bin/ansible -> ../lib/python3/dist-packages/ansible/cli/scripts/ansible_cli_stub.py
$ head -n1 /usr/lib/python3/dist-packages/ansible/cli/scripts/ansible_cli_stub.py
#!/usr/bin/env python3
$
我了解的内容
ansible是一个符号链接,链接到了 /usr/bin/ansible 这个路径,其实际位置是 /usr/lib/python3/dist-packages/ansible/cli/scripts/ansible_cli_stub.py。
而且,这个 python 文件的 shebang 是 #!/usr/bin/env python3。
pyenv可以通过覆盖路径来工作,就像在GitHub存储库的README中所述。
pyenv的工作原理是将一组shims目录插入到你的PATH前方。
因此,当执行ansible时,会引用shebang并始终参考pyenv安装的python目录。
应对
要让能够执行ansible,
-
- pyenvでインストールしたpythonでもansibleをpipインストール
- pyenvでglobal設定を一時的にsystemとする(ansibleをインストールしているpythonを使うようにする)
我认为其中一种。
如果选择前者,在通过pyenv安装的python中,必须始终安装ansible才能避免错误的可能性。而且,即使是不必要的,也会安装ansible。
如果选择后者,每次在执行ansible的playbook时都需要运行pyenv global system。
若仔细考虑,我发现只要在/usr/bin/ansible中执行,就不需要再担心pyenv的设置了,所以我决定以后都用/usr/bin/ansible来执行。
2022-04-19补充
只要Shebang是#!/usr/bin/env python3,那么由pyenv设置的python解释器就会被执行,所以不能使用绝对路径进行引用。
我曾经遇到过同样的问题,以为以前已经解决了,但是仔细检查后发现写错了。
总结
-
- pyenvでpythonをglobalで使うpythonをインストールしてからansibleを実行すると、ModuleNotFoundError: No module named ‘ansible’とでるようになった。
-
- できればplaybookでいい感じにしてコマンド実行方法は変えたくなかったが、
- いい案が思いつかなかったので、絶対パスでansibleを実行することに。 pyenv global systemを実行してからansibleを実行することに。
如果您有任何好的建议,敬请告知。