通过Python脚本运行ansible-playbook时提示未找到ansible模块的问题
核心问题定位
- 从提供的环境信息可直接判定,触发
ModuleNotFoundError: No module named 'ansible'的核心原因是运行py_runner.py的Python解释器,和系统已安装Ansible模块所属的Python解释器并非同一个。
当前环境的Ansible 2.8.0默认安装在Python2.7的模块路径下:/usr/lib/python2.7/site-packages/ansible。如果运行脚本时调用的是Python3.x版本的解释器,其自带的模块搜索路径不包含上述目录,自然无法识别到ansible相关模块。
排查验证步骤
- 确认当前脚本启动的解释器版本
在脚本所在目录执行以下命令,查看默认python命令指向的解释器版本:
如果输出版本为Python 3.x,就完全匹配问题的触发场景。python --version - 核对模块搜索路径
执行以下命令,打印当前解释器的所有模块搜索目录列表:
如果输出结果中没有python -c "import sys; print('\n'.join(sys.path))"/usr/lib/python2.7/site-packages,即可确认是解释器路径不匹配导致的模块找不到。
可落地的解决方案
- 方案1:用Ansible绑定的Python2.7解释器运行脚本,零额外配置
不使用默认的python命令启动脚本,直接调用Python2.7的绝对路径执行,直接匹配已安装的Ansible模块路径:/usr/bin/python2.7 py_runner.py - 方案2:为当前使用的Python解释器单独安装匹配版本的Ansible模块
如果需要使用Python3.x运行脚本,不要依赖系统包管理器安装的、绑定Python2.7的Ansible,通过pip给当前解释器安装对应版本的Ansible:
安装完成后Ansible模块会自动放到当前Python的site-packages目录下,解释器可正常识别加载。python -m pip install ansible==2.8.0 - 临时验证的应急方式(不推荐长期生产使用)
如果仅需快速验证逻辑连通性,可在脚本最开头手动把Ansible的模块路径追加到Python的搜索路径中:
注意:如果脚本本身采用Python3语法编写,加载为Python2环境编译的Ansible模块大概率会触发语法兼容性错误,这种方式仅适配符合Python2语法的脚本。import sys sys.path.append("/usr/lib/python2.7/site-packages") # 后续放置原有的ansible导入逻辑 from ansible import context
额外注意事项
参考的通用示例代码多为适配较早版本Ansible的逻辑,当前使用的Ansible 2.8对Python API做了多处调整,就算解决了模块加载问题,后续的Playbook执行逻辑也可能出现导入错误,需要对照对应版本的API规范调整代码结构。
内容的提问来源于stack exchange,提问作者Joao
相关产品推荐
相关产品推荐

