【问题标题】:Ansible fail when condition not equal != not work on my play当条件不相等时,Ansible 失败!= 不适用于我的游戏
【发布时间】:2021-01-24 19:29:36
【问题描述】:

下面的剧本用于检查输入包名称和版本并将其与我们的系统进行比较,当条件在 == 上正常工作但不能正常工作时!= 我不知道为什么,过去几天我一直坚持这个

---
- hosts: "{{ cluster_name }}"
  user: sv_operator
  become: False
  gather_facts: yes
  vars:
    ansible_python_interpreter: /d2/local/bin/python
  vars_prompt:
    - name: cluster_name
      prompt: "Enter Cluster Name (Custer1/Cluster2/Cluster3)"
      private: no

  tasks:
    - pause:
        prompt: "Enter the name of Package and version"
      register: prompt
      no_log: yes
      run_once: yes

    - set_fact:
        package_fact : "{{ prompt.user_input }}"

    - shell: 
        cmd: "show system version | tr -s ' ' |  grep  '{{ package_fact }}' "
      register: svcli_output

    - name: Package Version
      debug:
        msg: "{{ svcli_output.stdout }}"

    - debug:
        msg: "PTS package {{ package_fact | upper}} match with existed one on the system"
      ignore_errors: yes
      when:  svcli_output.stdout == package_fact

    - fail:
        msg: "PTS package {{ package_fact | upper}} NOT match with existed one on the system"
      ignore_errors: yes
      when:  svcli_output.stdout != package_fact

条件匹配时输出 (==)

TASK [debug] *******************************************************************************************************************************************************
ok: [host-offline-01] => {}

MSG:

PTS package PROTOCOLS 20.12.01 match with existed one on the system

TASK [debug] *******************************************************************************************************************************************************
skipping: [host-offline-01]

PLAY RECAP *********************************************************************************************************************************************************
host-offline-01             : ok=6    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

条件不匹配时的输出 (!=)

TASK [shell] *******************************************************************************************************************************************************
fatal: [host-offline-01]: FAILED! => {
    "changed": true,
    "cmd": "show system version | tr -s ' ' |  grep  'Protocols 20.12.02' ",
    "delta": "0:00:00.324347",
    "end": "2021-01-24 18:58:44.685277",
    "rc": 1,
    "start": "2021-01-24 18:58:44.360930"
}

MSG:

non-zero return code

PLAY RECAP *********************************************************************************************************************************************************
host-offline-01             : ok=3    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0  

【问题讨论】:

  • 您的问题与您的 when 条件无关。您的 shell 命令失败 (rc != 0) 并且您的剧本停止。此外,您不应在已关闭的新问题中重新发布您的问题:编辑原始问题并等待它最终重新打开。为避免这种情况,我建议您查看以How to ask 开头的帮助部分,并尝试从一开始就使用所有需要的信息编写问题。

标签: ansible ansible-inventory ansible-facts


【解决方案1】:

正如@Zeitounator 在他的评论中指出的那样,shell 命令失败并且剧本执行正在停止。之后它就再也不会执行任何任务了。

这是grep 命令的行为。如果给定的表达式匹配,则返回0,否则返回1。因为我们希望即使 grep 返回非零代码也能运行后续任务。我们需要“忽略”shell 任务的返回码。我们可以通过两种方式做到这一点:

  • 使用ignore_errors
  • 使用failed_when

在下面的示例中,我使用的是failed_when

  - shell:
      cmd: "show system version | tr -s ' ' | grep '{{ package_fact }}'"
    register: svcli_output
    failed_when: svcli_output.rc > 1
  - name: Package version
    debug:
      var: svcli_output.stdout
  - debug:
      msg: "PTS package {{ package_fact|upper}} match with existed one on the system"
    when: svcli_output.stdout == package_fact
  - fail:
      msg: "PTS package {{ package_fact|upper}} NOT match with existed one on the system"
    when: svcli_output.stdout != package_fact

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2017-04-22
    相关资源
    最近更新 更多