Ansible Cheat Sheet¶
Debugging¶
{{ inventory_hostname }}
The inventory name for the current host being iterated over in the task. One of Ansible's Special Variables.
{{ ansible_facts }}
Dictionary of facts gathered or cached for the inventory_hostname
.
Print hostvars¶
- name: print hostvars debug: var: hostvars[inventory_hostname] # This is the same as {{ ansible_facts }} but note that ansible_facts will work differntly to hostvars[inventory_hostname] when delegating actions to another host. verbosity: 2
Note that hostvars[inventory_hostname]
will always give the facts for the specified inventory_hostname, whereas ansible_facts gives it for the machine the task is being run on. This behaviour will be apparent when delegating tasks to other machines, especially localhost which will not have had any facts gathered at all.
Flow control¶
Run a single task in serial in a Role. Note that the serial keyword is not applicable to a task, so we have to use a workaround with a side-effect which is that the host selected by Ansible to execute the run_once task will report as being changed even when the actual change took place on the host which the task was delegated to.
- name: Enable and start the service service: name: my_service enabled: yes state: started delegate_to: "{{ item }}" run_once: true loop: "{{ ansible_play_batch }}"
Loops¶
Loops work with when
and failed_when
as well as the until
conditions. when
will be evaluated once prior to entering the loop, until
will be evaluated as the loop repetition condition and finally the failed_when
condition will be evaluated a single time only once the until condition is true or the loop has reached the maximum retry
limit.
- name: Poll for Cassandra connection shell: "echo 'SHOW HOST;' | cqlsh {{ ansible_default_ipv4.address }} -u 'cassandra' --ssl" register: result until: result.stderr.find("Connection refused") == -1 retries: 10 delay: 10 changed_when: false failed_when: result.stderr.find("Connection refused") != -1
Blocks¶
Block sections include block
, rescue
and always
. These function like try
, catch
and finally
respectively. Blocks can accept options like run_once and tags, note that they can't be used to apply handlers which must be specified per task.
Process files on host¶
The find module can be used to find files on a remote host and then process them in later in the playbook by registering the output. The full filename and path is stored in the registered variable under files.path, which can be looped over as per the example below.
- name: find all logstash plugins find: paths: "{{ logstash_plugins_folder }}" patterns: "*.gem" recurse: no register: plugin_gems changed_when: no - name: ensure all plugins are installed logstash_plugin: name: "{{ item.path }}" state: present loop: "{{ plugin_gems.files }}" notify: restart logstash