Ansible 在条件不相等时失败!= 不适用于我的游戏

问题描述

当条件在 == 上正常工作但在 != 上无法正常工作时,以下剧本检查和比较输入包名称和版本与我们的系统!

---
- 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  

解决方法

正如@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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...