升级Ansible Core至2.4后指定Python2.7解释器遇模块失败求助
我之前处理过类似的场景,给你几个排查和解决的方向,应该能帮你定位问题:
1. 检查自定义Python2.7的编译依赖是否完整
编译Python时如果缺少关键系统依赖,会导致很多核心模块(比如ssl)缺失,而Ansible的绝大多数模块都依赖这些功能。你可以在受控节点上执行以下命令验证:
/usr/bin/python27/python -c "import ssl; print(ssl.OPENSSL_VERSION)"
如果执行报错,说明编译时没有启用SSL支持。解决步骤:
- 先在受控节点安装编译依赖:
- CentOS/RHEL:
yum install openssl-devel libffi-devel zlib-devel gcc - Debian/Ubuntu:
apt-get install libssl-dev libffi-dev zlib1g-dev gcc
- CentOS/RHEL:
- 重新编译Python2.7,编译时明确指定SSL支持:
cd /path/to/python2.7.14/source ./configure --prefix=/usr/bin/python27 --with-ssl make && make install
2. 为Python2.7安装Ansible必备的第三方库
即使Python编译正常,缺少Ansible依赖的第三方包也会导致模块执行失败。你需要先给自定义Python安装pip,再安装依赖:
- 安装pip:
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py | /usr/bin/python27/python - 安装核心依赖包:
/usr/bin/python27/bin/pip install paramiko cryptography jinja2 pyyaml six
3. 确认ansible_python_interpreter路径的正确性
很多时候问题出在路径指定错误——你需要指向Python的可执行文件,而不是目录。比如如果你的Python2.7可执行文件在/usr/bin/python27/bin/python,就必须完整指定这个路径,而不是只写/usr/bin/python27。
你可以在受控节点上执行ls -l /usr/bin/python27/bin/确认可执行文件的位置,然后在playbook或命令行中正确指定:
ansible your_host -m ping -e ansible_python_interpreter=/usr/bin/python27/bin/python
4. 通过基础模块排查具体错误
不要直接运行复杂的playbook,先测试最基础的ping模块,查看具体的错误输出。比如执行上面的ping命令后,如果报错是ImportError: No module named xxx,就针对性安装对应的模块;如果是权限相关错误,要确保Ansible使用的用户(比如root)对Python2.7的目录和文件有读写执行权限。
5. 检查安全模块是否拦截
部分服务器的SELinux或AppArmor会阻止调用非系统默认的Python解释器。你可以临时关闭SELinux测试:
setenforce 0
如果问题解决,就需要配置SELinux允许该路径的Python执行,比如添加自定义规则:
semanage fcontext -a -t bin_t "/usr/bin/python27/bin/python" restorecon -v "/usr/bin/python27/bin/python"
内容的提问来源于stack exchange,提问作者heavyguidence

