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
是的raw
module 是使用 Ansible 安装 Python 的首选方式。您可能还想包含 Ansible 的一些其他必要软件包:
- name: Bootstrap a host without python2 installed
raw: dnf install -y python2 python2-dnf libselinux-python
easy_install
raw
依赖于 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
是要查找的正确文件,但希望您能明白。