Ansible tips & tricks
Ansible data types
integer: 3211241
boolean: true/false
float: 3.141592653
string: "qwerty"
list:
- "item 1"
- "item 2"
dictionary:
key1: "value 1"
key2: "value 2"
Dump all variables
---
- name: dump all
hosts: all
tasks:
- name: Print some debug information
vars:
msg: |
Module Variables ("vars"):
--------------------------------
{{ vars | to_nice_json }}
Environment Variables ("environment"):
--------------------------------
{{ environment | to_nice_json }}
GROUP NAMES Variables ("group_names"):
--------------------------------
{{ group_names | to_nice_json }}
GROUPS Variables ("groups"):
--------------------------------
{{ groups | to_nice_json }}
HOST Variables ("hostvars"):
--------------------------------
{{ hostvars | to_nice_json }}
debug:
msg: "{{ msg.split('\n') }}"
manipulating data
Extract subitems from list of dictionaries
Use "{{ variable | map(attribute='key_name') | list }}"
Select items from list of dictionaries
Use "{{ variable | selectattr('key_name', 'match', 'value') | list }}"
Instead of match, you can also use search or regex. See:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html#testing-strings
See the Jinja2 documentation for a list of available tests:
https://jinja.palletsprojects.com/en/2.9.x/templates/#list-of-builtin-tests
Apply a filter to a list of items
Use "{{ variable | map('
', 'filter_option1', 'filter_option2') | list }}"
For example:
"{{ output.stdout_lines | map('regex_replace', '^(\S+)\s.*$', '\\1') | list }}"
Be careful on the context in which you use this. In some cases you must use a single backslash (displaying a variable with debug for example): '\1'
Filter a list of strings
Use "{{ variable | select('match', 'some string') | list }}"
Instead of match, you can also use search or regex. See: https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html#testing-strings
Sort list of dictionaries by subitem
Use "{{ variable | sort(attribute='key_name') }}"
Searching a string in a when statement
Use: when: my_string is match(pattern)
Instead of match, you can also use search or regex. See: https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html#testing-strings
Add a string to a string
Use "{{ string1 + string2 }}"
Or: "{{ string1 + ', ' + string2 }}"
Add item to list
Use "{{ variable | default([]) + [item] }}"
Add item to dictionary
Use "{{ variable | default({}) | combine({key_name: key_value}) }}"
Replace multiple lines using replace module (lineinfile does not support multi-line regexp)
Example:
- name: Comment out hint zone "." in named.conf
replace:
path: "/etc/named.conf"
regexp: '^(zone\s+"\."\s+IN\s+{[^\n]*)\n(\s*type\s+hint;[^\n]*)\n(\s*file\s+"named\.ca";[^\n]*)\n(};)'
replace: '# \1\n# \2\n# \3\n# \4'
-- Ivo van Geel - 21 Sep 2021