Skip to main content

Dynamic Ansible Inventory Generator

Project description

Dynamic Ansible Inventory

This is a dynamic inventory script for Ansible that reads the inventory from a directory. A list of hosts is managed by the user. Each host has metadata that is used to gather variables.

The structure of the inventory directory is as follows:

hosts/
  host1.yaml
  host2.yaml
  host3.yaml
generated/
  host1.yaml
  host2.yaml
  host3.yaml
metadata/
  tags/
    tag1.yaml
    tag2.yaml
  platform/
    platform1.yaml
    platform2.yaml
  my_custom_metadata/
    my_custom_metadata1.yaml
    my_custom_metadata2.yaml

The hosts directory contains host files that define the hosts.

The generated directory contains generated host files that are created by the script and used as an inventory.

The metadata directory contains metadata files that can be used to give hosts variables. To use the metadata, the host file must have a metadata key that contains a list of metadata files.

metadata:
  tags:
    - tag1
  platform: platform1
  my_custom_metadata: my_custom_metadata1

Under example/ you can find an example of how to build an inventory.

Jinja2 can be used inside of variables, because it is parsed by Ansible at runtime.

domain_name: example.com
hostname: ap01

ansible_host: "{{ hostname }}.{{ domain_name }}"

dns_servers:
  - 1.1.1.1
  - 8.8.8.8

network_interfaces:
  - name: eth0
    type: ethernet
    state: up
    ip: 192.168.1.100
    netmask: 255.255.255.0
    gateway: 192.168.1.1
    dns: "{{ dns_servers }}"

Usage

Install with pip install -U invgen or uv tool install -U invgen.

Generate Inventory

# set the environment variable INVGEN_SOURCE to the path of the inventory directory
export INVGEN_SOURCE="$PWD/example/"

# generate the host files
invgen generate --verbose

# regenerate on file change
invgen generate --verbose --watch

Ansible

# set the environment variable INVGEN_SOURCE to the path of the inventory directory
export INVGEN_SOURCE="$PWD/example/"

# run playbook with the inventory
ansible-playbook -i $(which invgen-ansible) playbook.yaml

# explore the inventory ansible-inventory -i $(which invgen-ansible) --graph
 [ERROR]: 2024-11-23 19:22:29,537 - INFO - inventory - Generating inventory from /home/fwrage/dev/invgen/example
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
@all:
  |--@ungrouped:
  |--@environment_production:
  |  |--ap01.test.local
  |--@provider_self-hosted:
  |  |--ap01.test.local
  |--@hardware_raspberry-pi-4:
  |  |--ap01.test.local
  |--@os_rhel-9:
  |  |--ap01.test.local
  |--@services_podman-rootless:
  |  |--ap01.test.local
  |--@tags_selinux-deactivated:
  |  |--ap01.test.local

Templates

It is possible to use Jinja2 templates to generate host files.

---
metadata:
    platform: {{ platform }}
    provider: {{ provider }}
    services: {{ services }}

ansible_host: {{ name }}
## Host
invgen new host -t example/templates/host.yaml -d example/hosts --name "ap02.test.local" -o "platform=raspberry-pi-4 provider=self-hosted services=pihole,dnsmasq"

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

invgen-1.1.1.tar.gz (9.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

invgen-1.1.1-py3-none-any.whl (10.6 kB view details)

Uploaded Python 3

File details

Details for the file invgen-1.1.1.tar.gz.

File metadata

  • Download URL: invgen-1.1.1.tar.gz
  • Upload date:
  • Size: 9.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for invgen-1.1.1.tar.gz
Algorithm Hash digest
SHA256 de37814e108d8f9f8fe3e2c4e6ff7feca9ff4feac28692159688cc6359f59c27
MD5 a170de9bd03a6a06741e5c8b238aad36
BLAKE2b-256 2dcdc05e3c8c8c85f5eabb38358b8b229eae54502772f7f8bc32516a30f5469a

See more details on using hashes here.

File details

Details for the file invgen-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: invgen-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 10.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for invgen-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 11f0d9d44cbebe7c3e97b6402c06fc3e8ee4f04eb1765eeeb52d794274620550
MD5 fa74e05c1dbb52bceb6d9db49b36fed4
BLAKE2b-256 680624f34f13e9a98c4ff9bec51bf3657f7c0784a26132db5232b9046682a131

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page