monk
monk

Reputation: 2115

Print custom message from until loop in ansible

I am trying to run a command multiple times and check if the output contains some string in it("hi"). I am purposefully simulating failure and expecting the until loop to fail. Everything is good till this point.

Now, I need to have some custom message stating why the until loop or the task failed. For Example: "Your command failed to print hi"

So Question is, How can I print custom message from until loop if the loop failed to pass withing the retries.

Playbook:

-->cat until.yml
---

- hosts: localhost
  gather_facts: no
  tasks:

    - name: "check command"
      shell: echo hello
      register: var
      until: var.stdout.find('hi') != -1
      retries: 5
      delay: 1

playbook output:

 -->ansible-playbook until.yml
PLAY [localhost] *************************************************************************************************************************************************************************************************************************

TASK [check command] ********************************************************************************************************************************************************************************************************
FAILED - RETRYING: who triggered the playbook (5 retries left).
FAILED - RETRYING: who triggered the playbook (4 retries left).
FAILED - RETRYING: who triggered the playbook (3 retries left).
FAILED - RETRYING: who triggered the playbook (2 retries left).
FAILED - RETRYING: who triggered the playbook (1 retries left).
fatal: [localhost]: FAILED! => {
    "attempts": 5,
    "changed": true,
    "cmd": "echo hello",
    "delta": "0:00:00.003004",
    "end": "2019-12-03 10:04:14.731488",
    "rc": 0,
    "start": "2019-12-03 10:04:14.728484"
}

STDOUT:

hello


PLAY RECAP *******************************************************************************************************************************************************************************************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=1

Upvotes: 6

Views: 4925

Answers (2)

P....
P....

Reputation: 18381

You can divide your task into two tasks:

  1. First task will poll for the desired output using until loop. But we have used ignore_errors: True , so that until loop will not fail the playbook. We will just capture the result.

  2. In second task , use assert to print success_msg for success case and fail_msg for failure case.

Following is tweaked ,minimum working example:

---

- hosts: localhost
  gather_facts: no
  tasks:

    - name: "check command"
      shell: echo hello
      register: var
      until: var.stdout.find('hi') != -1
      retries: 5
      delay: 1
      ignore_errors: true

    - name: "Print result"
      assert:
        that: var.stdout|regex_search('hi')
        fail_msg: "COuld not find HI in command output"
        success_msg: "Hi is present in Command output"

Upvotes: 2

Zeitounator
Zeitounator

Reputation: 44635

Have a look at block error handling which can be used for this purpose.

Basic overview:

- block:
    - name: A task that may fail.
      debug:
        msg: "I may fail"
      failed_when: true
      register: might_fail_exec

  rescue:
    - name: fail nicely with a msg
      fail:
        msg: "The task that might fail has failed. Here is some info from the task: {{ might_fail_exec }}"

Upvotes: 0

Related Questions