Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use a condition to set a variable value in Ansible?

Tags:

ansible

I have two variables: a, b.

I want to assign a value to a variable c based on which: a or b contains greater numerical value.

This what I tried:

- set_fact:
    c: "test1"
  when: a <= b

- set_fact:
    c: "test2"
  when: b <= a

Look like it always sets c to test1 not test2.

like image 714
user3214546 Avatar asked Mar 08 '17 00:03

user3214546


People also ask

How do you assign a value to a variable in Ansible?

Assigning a value to a variable in a playbook is quite easy and straightforward. Begin by calling the vars keyword then call the variable name followed by the value as shown. In the playbook above, the variable name is salutations and the value is Hello world!

How do you pass variables in Ansible?

To pass a value to nodes, use the --extra-vars or -e option while running the Ansible playbook, as seen below. This ensures you avoid accidental running of the playbook against hardcoded hosts.

Which argument will you use to specify a variable for your Ansible playbook?

Setting Variables on the Command Line Variables set by passing -e var=value to ansible-playbook have the highest precedence, which means you can use this to override variables that are already defined. Example 4-11 shows how to set the variable named token to the value 12345 .


1 Answers

  • Using if-else expression:

    - set_fact:
        c: "{{ 'test1' if (a >= b) else 'test2' }}"
    
  • Using ternary operator:

    - set_fact:
        c: "{{ (a >= b) | ternary ('test1', 'test2') }}"
    
  • Using your own code which is correct (see the notice below)


Either of the above methods requires both variables used in comparison to be of the same type to give sensible results. And for a numerical comparison, they require both values to be integers.

The code from the question:

- set_fact:
    c: "test1"
  when: a <= b

- set_fact:
    c: "test2"
  when: b <= a

works properly in two cases:

  • both: a and b are integers
  • both: a and b are strings containing numerical value with the same number of digits

However it produces unexpected result is when:

  • one of the values is string and the other integer
  • the string values contain numerical values with different number of digits
like image 62
techraf Avatar answered Sep 16 '22 15:09

techraf