Ansible 理解可解释条件句

Ansible 理解可解释条件句,ansible,Ansible,我有一个包含多个任务的playbook(CIS合规标准),我希望根据ansible返回代码生成“成功”或“失败” --- - name: 2.2.# Ensure ### Server is not enabled block: - name: Check if ### exists stat: path=/usr/lib/systemd/system/###.service register: exists - name: Disable if e

我有一个包含多个任务的playbook(CIS合规标准),我希望根据ansible返回代码生成“成功”或“失败”

---
- name: 2.2.# Ensure ### Server is not enabled
  block:
    - name: Check if ### exists
      stat: path=/usr/lib/systemd/system/###.service
      register: exists

    - name: Disable if exists
      service:
        name: ###
        state: stopped
        enabled: no
      when: exists.stat.exists
      register: result



- name: To File
  block:
    - name: Success
      lineinfile:
        dest: ./results/{{ customer }}-{{ scan_type }}-{{ inventory_hostname }}.txt
        line: "{{ inventory_hostname }} 2.2.9 success"
        insertafter: EOF
      delegate_to: localhost
      check_mode: False
      when: ((result is skipped) or (result.enabled == false))

    - name: Failed
      lineinfile:
        dest: ./results/{{ customer }}-{{ scan_type }}-{{ inventory_hostname }}.txt
        line: "{{ inventory_hostname }} 2.2.9 failed"
        insertafter: EOF
      delegate_to: localhost
      check_mode: False
      when: ((result is not skipped) or (result.enabled == true))
根据我的观察,“结果”可以有两种不同的输出,这取决于是否触发了“如果存在则禁用”块。 如果它被触发,它将根据“服务”模块给出一个输出。 如果跳过它,它将给出泛型Ansible输出

我很同意,但我似乎无法理解的是条件语句

when: ((result is not skipped) or (result.enabled == true))
这将始终尝试解决这两个选项,因此如果模块触发,它将失败,因为“跳过”不是服务模块的属性。如果它跳过,它会通过,但如果被触发,它显然会失败。这就像它希望在评估之前所有条件都存在,尽管有“或”语句

when: ((result is not skipped) or (result.enabled == true))

我做错了什么?

你的意思是跳过
结果而不是
结果不被跳过
?在任何情况下,都可以使用
default
过滤器解决此问题,如果输入表达式未定义,该过滤器将提供默认值。例如:

when: result.enabled|default(false) == true
当然,由于这是一个布尔值,您可以进一步将其简化为:

when: result.enabled|default(false)

我的意思是没有跳过
结果
,如果没有跳过
Disable if exsits
部分或者结果返回enabled为true,则需要触发“failed”部分。我刚刚尝试了你的解决方案,结果喜忧参半。我知道您的解决方案是更干净、更正确的选择,但我已经设法让它暂时与
block rescue
配合使用。谢谢你的帮助