Test plugins

Test plugins evaluate template expressions and return True or False. With test plugins you can create conditionals to implement the logic of your tasks, blocks, plays, playbooks, and roles. Ansible uses the standard tests shipped as part of Jinja and adds some specialized test plugins. You can create custom Ansible test plugins.

Enabling test plugins

You can add a custom test plugin by dropping it into a test_plugins directory adjacent to your play, inside a role, or by putting it in one of the test plugin directory sources configured in ansible.cfg.

Using test plugins

You can use tests anywhere you can use templating in Ansible: in a play, in a variables file, or in a Jinja2 template for the template module. For more information on using test plugins, see Tests.

Tests always return True or False, they are always a boolean, if you need a different return type, you should be looking at filters.

You can recognize test plugins by the use of the is statement in a template, they can also be used as part of the select family of filters.

vars:
  is_ready: '{{ task_result is success }}'

tasks:
- name: conditionals are always in 'template' context
  action: dostuff
  when: task_result is failed

Tests will always have an _input and this is normally what is on the left side of is. Tests can also take additional parameters as you would to most programming functions. These parameters can be either positional (passed in order) or named (passed as key=value pairs). When passing both types, positional arguments should go first.

tasks:
- name: pass a positional parameter to match test
  action: dostuff
  when: myurl is match("https://example.com/users/.*/resources")

- name: pass named parameter to truthy test
  action: dostuff
  when: myvariable is truthy(convert_bool=True)

- name: pass both types to 'version' test
  action: dostuff
  when: sample_semver_var is version('2.0.0-rc.1+build.123', 'lt', version_type='semver')

Using test plugins with lists

As mentioned above, one way to use tests is with the select family of filters (select, reject, selectattr, rejectattr).

# give me only defined variables from a list of variables, using 'defined' test
good_vars: "{{ all_vars|select('defined') }}"

# this uses the 'equalto' test to filter out non 'fixed' type of addresses from a list
only_fixed_addresses:  "{{ all_addresses|selectattr('type', 'equalto', 'fixed') }}"

# this does the opposite of the previous one
only_fixed_addresses:  "{{ all_addresses|rejectattr('type', 'equalto', 'fixed') }}"

Plugin list

You can use ansible-doc -t test -l to see the list of available plugins. Use ansible-doc -t test <plugin name> to see plugin-specific documentation and examples.

See also

Ansible playbooks

An introduction to playbooks

Tests

Using tests

Conditionals

Using conditional statements

Filter plugins

Filter plugins

Tests

Using tests

Lookup plugins

Lookup plugins

Communication

Got questions? Need help? Want to share your ideas? Visit the Ansible communication guide