gonuladami
gonuladami

Reputation: 97

using ansible variable in task conditonal

  1. When I use an Ansible variable in the failed_when conditional, Ansible complains and fails by telling me that I cannot use Jinja2 expressions with failed_when.

Below snippet does not work:

  vars:
  var1: "var"
  tasks:
    - name: "sth"
      raw: "anothersth"
      register: status
      failed_when: var1 in status.stdout
  1. I want to use a regex in the above example and use variable var1 within a regex. This also fails. I want to fail the task if var1 is repeated in the beginning and at the end of the stdout_lines. I was thinking something like this:

    failed_when: regex("^{{var1}}/.*/{{var1}}$") in status.stdout

I wonder whether there is a way to achieve what I intend to do?

===============================================================

Exact play and the description:

Let me explain what I am trying to do:

peers_underlay is a list defined in the host file:

peers_underlay: - ip: "172.16.1.2" - ip: "172.16.1.6"

This is the play:

- hosts: leaf-2, spine-1 gather_facts: no tags: [ verify ] vars: bgp_underlay: "show ip bgp summary"
tasks: - name: "underlay bgp test" raw: "{{ bgp_underlay }}" register: underlay_status with_items: "{{ peers_underlay }}" failed_when: not regex(".*/{{ item['ip'] }}/.*/Estab/.*") in underlay_status.stdout_lines

Upvotes: 1

Views: 510

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 68004

Q: "Fail the task if var1 is repeated in the beginning and at the end."

A: It's possible to test strings. For example, use regex

    - hosts: localhost
      vars:
        my_stdout1: 'ABC dlkjfsldkfjsldkfj ABC'
        my_stdout2: 'alkdjflaksdjflakdjflaksjdflaksdjflasj'
        var1: 'ABC'
        my_regex: '^{{ var1 }}(.*){{ var1 }}$'
      tasks:
        - debug:
            msg: my_regex match my_stdout1
          when: my_stdout1 is regex(my_regex)
        - debug:
            msg: my_regex match my_stdout2
          when: my_stdout2 is regex(my_regex)

gives

    "msg": "my_regex match my_stdout1"

The particular task sequence would be

      vars:
        var1: "var"
        my_regex: '^{{ var1 }}(.*){{ var1 }}$'
      tasks:
        - name: "sth"
          raw: "anothersth"
          register: status
          failed_when: status.stdout is regex(my_regex)

Upvotes: 1

Related Questions