If else in ansible print statement

15,884

Solution 1

you can use this syntax instead:

"{% if test_var == true %} LTE status on '{{ inventory_hostname }}' is good to go!{% else %} LTE status on '{{inventory_hostname}}' is not operational!{% endif %}"

see full working example below, i am using a boolean test_var to control the output:

---
- hosts: localhost
  gather_facts: false
  vars:
    test_var: true
  tasks:

  - debug:
      msg: "{% if test_var == true %} LTE status on '{{ inventory_hostname }}' is good to go!{% else %} LTE status on '{{inventory_hostname}}' is not operational!{% endif %}"

output:

[http_offline@greenhat-29 tests]$ ansible-playbook test.yml 

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

TASK [debug] ***********************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": " LTE status on 'localhost' is good to go!"
}

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

[http_offline@greenhat-29 tests]$ 

EDIT:

updated PB with a multi-line variable:

---
- hosts: localhost
  gather_facts: false
  vars:
    test_var: ['text line 1', 'texttttttttttt Selected = LTE more text', 'text line 3']
  tasks:

  - debug:
      msg: "{% if test_var | join('') is search('Selected = LTE') %} LTE status on '{{ inventory_hostname }}' is good to go!{% else %} LTE status on '{{inventory_hostname}}' is not operational!{% endif %}"

Solution 2

Try this:

- debug:
    msg: "{{ output.stdout is search('Selected = LTE') | ternary('LTE status on ' + inventory_hostname + ' is good to go!', 'LTE status on ' + inventory_hostname + ' is not operational!') }}"

You are better simplifying where you can, and sticking to pure Jinja2 filters as much as possible. Hopefully this is a little more readable.

  • removed join(''). The join filter is used for joining arrays into a single string. stdout is a string. stdout_lines is the array based version of the output, therefore join('') appears redundant in this case.
  • removed all the if/else stuff and replaced with the ternary filter. This simply takes a boolean and returns the first string if true and the second if false
  • removed the nested {{}} which are invalid. If you check out the ternary filter you will see that inside {{}} 'string' + variable_name combines a literal string with a variable
Share:
15,884
techkid
Author by

techkid

Updated on June 04, 2022

Comments

  • techkid
    techkid almost 2 years

    I would like some help with syntax for a print statment that has multiple conditions. Currently, the quotes for '{{inventory_hostname}}' is causing errors and if I remove the quotes the playbook runs but lists the text inventory_hostname instead of the variable. I would like know how I can get the variable to print and also if the syntax in the if else statement is good.

    - debug:
        msg: "{{ 'LTE status on '{{inventory_hostname}}'  is good to go!' if output.stdout | join('') is search('Selected = LTE') else  'LTE status on '{{inventory_hostname}}'  is not operational!' }}"
    
  • techkid
    techkid over 5 years
    When I try this i get the error FAILED! => {"msg": "Unexpected templating type error occurred on ({{ output.stdout | search('Selected = LTE') | ternary('LTE status on ' + inventory_hostname + ' is good to go!', 'LTE status on ' + inventory_hostname + ' is not operational!') }}): expected string or buffer"}
  • techkid
    techkid over 5 years
    How would I implement the when statement to check if LTE is in the output? This is what would set the condition to true.
  • ilias-sp
    ilias-sp over 5 years
    i believe the filtering you have applied is correct, i just didnt have the output.stdout to test it on my own. i am adding a better example in the answer.
  • clockworknet
    clockworknet over 5 years
    Somehow, despite copying and pasting, I ended up with a syntax error, tho it did not produce the error you were seeing, so perhaps we both have a copy and paste issue :) Anyway, I have edited the code in my answer and double checked it works. (I am testing on Ansible 2.5)