Ansible 仅当安装了软件包时才禁用systemd服务

Ansible 仅当安装了软件包时才禁用systemd服务,ansible,Ansible,这就是我所拥有的 - name: disable os firewall - firewalld systemd: name: firewalld state: stopped enabled: no 此任务在安装了firewalld软件包的主机上正常工作,但在未安装的主机上失败 确保它能够处理未安装firewalld的主机的最佳简单方法是什么?我不想使用任何CMDB,因为它是一个附加设置。而且,我希望任务是幂等的;使用类似于dpkg或rpm的shell命令来查询是

这就是我所拥有的

- name: disable os firewall - firewalld
  systemd:
    name: firewalld
    state: stopped
    enabled: no
此任务在安装了
firewalld
软件包的主机上正常工作,但在未安装的主机上失败

确保它能够处理未安装
firewalld
的主机的最佳简单方法是什么?我不想使用任何CMDB,因为它是一个附加设置。而且,我希望任务是幂等的;使用类似于
dpkg
rpm
的shell命令来查询是否安装了
firewalld
,会使ansible playbook摘要报告发生我不希望发生的更改

确保它能够处理未安装
firewalld
的主机的最佳方法是什么

从任何类型的CMDB(如Ansible vars文件,因为您已经使用Ansible)获取有关安装了哪些系统的信息,并在这些系统上运行任务

同样,不要在没有根据从CMDB提取的配置安装
firewalld
的系统上运行任务



实际执行情况各不相同。其中包括:为播放指定适当的主机组,在任务中使用条件,对库存使用限制选项。

在Ansible播放中。在尝试停止/启动软件包之前,可以先检查软件包是否已安装


类似于此:

以下是一个使用
失败的示例:
。虽然每次都会运行,但如果未安装软件包,则会忽略故障:

- name: Stop and disable chrony service
  service:
    name:    chronyd
    enabled: no
    state:   stopped
  register: chronyd_service_result
  failed_when: "chronyd_service_result is failed and 'Could not find the requested service' not in chronyd_service_result.msg"

采用
shell
方法:

-name:如果启用,则禁用{{service}
shell:如果启用了systemctl——quiet{{service};然后systemctl disable{{service}}&&echo disable\u ok;fi
寄存器:输出
更改了输出.stdout中的“禁用\u确定”时的\u
它产生3种状态:

  • 服务不存在或已禁用-
    ok
  • 服务存在且已禁用-
    已更改
  • 服务存在并禁用失败-
    失败

我没有CMDB设置,也不想设置。我们有最小的系统,而拥有CMDB是一种过度的杀伤力。这并不意味着这不是问题所问的最好的方式。我也不确定CMDB(例如,Ansible vars文件)的形式是如何过度使用的。是的,我知道这一点。问题是,运行shell命令进行查询会使playbook变为非幂等函数。在ansible运行结束时,它会报告由于或运行shell命令而发生的更改。当您提出问题时,需要更加具体。这对于安全强化脚本(例如,CIS强化指南和公司it策略)特别有用。有时,指南要求禁用可能不存在的系统进程。此外,过滤器已弃用,因此2019版的
chronyd\u服务结果|失败
chronyd\u服务结果失败