amazon.aws.aws_ec2 inventory – EC2 inventory source
Note
This inventory plugin is part of the amazon.aws collection (version 11.3.0).
You might already have this collection installed if you are using the ansible package. It is not included in ansible-core. To check whether it is installed, run ansible-galaxy collection list.
To install it, use: ansible-galaxy collection install amazon.aws. You need further requirements to be able to use this inventory plugin, see Requirements for details.
To use it in a playbook, specify: amazon.aws.aws_ec2.
Synopsis
- Get inventory hosts from Amazon Web Services EC2.
- The inventory file is a YAML configuration file and must end with
aws_ec2.{yml|yaml}. For example -my_inventory.aws_ec2.yml.
Requirements
The below requirements are needed on the local controller node that executes this inventory.
- python >= 3.6
- boto3 >= 1.35.0
- botocore >= 1.35.0
Parameters
Parameter | Comments |
|---|---|
access_key aliases: aws_access_key_id, aws_access_key string | AWS access key ID. See the AWS documentation for more information about access tokens https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys. The aws_access_key and profile options are mutually exclusive. The aws_access_key_id alias was added in release 5.1.0 for consistency with the AWS botocore SDK. Configuration:
|
allow_duplicated_hosts boolean added in amazon.aws 5.0.0 | By default, the first name that matches an entry of the Turn this flag on if you don’t mind having duplicated entries in the inventory and you want to get all the hostnames that match. Choices:
|
assume_role_arn aliases: iam_role_arn string | The ARN of the IAM role to assume to perform the lookup. You should still provide AWS credentials with enough privilege to perform the AssumeRole action. |
cache boolean | Toggle to enable/disable the caching of the inventory’s source data, requires a cache plugin setup to work. Choices:
Configuration:
|
cache_connection string | Cache connection data or path, read cache plugin documentation for specifics. Configuration:
|
cache_plugin string | Cache plugin to use for the inventory’s source data. Default: Configuration:
|
cache_prefix string | Prefix to use for cache plugin files/tables. Default: Configuration:
|
cache_timeout integer | Cache duration in seconds. Default: Configuration:
|
compose dictionary | Create vars from jinja2 expressions. Default: |
endpoint_url aliases: aws_endpoint_url string | URL to connect to instead of the default AWS endpoints. While this can be used to connection to other AWS-compatible services the amazon.aws and community.aws collections are only tested against AWS. Configuration:
|
exclude_filters list / elements=dictionary added in amazon.aws 1.5.0 | A list of filters. Any instances matching one of the filters are excluded from the result. The filters from Available filters are listed here http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html#options. Every entry in this list triggers a search query. As such, from a performance point of view, it’s better to keep the list as short as possible. Default: |
filters dictionary | A dictionary of filter value pairs. Available filters are listed here http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html#options. Default: |
groups dictionary | Add hosts to group based on Jinja2 conditionals. Default: |
hostnames list / elements=any | A list in order of precedence for hostname variables. The elements of the list can be a dict with the keys mentioned below or a string. Can be one of the options specified in http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html#options. If value provided does not exist in the above options, it will be used as a literal string. To use tags as hostnames use the syntax tag:Name=Value to use the hostname Name_Value, or tag:Name to use the value of the Name tag. Jinja2 filters can be added to the hostnames string. Added in version 9.2.0. Default: |
|
name string / required |
Name of the host. |
|
prefix string |
Prefix to prepend to If Default: |
|
separator string |
Value to separate Default: |
hostvars_prefix string added in amazon.aws 3.1.0 | The prefix for host variables names coming from AWS. |
hostvars_suffix string added in amazon.aws 3.1.0 | The suffix for host variables names coming from AWS. |
include_filters list / elements=dictionary added in amazon.aws 1.5.0 | A list of filters. Any instances matching at least one of the filters are included in the result. Available filters are listed here http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html#options. Every entry in this list triggers a search query. As such, from a performance point of view, it’s better to keep the list as short as possible. Default: |
keyed_groups list / elements=dictionary | Add hosts to group based on the values of a variable. Default: |
|
default_value string added in ansible-core 2.12 |
The default value when the host variable’s value is This option is mutually exclusive with |
|
key string |
The key from input dictionary used to generate groups. |
|
parent_group string |
parent group for keyed group. |
|
prefix string |
A keyed group name will start with this prefix. Default: |
|
separator string |
separator used to build the keyed group name. Default: |
|
trailing_separator boolean added in ansible-core 2.12 |
Set this option to This option is mutually exclusive with Choices:
|
leading_separator boolean added in ansible-core 2.11 | Use in conjunction with By default, a keyed group that does not have a prefix or a separator provided will have a name that starts with an underscore. This is because the default prefix is Set this option to If the group name is derived from a mapping the separator is still used to concatenate the items. To not use a separator in the group name at all, set the separator for the keyed group to an empty string instead. Choices:
|
profile aliases: aws_profile string | A named AWS profile to use for authentication. See the AWS documentation for more information about named profiles https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html. The profile option is mutually exclusive with the aws_access_key, aws_secret_key and session_token options. Configuration:
|
region aliases: aws_region string | The AWS region to use. See the Amazon AWS documentation for more information http://docs.aws.amazon.com/general/latest/gr/rande.html#ec2_region. Configuration:
|
regions list / elements=string | A list of regions in which to describe EC2 instances. If empty (the default) default this will include all regions, except possibly restricted ones like Default: |
route53_enabled boolean added in amazon.aws 10.1.0 | Whether or not to use the Route53 DNS as host name. When set to Choices:
|
route53_excluded_zones list / elements=string added in amazon.aws 10.1.0 | A list of Route53 zones to exclude. Default: |
route53_hostnames list / elements=string added in amazon.aws 10.1.0 | Specifies the Route53 DNS name suffix to consider. Consider only Route53 zone with name ending with the value specified here. Default: |
secret_key aliases: aws_secret_access_key, aws_secret_key string | AWS secret access key. See the AWS documentation for more information about access tokens https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys. The secret_key and profile options are mutually exclusive. The aws_secret_access_key alias was added in release 5.1.0 for consistency with the AWS botocore SDK. Configuration:
|
session_token aliases: aws_session_token string | AWS STS session token for use with temporary credentials. See the AWS documentation for more information about access tokens https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys. The session_token and profile options are mutually exclusive. Configuration:
|
strict boolean | If Since it is possible to use facts in the expressions they might not always be available and we ignore those errors by default. Choices:
|
strict_permissions boolean | By default if a 403 (Forbidden) error code is encountered this plugin will fail. You can set this option to False in the inventory config file which will allow 403 errors to be gracefully skipped. Choices:
|
use_contrib_script_compatible_ec2_tag_keys boolean added in amazon.aws 1.5.0 | Expose the host tags with The use of this feature is deprecated and will be removed in a release after 2026-12-01. Use the Choices:
|
use_contrib_script_compatible_sanitization boolean | By default this plugin is using a general group name sanitization to create safe and usable group names for use in Ansible. This option allows you to override that, in efforts to allow migration from the old For this to work you should also turn off the TRANSFORM_INVALID_GROUP_CHARS setting, otherwise the core engine will just use the standard sanitization on top. This is not the default as such names break certain functionality as not all characters are valid Python identifiers which group names end up being used as. The use of this feature is deprecated and will be removed in a release after 2026-12-01. Use Ansible’s default group name sanitization instead. Choices:
|
use_extra_vars boolean added in ansible-core 2.11 | Merge extra vars into the available variables for composition (highest precedence). Choices:
Configuration:
|
use_ssm_inventory boolean added in amazon.aws 6.0.0 | Enables fetching additional EC2 instance information from the AWS Systems Manager (SSM) inventory service into hostvars. By leveraging the SSM inventory data, the Choices:
|
Note
Configuration entries listed above for each entry type (Ansible variable, environment variable, and so on) have a low to high priority order. For example, a variable that is lower in the list will override a variable that is higher up. The entry types are also ordered by precedence from low to high priority order. For example, an ansible.cfg entry (further up in the list) is overwritten by an Ansible variable (further down in the list).
Notes
Note
- If no credentials are provided and the control node has an associated IAM instance profile then the role will be used for authentication.
- The
tagshost variable is deprecated and will be removed in a release after 2026-12-01. Useec2_tagsinstead to avoid conflicts with Ansible reserved variable names. - The
ec2_tagshost variable was added in version 11.2.0. - The
use_contrib_script_compatible_ec2_tag_keysoption is deprecated and will be removed in a release after 2026-12-01. Use theec2_tagsstructure instead (e.g. useec2_tags.TAGNAMErather thanec2_tag_TAGNAME). - The
use_contrib_script_compatible_sanitizationoption is deprecated and will be removed in a release after 2026-12-01. Use Ansible’s default group name sanitization instead. - Inventories are not finalized at this stage, so the auto populated
allandungroupedgroups will only reflect what previous inventory sources explicitly added to them. - Runtime ‘magic variables’ are not available during inventory construction. For example,
groupsandhostvarsdo not exist yet. - Caution: For modules, environment variables and configuration files are read from the Ansible ‘host’ context and not the ‘controller’ context. As such, files may need to be explicitly copied to the ‘host’. For lookup and connection plugins, environment variables and configuration files are read from the Ansible ‘controller’ context and not the ‘host’ context.
- The AWS SDK (boto3) that Ansible uses may also read defaults for credentials and other settings, such as the region, from its configuration files in the Ansible ‘host’ context (typically
~/.aws/credentials). See https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html for more information.
Examples
# Minimal example using environment vars or instance role credentials
# Fetch all hosts in us-east-1, the hostname is the public DNS if it exists, otherwise the private IP address
plugin: amazon.aws.aws_ec2
regions:
- us-east-1
---
# Example using filters, ignoring permission errors, and specifying the hostname precedence
plugin: amazon.aws.aws_ec2
# The values for profile, access key, secret key and token can be hardcoded like:
profile: aws_profile
# or you could use Jinja as:
# profile: "{{ lookup('env', 'AWS_PROFILE') | default('aws_profile', true) }}"
# Populate inventory with instances in these regions
regions:
- us-east-1
- us-east-2
filters:
## All instances with their `Environment` tag set to `dev`
# tag:Environment: dev
# All dev and QA hosts
tag:Environment:
- dev
- qa
instance.group-id: sg-xxxxxxxx
# Ignores 403 errors rather than failing
strict_permissions: false
# Note: I(hostnames) sets the inventory_hostname. To modify ansible_host without modifying
# inventory_hostname use compose (see example below).
hostnames:
- tag:Name=Tag1,Name=Tag2 # Return specific hosts only
- tag:CustomDNSName
- dns-name
- name: 'tag:Name=Tag1,Name=Tag2'
- name: 'private-ip-address'
separator: '_'
prefix: 'tag:Name'
- name: 'test_literal' # Using literal values for hostname
separator: '-' # Hostname will be aws-test_literal
prefix: 'aws'
# Returns all the hostnames for a given instance
allow_duplicated_hosts: false
---
# Example using constructed features to create groups and set ansible_host
plugin: amazon.aws.aws_ec2
regions:
- us-east-1
- us-west-1
# keyed_groups may be used to create custom groups
strict: false
keyed_groups:
# Add e.g. x86_64 hosts to an arch_x86_64 group
- prefix: arch
key: 'architecture'
# Add hosts to tag_Name_Value groups for each Name/Value tag pair
- prefix: tag
key: ec2_tags
# Add hosts to e.g. instance_type_z3_tiny
- prefix: instance_type
key: instance_type
# Create security_groups_sg_abcd1234 group for each SG
- key: 'security_groups|json_query("[].group_id")'
prefix: 'security_groups'
# Create a group for each value of the Application tag
- key: ec2_tags.Application
separator: ''
# Create a group per region e.g. aws_region_us_east_2
- key: placement.region
prefix: aws_region
# Create a group (or groups) based on the value of a custom tag "Role" and add them to a metagroup called "project"
- key: ec2_tags['Role']
prefix: foo
parent_group: "project"
# Set individual variables with compose
compose:
# Use the private IP address to connect to the host
# (note: this does not modify inventory_hostname, which is set via I(hostnames))
ansible_host: private_ip_address
---
# Example using include_filters and exclude_filters to compose the inventory.
plugin: amazon.aws.aws_ec2
regions:
- us-east-1
- us-west-1
include_filters:
- tag:Name:
- 'my_second_tag'
- tag:Name:
- 'my_third_tag'
exclude_filters:
- tag:Name:
- 'my_first_tag'
---
# Example using groups to assign the running hosts to a group based on vpc_id
plugin: amazon.aws.aws_ec2
profile: aws_profile
# Populate inventory with instances in these regions
regions:
- us-east-2
filters:
# All instances with their state as `running`
instance-state-name: running
keyed_groups:
- prefix: tag
key: ec2_tags
compose:
ansible_host: public_dns_name
groups:
libvpc: vpc_id == 'vpc-####'
---
# Define prefix and suffix for host variables coming from AWS.
plugin: amazon.aws.aws_ec2
regions:
- us-east-1
hostvars_prefix: 'aws_'
hostvars_suffix: '_ec2'
---
# Define hostnames variables with jinja2 filters.
plugin: amazon.aws.aws_ec2
regions:
- us-east-1
hostnames:
- "tag:Name | replace('test', 'prod')"
---
# Define inventory with Route53 enabled and filtering specific route53 host names suffix.
plugin: amazon.aws.aws_ec2
regions:
- us-east-1
route53_enabled: true
route53_hostnames:
- .example.com
- .another_example.org
---
# Define inventory with Route53 enabled and excluded zones.
plugin: amazon.aws.aws_ec2
regions:
- us-east-1
route53_enabled: true
route53_excluded_zones:
- ansible.bar.net
- ansible.foo.net
Collection links
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/collections/amazon/aws/aws_ec2_inventory.html