Checking for multiple conditions using "when" on single task in ansible

AnsibleAnsible Playbook

Ansible Problem Overview


I want to evaluate multiple condition in ansible using when, here is my playbook:

- name: Check that the SSH Key exists
   local_action:
     module: stat
     path: "/home/{{ login_user.stdout }}/{{ ssh_key_location }}"
   register: sshkey_result

 - name: Generating a new SSH key for the current user it's not exists already
   local_action:
      module: user
      name: "{{ login_user.stdout }}"
      generate_ssh_key: yes 
      ssh_key_bits: 2048
   when: sshkey_result.rc == 1 and  ( github_username is undefined or github_username |lower == 'none' )

here is my var file for reference:

---
vpc_region: eu-west-1
key_name: my_github_key
ssh_key_location: .ssh/id_rsa.pub

When I try to execute this playbook, I am getting this error:

TASK: [test | Check that the SSH Key exists] **********************************
ok: [localhost -> 127.0.0.1]
    
 TASK: [test | Generating a new SSH key for the current user it's not exists already] ***
 fatal: [localhost] => error while evaluating conditional: sshkey_result.rc == 1 and  ( github_username is undefined or github_username |lower == 'none' )
        
        FATAL: all hosts have already failed -- aborting

Can somebody point me out that how we can use multiple conditions with ansible on single task.

Thanks

Ansible Solutions


Solution 1 - Ansible

You can use like this.

when: condition1 == "condition1" or condition2 == "condition2"

Link to official docs: The When Statement.

Also Please refer to this gist: https://gist.github.com/marcusphi/6791404

Solution 2 - Ansible

Adding to https://stackoverflow.com/users/1638814/nvartolomei answer, which will probably fix your error.

Strictly answering your question, I just want to point out that the when: statement is probably correct, but would look easier to read in multiline and still fulfill your logic:

when: 
  - sshkey_result.rc == 1
  - github_username is undefined or 
    github_username |lower == 'none'

https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html#the-when-statement

Solution 3 - Ansible

The problem with your conditional is in this part sshkey_result.rc == 1, because sshkey_result does not contain rc attribute and entire conditional fails.

If you want to check if file exists check exists attribute.

Here you can read more about stat module and how to use it.

Solution 4 - Ansible

Also you can use default() filter. Or just a shortcut d()

- name: Generating a new SSH key for the current user it's not exists already
  local_action:
	module: user
	name: "{{ login_user.stdout }}"
	generate_ssh_key: yes 
	ssh_key_bits: 2048
  when: 
	- sshkey_result.rc == 1
	- github_username | d('none') | lower == 'none'

Solution 5 - Ansible

You can use logical operators to combine conditions. When you have multiple conditions that all need to be true (that is, a logical and), you can specify them as a list:

tasks:
  - name: Shut down CentOS 6 systems
    ansible.builtin.command: /sbin/shutdown -t now
    when:
      - ansible_facts['distribution'] == "CentOS"
      - ansible_facts['distribution_major_version'] == "6"

Link to the doc : https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html#the-when-statement

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionArbab NazarView Question on Stackoverflow
Solution 1 - AnsibleDhanasekaran AnbalaganView Answer on Stackoverflow
Solution 2 - Ansibleuser2066480View Answer on Stackoverflow
Solution 3 - AnsiblenvartolomeiView Answer on Stackoverflow
Solution 4 - AnsibleALex_hhaView Answer on Stackoverflow
Solution 5 - AnsiblequicksilverView Answer on Stackoverflow