我用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を実行することに。

如果您有任何好的建议,敬请告知。

bannerAds