这就是我所拥有的
- name: disable os firewall - firewalld
systemd:
name: firewalld
state: stopped
enabled: no
此任务在安装了firewalld
软件包的主机上运行正常,但在没有安装firewalld
软件包的主机上运行失败。
确保它可以处理未安装dpkg
的主机的最简单方法是什么?我不想使用任何CMDB,因为它是一个额外的设置。此外,我希望任务幂等;使用rpm
或firewalld
之类的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摘要报告发生更改,这是我不想要的。
答案 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游戏中。在尝试停止/启动软件包之前,您可以先检查软件包是否已安装。
答案 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