我个人发现了 3 种可能的解决方案,它们在不同的情况下效果很好:
选项 1 - 为默认安装了 python3 的主机设置 ansible_python_interpreter: /usr/bin/python3
如果您有办法根据主机是否默认安装python3 来对主机进行分组,我认为这是解决问题的最佳方法。据我所知,python3 适用于所有 Ubuntu 16.04 及更高版本。
- 如果您的所有主机都肯定有
python3,您可以将变量添加到您的group_vars/all.yml(或等效项):
# group_vars/all.yml
ansible_python_interpreter: /usr/bin/python3
- 如果您的某些主机没有
python3,并且您有办法在使用动态清单时标记它们(例如,ec2.py 的 AWS 标记),您可以像这样将变量应用于某些主机:李>
# group_vars/tag_OS_ubuntu1804.yml
ansible_python_interpreter: /usr/bin/python3
- 如果您使用静态清单并且能够根据主机是否有
python3 对主机进行分组,则可以执行以下操作:
# inventory/hosts
[python2_hosts]
centos7_server
[python3_hosts]
u1804_server
[python3_hosts:vars]
ansible_python_interpreter=/usr/bin/python3
我最喜欢这个选项,因为它不需要对远程主机进行任何更改,只需要对变量进行微小的更改,而选项 2 和 3 则需要添加到每个剧本中。
选项 2 - 使用 raw 安装 Python 2
此选项需要在每个使用raw 安装python 的剧本的顶部放置一个带有gather_facts: false 的剧本:
- name: install python2 on all instances
hosts: "*"
gather_facts: false
tasks:
- name: run apt-get update and install python
raw: "{{ item }}"
loop:
- sudo apt-get update
- sudo apt-get -y install python
become: true
ignore_errors: true
如果您打算在未安装 apt-get 的主机上运行该游戏(例如任何基于 RHEL 的主机),则需要ignore_errors: true,否则它们将在第一次运行时出错。
此解决方案有效,但由于以下几个原因,它在我的列表中是最低的:
- 需要在每个剧本的顶部(而不是选项 1)
- 假设
apt 在系统上并忽略错误(与选项 3 不同)
-
apt-get 命令很慢(相对于选项 3)
选项 3 - 符号链接 /usr/bin/python -> /usr/bin/python3 使用 raw
我还没有看到其他人提出的这个解决方案。这并不理想,但我认为它在很多方面都优于选项 2。我的建议是使用raw 运行一个shell 命令来符号链接/usr/bin/python -> /usr/bin/python3 如果python3 在系统上并且 python 不是:
- name: symlink /usr/bin/python -> /usr/bin/python3
hosts: "*"
gather_facts: false
tasks:
- name: symlink /usr/bin/python -> /usr/bin/python3
raw: |
if [ -f /usr/bin/python3 ] && [ ! -f /usr/bin/python ]; then
ln --symbolic /usr/bin/python3 /usr/bin/python;
fi
become: true
此解决方案类似于选项 2,因为我们需要将其放在每个剧本的顶部,但我认为它在以下几个方面更胜一筹:
- 仅在
python3 存在且 python 不存在的特定情况下创建符号链接 -- 如果 Python 2 已安装,则不会覆盖它
- 不假定已安装
apt
- 无需任何特殊错误处理即可针对所有主机运行
- 与
apt-get 相比,速度超快
显然,如果您需要在/usr/bin/python 安装 Python 2,则此解决方案不可行,选项 2 更好。
结论
- 如果可以的话,我建议在所有情况下都使用选项 1。
- 我建议使用选项 3,如果您的广告资源非常大/复杂,并且您无法轻松地将主机分组到
python3,这使得 选项 1 更加困难并且容易出错。
- 如果您需要在
/usr/bin/python 安装 Python 2,我只建议使用 选项 2 而不是 选项 3。
来源