欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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/

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