Inventory plugins are bits of code that will create inventory data for an Ansible execution. In many environments, the simple ini file-style inventory source and variable structure is not sufficient to represent the actual infrastructure being managed. In such cases, a dynamic inventory source is desired, one that will discover the inventory and data at runtime at every execution of Ansible. A number of these dynamic sources ship with Ansible, primarily to operate Ansible with the infrastructure built into one cloud computing platform or another. A short, incomplete list of dynamic inventory plugins that ship with Ansible (there are now over 20) includes the following:
- apache-libcloud
- cobbler
- console_io
- digital_ocean
- docker
- ec2
- gce
- libvirt_lxc
- linode
- openshift
- openstack
- rax
- vagrant
- vmware
- windows_azure
An inventory plugin is essentially an executable script. Ansible calls the script with set arguments (--list or --host <hostname>) and expects JSON formatted output on STDOUT. When the --list argument is provided, Ansible expects a list of all the groups to be managed. Each group can list host membership, child group membership, and group variable data. When the script is called with the --host <hostname> argument, Ansible expects host-specific data to be returned (or an empty JSON dictionary).
Using a dynamic inventory source is easy. A source can be used directly by referring to it with the -i (--inventory-file) option to ansible and ansible-playbook, by putting the plugin file inside the directory referred to by either the inventory path in ansible.cfg.
Before creating an inventory plugin, we must understand the expected format for when --list or --host is used with our script.