The power of Ansible always surprises me. In this post I will be sharing the way you can use multiple inventory files when running your playbooks and how to organize them.

TL;DR: Inventory can be a folder. Create a folder, add as many inventory files inside this folder and instruct Ansible to use this folder as the inventory (with -i folder_name or in your ansible.cfg file). All inventory files inside the folder will be merged into one (including scripts like ec2.py).

Inventory as a folder

Inside your playbooks folder, create a folder called inventory.

mkdir inventory

Now move your current inventory file (often called hosts) into this folder

mv hosts inventory/

To tell ansible to use the new inventory, there are 2 options:

Using ansible.cfg

Create a file ansible.cfg within the same folder as your playbooks and add the lines:

[defaults] hostfile = inventory

Command line argument

Next time you run your playbook, simply add -i inventory:

ansible-playbook -i inventory my_playbook.yml

And that’s it to start. Now the fun part.

Dynamic and static inventories together

Here’s the trick, add both your static and dynamic inventories to the folder and you can run playbooks targeting both as same time.

Example: Group EC2 hosts by country

EC2 hosts from both us-east-1 and us-west-1 need to belong to a USA group, and both eu-west-1 and eu-central-1 to belong to Europe group.

Add your ec2.py to the inventory folder and make sure it’s executable.

cp /usr/local/lib/python2.7/dist-packages/ansible/module_utils/ec2.py inventory/ chmod +x inventory/ec2.py

Check ansible documentation for help to setup ec2.py

Create new file countries and add to inventory folder.

touch inventory/countries

countries file contents:

# Declaring country groups [USA] [Europe] # Attaching EC2 groups as children [USA:children] us-east-1 us-west-1 [Europe:children] eu-west-1 eu-central-1

Now when you run:

ansible-playbook -i inventory --limit "Europe" my_playbook.yml

Will run my_playbook.yml only to your european servers.