在 CentOS 8 上使用 Ansible 安装 Python 的首选方法是什么

在 CentOS 8 上使用 Ansible 安装 Python 的首选方法是什么

CentOS 8 并非总是预装 Python,因此 Ansible 无法在远程计算机上运行,​​除非安装 Python。然而,在经典的“鸡生蛋”模式中,您无法使用 Ansible 模块dnf来安装 Python。

我一直在使用:

- name: Install Python 3
  raw: dnf -y install python3

然而,问题在于我要么必须设置changed_when: false,要么它总是返回改变的状态。如果可能的话,我希望正确报告状态。

然而我发现easy_install这似乎只处理 Python 库,而不是 Python 本身。是否有内置方法来处理这个问题,或者这是raw:唯一的选择?

答案1

是的rawmodule 是使用 Ansible 安装 Python 的首选方式。您可能还想包含 Ansible 的一些其他必要软件包:

- name: Bootstrap a host without python2 installed
  raw: dnf install -y python2 python2-dnf libselinux-python

easy_installraw依赖于 Python。当 Python 不存在时,没有其他办法。通常我将这个raw任务用作仅执行一次的特殊引导剧本的一部分。将此任务定义在其他角色和剧本之外的另一个原因是,当目标系统上不存在 Python 时,您无法使用事实收集。

答案2

借用这篇博文,如果你传递raw一个包含对正在安装的包的测试的命令,那么你就可以正确设置 Ansible 更改状态。

- name: Bootstrap a host without python2 installed
  raw: bash -c "test -e /usr/bin/python2 || (dnf install -y python2 python2-dnf libselinux-python)"
  register: output
  changed_when: output.stdout

如果/usr/bin/python2存在,output.stdout则将为空白,并且 Ansible 将报告该任务为“ok”。

如果/usr/bin/python2不存在,那么 dnf 将安装软件包并生成一堆输出,并且output.stdout不会为空白,导致 Ansible 报告“已更改”。

不确定这是否/usr/bin/python2是要查找的正确文件,但希望您能明白。

相关内容