Ansible无法导入context模块
程序员文章站
2024-03-14 09:30:52
...
描述
环境:ansible 2.9.18 yum 安装
冲突版本:ansible 2.2.3 源码安装,make && make install
描述:由于在已经通过rpm包安装2.9版本的情况下,又使用了源码安装2.2,导致ansible命令无法使用。
问题:大致就是没有/usr/bin/ansible文件,或者是ansible执行时报错说没有context模块。
分析
没有/usr/bin/ansible 文件,一般是由于卸载后,重装没生成导致的。重新安装就行,或者换种方式安装。
这篇主要解决没有context模块的问题,使用版本(ansible 2.9.18)
1、查看ansible的可执行文件
more /usr/bin/ansible
#!/usr/bin/python3.6
.....
import errno
import os
import shutil
import sys
import traceback
from ansible import context
from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError
from ansible.module_utils._text import to_text
上述结果可以看出两点:
ansible当前使用的解释器是:
/usr/bin/python3.6
ansible在开头就引入了context模块
from ansible import context
所以,我就使用指定的解释器去尝试导入这个模块
/usr/bin/python3.6
Python 3.6.8 (default, Aug 18 2020, 08:33:21)
[GCC 8.3.1 20191121 (Red Hat 8.3.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>import ansible
>>>ansible
<module 'ansible' from '/usr/local/lib/python3.6/site-packages/ansible-2.2.3.0-py3.6.egg/ansible/__init__.py'>
>>> from ansible import context
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'context'
好家伙,我当前安装版本是2.9.18,这里竟然用的2.2.3的模块。
于是乎,我找到这个路径,然后发现这是我使用源码安装ansible2.2.3时生成的文件,有且仅有这一个模块,所以操作如下:
cd /usr/local/lib/python3.6/site-packages/
# 删除任何不确定的东西前,请备份
mv ansible-2.2.3.0-py3.6.egg /tmp/
然后再执行一遍:
/usr/bin/python3.6
>>> import ansible
>>> ansible
<module 'ansible' from '/usr/lib/python3.6/site-packages/ansible/__init__.py'>
>>> from ansible import context
>>> context
<module 'ansible.context' from '/usr/lib/python3.6/site-packages/ansible/context.py'>
总结
1、不要在没有删除一个软件前,就使用其他版本源码安装这个软件,会有意想不到的问题出现。
2、这种没有模块的,先找到解释器,然后尝试复现问题,也许会有解决思路。
3、python中会对不同路径下的同名的模块取其一,所以如果认为自己模块已经加载了但是无法使用,请进入对应解释器去尝试导入
其他
ansible历史版本
https://releases.ansible.com/ansible/
ansible Git项目
https://github.com/ansible/
记录碰壁的每一天,加油!