使用“failed_when”处理错误不起作用

问题描述 投票:0回答:1

我希望创建一个在多个服务器上运行的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行,但这并没有改变一件事。有些东西不见了,但我看不出来。

有什么建议?

ansible
1个回答
1
投票

因此,剧本应该检查是否禁用了多个服务以及它们是否已停止。

你的剧本没有做这些事情。如果服务存在,无论它是否正在运行,那么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('')

如果由于目标主机上没有匹配服务这一事实之外的原因而停止服务失败,这只会使任务失败。

© www.soinside.com 2019 - 2024. All rights reserved.