Foreman dynamic inventory script for ansible
Python
Switch branches/tags
Clone or download
Permalink
Failed to load latest commit information.
tests Python3 (#37) Oct 3, 2016
.gitignore Add nosetest and tox setup Aug 14, 2016
.travis.yml Python3 (#37) Oct 3, 2016
AUTHORS Add copying and authors file Feb 16, 2016
COPYING Add copying and authors file Feb 16, 2016
README.md
foreman.ini Make cache file names configurable May 4, 2017
foreman_ansible_inventory.py Make cache file names configurable May 4, 2017
requirements.txt Run flake8 to verify style Sep 28, 2016
setup.cfg Add nosetest and tox setup Aug 14, 2016
setup.py Bump version to 0.0.4 Sep 29, 2016
tox.ini Add nosetest and tox setup Aug 14, 2016

README.md

foreman_ansible_inventory

WARNING: This inventory is available by default with Ansible since version 2.2. Please submit any enhancements directly upstream to https://github.com/ansible/ansible/blob/devel/contrib/inventory/foreman.py

Build Status PyPI version

This script can be used as an Ansible dynamic inventory1. The connection parameters are set up via a configuration file foreman.ini. foreman.ini is found using the following order of discovery.

* `/etc/ansible/foreman.ini`
* Current directory of your inventory script.
* `FOREMAN_INI_PATH` environment variable.

Variables and Parameters

The data returned from Foreman for each host is stored in a foreman hash so they're available as host_vars along with the parameters of the host and it's hostgroups:

 "foo.example.com": {
    "foreman": {
      "architecture_id": 1,
      "architecture_name": "x86_64",
      "build": false,
      "build_status": 0,
      "build_status_label": "Installed",
      "capabilities": [
        "build",
        "image"
      ],
      "compute_profile_id": 4,
      "hostgroup_name": "webtier/myapp",
      "id": 70,
      "image_name": "debian8.1",
      ...
      "uuid": "50197c10-5ebb-b5cf-b384-a1e203e19e77"
    },
    "foreman_params": {
      "testparam1": "foobar",
      "testparam2": "small",
      ...
    }

and could therefore be used in Ansible like:

- debug: msg="From Foreman host {{ foreman['uuid'] }}"

Which yields

TASK [test_foreman : debug] ****************************************************
ok: [foo.example.com] => {
"msg": "From Foreman host 50190bd1-052a-a34a-3c9c-df37a39550bf"
}

Automatic Ansible groups

The inventory will provide a set of groups, by default prefixed by 'foreman_'. If you want to customize this prefix, change the group_prefix option in /etc/ansible/foreman.ini. The rest of this guide will assume the default prefix of 'foreman'

The hostgroup, location, organization, content view, and lifecycle environment of each host are created as Ansible groups with a foreman_ prefix, all lowercase and problematic parameters removed. So e.g. the foreman hostgroup

myapp / webtier / datacenter1

would turn into the Ansible group:

foreman_hostgroup_myapp_webtier_datacenter1

Furthermore Ansible groups can be created on the fly using the group_patterns variable in foreman.ini so that you can build up hierarchies using parameters on the hostgroup and host variables.

Lets assume you have a host that is built using this nested hostgroup:

myapp / webtier / datacenter1

and each of the hostgroups defines a parameters respectively:

myapp: app_param = myapp
webtier: tier_param = webtier
datacenter1: dc_param = datacenter1

The host is also in a subnet called "mysubnet" and provisioned via an image then group_patterns like:

[ansible]
group_patterns = ["{app_param}-{tier_param}-{dc_param}",
                  "{app_param}-{tier_param}",
                  "{app_param}",
                  "{subnet_name}-{provision_method}"]

would put the host into the additional Ansible groups:

- myapp-webtier-datacenter1
- myapp-webtier
- myapp
- mysubnet-image

by recursively resolving the hostgroups, getting the parameter keys and values and doing a Python string.format() like replacement on it.