Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
448 views
in Technique[技术] by (71.8m points)

Ansible fail when condition not equal != not work on my play

The below playbook to check and compare input package name and version with our system when condition working fine on == but not works on != I don't why, And I'm stuck on this for the last couple of days

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

Output when condition match (==)

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   

Output when condition did not match (!=)

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  
question from:https://stackoverflow.com/questions/65874976/ansible-fail-when-condition-not-equal-not-work-on-my-play

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

As @Zeitounator pointed out in his comment, the shell command is failing and the playbook execution is stopping. It never gets to any of the tasks after that.

This is the behaviour of the grep command. If the given expression is matched, it returns return code of 0, else it returns 1. As we want subsequent tasks to run even if grep returns non-zero code. We need to "ignore" the return code of the shell task. We can do it in two ways:

  • Use ignore_errors
  • Use failed_when

In the below example I am using 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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...