How to check few keywords in a string and assert if not present in Ansible tasks

I have a string like this

"3000 Native                           active    Po121, Po123"

I need to check if 3000 is present and active is present in this string. If not assert

I wanted to use when command and set_fact. Check if the variable present and assert. (which I haven't finished). Right now I am just printing a message. This is not the good to way to do it. If I can assert directly when 3000 and active not present, that would be great. Also another question about when, if it matches first condition, it prints the debug message. It should match both right as its an and?

var:
  vlan_output: "3000 Native                           active    Po121, Po123"

item={vlan_id: 3000, state: present}

I tried like this

 - name: Validate vlan for delete

   debug: msg="VLAN FAILED "

   when: item.state == "present" and "item.vlan_id not in vlan_output"

Upvotes: 1

Views: 13944

Answers (2)

error404
error404

Reputation: 2823

We can directly use the when condition if "3000" and "active" is present in the output

I believe the vlan_id would be a registered variable so the value can be accessed using vlan_id.stdout.

The below play works with when and assert module of ansible

for assertion +ve:

command -->

ansible-playbook tmp.yml --extra-vars "vlan_output='3000 active'"

playbook -->

---
- hosts: localhost
  tasks:
    - debug:
        msg: "Strings Matched"
      when: vlan_output | search("3000") and vlan_output | search("active")
    - debug:
        var: vlan_output
    - assert:
        that:
          - "'3000' in vlan_output"
          - "'active' in vlan_output"

output -->

ok: [localhost] => {
    "msg": "Strings Matched"
}

TASK [debug] *****************************************************************************************************************************
ok: [localhost] => {
    "vlan_output": "3000 active"
}

TASK [assert] ****************************************************************************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "All assertions passed"
}

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

for assertion -ve:

command -->

ansible-playbook tmp.yml --extra-vars "vlan_output='is'"

playbook -->

---
- hosts: localhost
  tasks:
    - debug:
        msg: "Strings Matched"
      when: vlan_output is not search("3000") and vlan_output is not search("active")
    - debug:
        var: vlan_output
    - assert:
        that:
          - "'3000' not in vlan_output"
          - "'active' not in vlan_output"

output -->

PLAY [localhost] *******************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ***********************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "Strings Matched"
}

TASK [debug] ***********************************************************************************************************************************************************
ok: [localhost] => {
    "vlan_output": "is"
}

TASK [assert] **********************************************************************************************************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "All assertions passed"
}

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

Upvotes: 1

Matt P
Matt P

Reputation: 2625

There's a couple of issues here

Firstly, you should not quote "item.vlan_id not in vlan_output" - this is a string and will always evaluate to True.

Secondly, the not in test requires the operands to be type string (currently vlan_id is an integer).

You should see the behaviour you are looking for with these changes:

  vars:
    vlan_output: "3000 Native active Po121, Po123"
    item:
      vlan_id: "3000"
      state: present

  tasks:
    - debug: msg="VLAN FAILED"
      when: item.state == "present" and item.vlan_id not in vlan_output

Upvotes: 1

Related Questions