ansible-inventory tips

The ansible-inventory purpose is to show Ansible inventory information, as stated by its --help message.

However, this quite youg CLI has an interesting trick up its sleeve.

Quick reminder, Ansible allows by default 4 kinds of inventories:

  • ini
  • script
  • host_list
  • yaml

Interesting fact number 1: All the inventory types above can be given as input of the ansible-inventory CLI.

Interesting fact number 2: The output of the ansible-inventory CLI is a valid json inventory.

Interesting fact number 3: ansible-inventory can output inventories into the yaml format.

You can therefore use ansible-inventory to chain, merge, or convert ansible inventories!

Here is an example of how it can be used:

The first type, ini inventories, is the what you probably have seen in your first usage of ansible, and may look like this:

[glance_api]
localhost ansible_connection=local

[glance_registry]
localhost2 ansble_connection=local

[glance_all:children]
glance_api
glance_registry

This ini file can therefore be converted into a yaml file:

$ ansible-inventory -i inventory.ini -y --list > inventory.yaml

The resulting yaml file would be:

all:
  children:
    glance_all:
      children:
        glance_api:
          hosts:
            localhost:
              ansible_connection: local
        glance_registry:
          hosts:
            localhost2:
              ansble_connection: local
    ungrouped: {}

If the -y was omitted, the output would be a json inventory:

$ ansible-inventory -i inventory.ini --list > inventory.json

Looking like:

{
    "_meta": {
        "hostvars": {
            "localhost": {
                "ansible_connection": "local"
            },
            "localhost2": {
                "ansble_connection": "local"
            }
        }
    },
    "all": {
        "children": [
            "glance_all",
            "ungrouped"
        ]
    },
    "glance_all": {
        "children": [
            "glance_api",
            "glance_registry"
        ]
    },
    "glance_api": {
        "hosts": [
            "localhost"
        ]
    },
    "glance_registry": {
        "hosts": [
            "localhost2"
        ]
    },
    "ungrouped": {}
}

As you might have noticed, there is no json inventory type. The json is the standard interface used for the \“script\” inventory type.

A valid inventory \“script\” (also named dynamic inventory), is an executable which, when called with --list, outputs a json whose content is following ansible conventions, like the json above.

As such, the json above can be converted into a dynamic inventory script, by making it executable and showing its content.

Create a file yourscript.sh with the following content:

#!/bin/bash
cat <<EOANSIBLESCRIPT
<the content of the yaml above>
EOANSIBLESCRIPT

and then chmod +x yourscript.sh.

That file can now be converted into yaml with:

$ ansible-inventory -i ./yourscript.sh -y --list > inventory.yaml

Hope it helps you understand what can be done with the ansible-inventory CLI!