我希望创建一个在多个服务器上运行的ansible playbook,以检查是否符合合规性规则。因此,剧本应该检查是否禁用了多个服务以及它们是否已停止。我知道并非所有服务都将在所有计算机上运行或启用。因此,我希望在剧本中处理某些返回代码。
我为此任务尝试了failed_when
声明。这似乎是要走的路,因为它允许设置要处理的RC。
- hosts: server_group1
remote_user: ansible
tasks:
- name: Stop services
command: /bin/systemctl stop "{{ item }}"
with_items:
- cups
- avahi
- slapd
- isc-dhcp-server
- isc-dhcp-server6
- nfs-server
- rpcbind
- bind9
- vsftpd
- dovecot
- smbd
- snmpd
- squid
register: output
failed_when: "output.rc != 0 and output.rc != 1"
但是,只有在我使用示例代码中未显示的ignore_errors: True
时,循环才有效。我知道我希望从剧本执行的命令中捕获RCs 0和1。但无论什么failed_when
总是会产生致命的错误而且我的剧本失败了。我也试过了没有“”的failed_when行,但这并没有改变一件事。有些东西不见了,但我看不出来。
有什么建议?
因此,剧本应该检查是否禁用了多个服务以及它们是否已停止。
你的剧本没有做这些事情。如果服务存在,无论它是否正在运行,那么systemctl stop <service>
将在大多数情况下成功返回。只有当(a)服务不存在或(b)systemd由于某种原因无法停止服务时,才会获得非零退出代码。
请注意,调用systemctl stop
对服务是否被禁用没有影响;使用您当前的playbook,所有这些服务将在主机下次启动时重新启动。
如果您的目标不仅仅是检查服务是否已停止和禁用,而是确保停止和禁用服务,您可以执行以下操作:
- name: "Stop services"
service:
name: "{{ item }}"
enabled: false
state: stopped
ignore_errors: true
register: results
loop:
- cups
- avahi
- slapd
- isc-dhcp-server
- isc-dhcp-server6
- nfs-server
- rpcbind
- bind9
- vsftpd
- dovecot
- smbd
- snmpd
- squid
你可能想在这里使用ignore_errors: true
,因为你想为列表中的每个项目运行任务。
处理错误的另一种方法可能是:
failed_when: >-
results is failed and
"Could not find the requested service" not in results.msg|default('')
如果由于目标主机上没有匹配服务这一事实之外的原因而停止服务失败,这只会使任务失败。