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, thereforejoin('')
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
Author by
techkid
Updated on June 04, 2022Comments
-
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 over 5 yearsWhen 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 over 5 yearsHow 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 over 5 yearsi 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 over 5 yearsSomehow, 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)