Ansible无法导入context模块

描述

环境: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 "", 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/

记录碰壁的每一天,加油!

你可能感兴趣的:(运维,故障与异常系列,运维)