我个人发现了针对此问题的3种可能的解决方案,它们在不同情况下均能很好地起作用:
选项1- ansible_python_interpreter: /usr/bin/python3
为python3
默认安装的主机设置
我认为,如果可以python3
通过默认情况下是否安装主机来对主机分组,则这是解决该问题的上乘方法。据我所知,python3
它在所有Ubuntu 16.04及更高版本中均可用。
- 如果您的所有主机都肯定有
python3
,则可以将变量添加到您的group_vars/all.yml
(或等效变量)中:
# group_vars/all.yml
ansible_python_interpreter: /usr/bin/python3
- 如果您的某些主机没有,
python3
并且您可以在使用动态清单时对它们进行标记(例如,对AWS进行AWS标记ec2.py
),则可以将变量应用于某些主机,如下所示:
# 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-使用以下命令安装Python 2 raw
此选项需要把一个戏在每剧本的顶部gather_facts: false
,使用raw
安装python
:
- 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
ignore_errors: true
如果您打算在尚未apt-get
安装的主机(例如,基于RHEL的任何主机)上运行该播放,则是必需的,否则它们将在第一次播放中出错。
此解决方案有效,但由于某些原因,它是我列出的最低解决方案:
- 需要放在每个剧本的顶部(与选项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
显然,如果您需要在处安装Python 2 /usr/bin/python
,则此解决方案是不可行的,选项2更好。
结论
- 如果可以,我建议在所有情况下都使用选项1。
- 如果您的清单确实很大/很复杂,并且您无法轻松地将主机分组,则建议使用选项3
python3
,这会使选项1更加困难且容易出错。
- 如果您需要在处安装Python 2,我只建议选项2胜过选项3
/usr/bin/python
。
资料来源