Hey All,
I’m trying to force a task to run based on a host variable I’ve set. The goal is to only have the task run (on a host) when the “elasticsearch_purge_old_indices_node” variable is set to “yes”.
Inventory file:
[elasticsearch]
elasticsearch1 elasticsearch_purge_old_indices_node=yes
elasticsearch2
elasticsearch3
Task:
- name: add a nightly cronjob task to purge node
lineinfile: dest=/etc/crontab line=“0 1 * * * * root /path/to/script.sh” state=present
when: elasticsearch_purge_old_indices_node == “yes”
Error output:
TASK: [elasticsearch | cron job to purge old log indices] **************
fatal: [elasticsearch1] => One or more undefined variables: ‘dict object’ has no attribute ‘address’
fatal: [elasticsearch2] => error while evaluating conditional: elasticsearch_purge_old_indices_node == “yes”
fatal: [elasticsearch3] => error while evaluating conditional: elasticsearch_purge_old_indices_node == “yes”
How do I force a task to run based on a host variable I’ve set?
Thanks!
Hi Michael
Ansible considers “yes” strings as True booleans but for comparison you can use the bool filter. Perhaps try something like this:
- debug: msg="run this task"
when: elasticsearch_purge_old_indices_node|bool
Thanks for your help Tom.
So, in this situation there is actually no difference between…
elasticsearch_purge_old_indices_node|bool
AND
elasticsearch_purge_old_indices_node == “yes”
The error: “One or more undefined variables: ‘dict object’ has no attribute ‘address’” is a misnomer. B/c I was using incorrectly using {{ ansible_eth1.address }} instead of {{ ansible_eth1.ipv4.address }} elsewhere in the same task.
To sum this up, so this post is more useful for others. If you are trying to mark a host (i.e give it a host variable) so that it’s the only one that runs a task, here is what you do…
Inventory file:
[elasticsearch]
elasticsearch1 elasticsearch_purge_old_indices_node=yes
elasticsearch2
elasticsearch3
Task:
- name: add a nightly cronjob task to purge node
lineinfile: dest=/etc/crontab line=“0 1 * * * * root /path/to/script.sh” state=present
when: elasticsearch_purge_old_indices_node is defined
The line “when: elasticsearch_purge_old_indices_node is defined” does two things.
- ensures only the host with elasticsearch_purge_old_indices_node defined runs that task.
- ensures you don’t get an error like “error while evaluating conditional”, because you haven’t defined elasticsearch_purge_old_indices_node for your other hosts.
Good day gentlemen!
-Mike