Ansible gives you conditionals to use when you want to check if something meets a certain criteria. However conditionals can become annoying if you need many include statements or repeat tasks based on facts. Here’s a way to minimize the need for them in the tasks themselves.
Let’s take Apache for example:
- name: install apache
package:
name: httpd
state: installed
when: ansible_distribution == 'CentOS'
- name: install apache
package:
name: apache2
state: installed
when: ansible_distribution == 'Ubuntu'
This can become annoying and hard to read when it’s all in one file. If you have a lot of these you can separate out specific .yml files to include a conditional:
- include: centos.yml
when: ansible_distribution == 'CentOS'
- include: ubuntu.yml
when: ansible_distribution == 'Ubuntu'
However sometimes a cleaner way (in my opinion) is to use a variable to minimize the use of conditional statements. Using the same example with Apache:
- name: install apache
package:
name: "{{ apache_package }}"
state: installed
Then in your variables file set this dictionary and variable:
dist_dict:
"RedHat":
apache: 'httpd'
"Fedora":
apache: 'httpd'
"CentOS":
apache: 'httpd'
"Ubunu":
apache: 'apache2'
apache_package: "{{ dist_dict[ansible_distribution]['apache'] }}"
You can take this one step further and utilize that same dictionary for services (and other things) as well.
dist_dict:
"RedHat":
apache_package: 'httpd'
apache_service: 'httpd'
"Fedora":
apache_package: 'httpd'
apache_service: 'httpd'
"CentOS":
apache_package: 'httpd'
apache_service: 'httpd'
"Ubunu":
apache_package: 'apache2'
apache_service: 'apache2'
apache_package: "{{ dist_dict[ansible_distribution]['apache_package'] }}"
apache_service: "{{ dist_dict[ansible_distribution]['service_service'] }}"
Then your tasks could simply be:
- name: install apache
package:
name: "{{ apache_package }}"
state: installed
- name: start apache
service:
name: "{{ apache_service }}"
state: started
enabled: true
This gives you the power to utilize these variables in other places without including whole .yml files or using a bunch of conditional statements.