On this page
ansible.builtin.constructed – Uses Jinja2 to construct vars and groups based on existing inventory.
Note
This module is part of ansible-base
and included in all Ansible installations. In most cases, you can use the short module name constructed even without specifying the collections:
keyword. Despite that, we recommend you use the FQCN for easy linking to the module documentation and to avoid conflicting with other collections that may have the same module name.
New in version 2.4: of ansible.builtin
Synopsis
- Uses a YAML configuration file with a valid YAML or
.config
extension to define var expressions and group conditionals - The Jinja2 conditionals that qualify a host for membership.
- The Jinja2 expressions are calculated and assigned to the variables
- Only variables already available from previous inventories or the fact cache can be used for templating.
- When strict is False, failed expressions will be ignored (assumes vars were missing).
Parameters
Parameter | Choices/Defaults | Configuration | Comments |
---|---|---|---|
compose
dictionary
|
Default:
{}
|
Create vars from jinja2 expressions.
|
|
groups
dictionary
|
Default:
{}
|
Add hosts to group based on Jinja2 conditionals.
|
|
keyed_groups
list / elements=string
|
Default:
[]
|
Add hosts to group based on the values of a variable.
|
|
plugin
string / required
|
|
token that ensures this is a source file for the 'constructed' plugin.
|
|
strict
boolean
|
|
If
yes make invalid entries a fatal error, otherwise skip and continue.
Since it is possible to use facts in the expressions they might not always be available and we ignore those errors by default.
|
Examples
# inventory.config file in YAML format
plugin: constructed
strict: False
compose:
var_sum: var1 + var2
# this variable will only be set if I have a persistent fact cache enabled (and have non expired facts)
# `strict: False` will skip this instead of producing an error if it is missing facts.
server_type: "ansible_hostname | regex_replace ('(.{6})(.{2}).*', '\\2')"
groups:
# simple name matching
webservers: inventory_hostname.startswith('web')
# using ec2 'tags' (assumes aws inventory)
development: "'devel' in (ec2_tags|list)"
# using other host properties populated in inventory
private_only: not (public_dns_name is defined or ip_address is defined)
# complex group membership
multi_group: (group_names | intersect(['alpha', 'beta', 'omega'])) | length >= 2
keyed_groups:
# this creates a group per distro (distro_CentOS, distro_Debian) and assigns the hosts that have matching values to it,
# using the default separator "_"
- prefix: distro
key: ansible_distribution
# the following examples assume the first inventory is from the `aws_ec2` plugin
# this creates a group per ec2 architecture and assign hosts to the matching ones (arch_x86_64, arch_sparc, etc)
- prefix: arch
key: architecture
# this creates a group per ec2 region like "us_west_1"
- prefix: ""
separator: ""
key: placement.region
# this creates a common parent group for all ec2 availability zones
- key: placement.availability_zone
parent_group: all_ec2_zones
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.10/collections/ansible/builtin/constructed_inventory.html