仅在安装软件包时禁用systemd服务

时间:2017-10-27 05:56:50

标签: ansible

这就是我所拥有的

- name: disable os firewall - firewalld
  systemd:
    name: firewalld
    state: stopped
    enabled: no

此任务在安装了firewalld软件包的主机上运行正常,但在没有安装firewalld软件包的主机上运行失败。

确保它可以处理未安装dpkg的主机的最简单方法是什么?我不想使用任何CMDB,因为它是一个额外的设置。此外,我希望任务幂等;使用rpmfirewalld之类的shell命令来查询是否安装了let values = [ {name: "firstname", value: "Mike"}, {name: "lastname", value: "Smith "}, {name: "emailaddress", value: "mike@test.com"}, {name: "role", value: "123"} ] const newPropNames = [ "firstnameofperson", "lastnameofperson", "emailaddress", "roleofperson", ] const newValues = values .map((o,i) => ({ [newPropNames[i]]: o.value })) .reduce(((acc, nv) => Object.assign(acc, nv)), {}) 会使ansible playbook摘要报告发生更改,这是我不想要的。

4 个答案:

答案 0 :(得分:2)

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

- 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"

答案 1 :(得分:0)

  

确保它可以处理未安装firewalld的主机的最佳方法是什么?

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

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

实际执行情况各不相同。其中包括:使用条件在任务中指定适当的主题组,使用限制选项进行清点。

答案 2 :(得分:0)

在你的Ansible游戏中。在尝试停止/启动软件包之前,您可以先检查软件包是否已安装。

类似于此:https://stackoverflow.com/a/46975808/3768721

答案 3 :(得分:0)

使用shell方法:

- name: Disable {{ service }} if enabled
  shell: if systemctl is-enabled --quiet {{ service }}; then systemctl disable {{ service }} && echo disable_ok ; fi
  register: output
  changed_when: "'disable_ok' in output.stdout"

它产生3个状态:

  • 服务已不存在或已禁用-ok
  • 服务存在且已被禁用-changed
  • 服务存在且禁用失败-failed