Skip to main content

Use Infrahub for Ansible dynamic inventory

Overview

The Inventory Plugin component of the OpsMill Infrahub Ansible Collection is used to dynamically generate the inventory from Infrahub to be used in Ansible playbooks.

Configuration

In your ansible.cfg file, specify the inventory source as the infrahub_inv.yml file:

ansible.cfg
[defaults]
inventory = ./infrahub_inv.yml

Infrahub inventory plugin configuration

Configure the Infrahub inventory plugin in the infrahub_inv.yml file to define the returned hosts and groupings. Here's a minimal example:

  • Retrieving attributes for the InfraDevice Node Kind in a specific branch
  • Forcing the inclusion of specific attributes for InfraDevice
  • Creating composed variables for hostname
infrahub_inv.yml
plugin: opsmill.infrahub.inventory
api_endpoint: "http://localhost:8000"

nodes:
InfraDevice:
include:
- name
- primary_address.address
- platform.ansible_network_os
- site.parent.name
- site.name
- role
- tags

compose:
hostname: name

Advanced configuration example

This example demonstrates a more comprehensive configuration, including:

  • Retrieving attributes for the InfraDevice Node Kind in a specific branch
  • Forcing the inclusion of specific attributes for InfraDevice
  • Creating composed variables for hostname and platform
  • Creating groups based on the site name and country name
infrahub_inv.yml (Advanced)
strict: true

branch: "branch1"

nodes:
InfraDevice:
include:
- name
- primary_address.address
- platform.ansible_network_os
- site.parent.name
- site.name
- role
- tags

compose:
hostname: name
platform: platform.ansible_network_os
ansible_host: primary_address.address | ansible.utils.ipaddr('address')

keyed_groups:
- prefix: site
key: site.name | lower
- prefix: country
key: site.parent.name | lower

Viewing the inventory graph

To visualize the inventory retrieved from Infrahub, run the ansible-inventory command with the -i flag, specifying the infrahub_inv.yml file as the source, followed by --graph:

ansible-inventory -i infrahub_inv.yml --graph
Sample Output
@all:
|--@ungrouped:
|--@site_atl1:
| |--atl1-edge1
| |--atl1-edge2
| |--atl1-core1
| |--atl1-core2
| |--atl1-leaf1
| |--atl1-leaf2
|--@country_united_states_of_america:
| |--atl1-edge1
| |--atl1-edge2
| |--atl1-core1
| |--atl1-core2
| |--atl1-leaf1
| |--atl1-leaf2
| |--ord1-edge1
| |--ord1-edge2
| |--ord1-core1
| |--ord1-core2
| |--ord1-leaf1
| |--ord1-leaf2
| |--jfk1-edge1
| |--jfk1-edge2
| |--jfk1-core1
| |--jfk1-core2
| |--jfk1-leaf1
|--@site_ord1:
| |--ord1-edge1
| |--ord1-edge2
| |--ord1-core1
| |--ord1-core2
| |--ord1-leaf1
| |--ord1-leaf2
|--@site_jfk1:
| |--jfk1-edge1
| |--jfk1-edge2
| |--jfk1-core1
| |--jfk1-core2
| |--jfk1-leaf1

Viewing the inventory list

To view the inventory list, run:

ansible-inventory -i infrahub_inv.yml --list
Sample Output
{
"_meta": {
"hostvars": {
"atl1-core1": {
"id": "181fd07a-e43c-f377-35bf-c513b592513f",
"site": {
"id": "181fd075-b6d7-bd90-35b7-c51c888ef203",
"name": "atl1"
}
},
"atl1-core2": {
"id": "181fd07b-2615-5c76-35b3-c519087e0eb5",
"site": {
"id": "181fd075-b6d7-bd90-35b7-c51c888ef203",
"name": "atl1"
}
},
...
}
},
"all": {
"children": [
"ungrouped",
"site_atl1",
"site_ord1",
"site_jfk1",
"site_den1",
"site_dfw1"
]
},
"site_atl1": {
"hosts": [
"atl1-edge1",
"atl1-edge2",
"atl1-core1",
"atl1-core2",
"atl1-leaf1",
"atl1-leaf2"
]
},
...
}

Running playbooks with dynamic inventory

To run a playbook that uses the dynamic inventory, specify the inventory file when executing the playbook:

ansible-playbook -i infrahub_inv.yml your_playbook.yml

Replace infrahub_inv.yml with the path to your dynamic inventory file, and your_playbook.yml with the name of your playbook file.

Targeting groups in your playbook

To target groups from the inventory in your playbook, reference the groups as normal. For example, to target the site_atl1 group:

playbook.yml
---
- name: Playbook using Infrahub Dynamic Inventory
hosts: site_atl1

tasks:
- name: Gather facts
setup:

- name: Print host facts
debug:
var: ansible_facts