TL;DR: You can use when:
in ${role}/meta/main.yml
A while ago I started using Ansible to provision some aspects of my lab and servers. At some point, for one of the roles being worked on (some elasticsearch mini-cluster in this particular case), a specific role needed to be applied to some servers, but only when a condition was met. There are a few ways in which this can be achieved:
Include your roles for specific hosts only, in site.yml, e.g:
# site.yml
- name: configure the elasticsearch cluster
hosts:
- elasticsearch_servers
roles:
- elasticsearch
- name: configure the data indexers on the master node only
hosts:
- elasticsearch_masters
roles:
- es_indexer
The above will work just as intended, but IMHO it's not too elegant, and requires you to define a second elasticsearch_masters
host group.
Or, use role dependencies, by configuring a meta/main.yml
to the elasticsearch role:
# roles/elasticsearch/meta/main.yml
---
dependencies:
- role: es_indexer
However, this will apply the es_indexer to all the elasticsearch nodes. With only a small change we can beat it into submission: by using the when
keyword:
# roles/elasticsearch/meta/main.yml
---
dependencies:
- role: es_indexer
when: es_master_node == True
Just remember to define es_master_node = True
in your host_vars
for the specific nodes (or use some other external variable if you have a dynamic inventory script with an external data source)