Ansible忽略命令行ansible_python_interpreter参数 无清单如何指定Python版本
前置说明
你测试时添加-e 'ansible_python_interpreter=/usr/bin/python3.6'参数后ansible --version输出无变化属于正常现象:ansible_python_interpreter是用来指定Ansible在目标主机执行模块时调用的Python解释器,不会改变Ansible控制程序本身运行依赖的Python版本,ansible --version显示的是后者的版本。Ubuntu 18.04官方源的Ansible包默认基于Python2打包,所以默认会用Python2.7启动控制程序。
可行解决方案(按改动成本从低到高排序)
方案1:显式用Python3.6调用Ansible命令
无需修改任何现有配置逻辑,仅需要把原来调用ansible/ansible-playbook的命令替换为如下格式即可:
/usr/bin/python3.6 /usr/bin/ansible <原有参数>
如果是Packer调用Ansible,直接在Ansible provisioner的command参数中配置上述完整命令即可,不需要改动其他流水线逻辑。
方案2:修改Ansible执行文件的Shebang(最推荐,零业务配置改动)
仅需要在CI环境初始化阶段执行一行命令,直接修改Ansible入口文件的默认解释器:
sed -i '1s@^#\!/usr/bin/env python.*@#\!/usr/bin/python3.6@' /usr/bin/ansible /usr/bin/ansible-playbook
执行完成后再运行ansible --version即可看到Python版本已经切换为3.6,完全不需要修改Packer配置或者流水线YAML文件。
注意:如果后续执行apt upgrade更新Ansible软件包,该修改会被覆盖,你可以把这行命令直接加入CI环境的初始化脚本中,每次运行前自动执行一次即可。
方案3:调整系统Python默认版本(仅适合一次性CI环境)
如果你的流水线运行环境是临时生成的CI实例,没有其他依赖Python2的服务,可以通过update-alternatives配置系统默认Python版本:
# 注册Python3.6为可选版本 update-alternatives --install /usr/bin/python python /usr/bin/python3.6 10 # 执行后根据交互提示选择Python3.6为默认版本即可
补充:指定目标节点执行模块的Python版本
如果你同时需要调整Ansible在目标节点执行模块用的Python版本,又无法使用清单文件,可以直接修改/etc/ansible/ansible.cfg配置:
[defaults] interpreter_python = /usr/bin/python3.6
内容的提问来源于stack exchange,提问作者falken

