# Foreman inventory (https://github.com/theforeman/foreman_ansible_inventory) # # This script can be used as an Ansible dynamic inventory. # The connection parameters are set up via *foreman.ini* # This is how the script founds the configuration file in # 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 # # If the parameter want_hostcollections is set to true, the # collections each host is in are created as Ansible groups with a # foreman_hostcollection prefix, all lowercase and problematic # parameters removed. So e.g. the Foreman host collection # # Patch Window Thursday # # would turn into the Ansible group: # # foreman_hostcollection_patchwindowthursday # # If the parameter host_filters is set, it will be used as the # "search" parameter for the /api/v2/hosts call. This can be used to # restrict the list of returned host, as shown below. # # 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. # [foreman] url = http://localhost:3000/ user = foreman password = secret ssl_verify = True # Retrieve only hosts from the organization "Web Engineering". # host_filters = organization="Web Engineering" # Retrieve only hosts from the organization "Web Engineering" that are # also in the host collection "Apache Servers". # host_filters = organization="Web Engineering" and host_collection="Apache Servers" [ansible] group_patterns = ["{app}-{tier}-{color}", "{app}-{color}", "{app}", "{tier}"] group_prefix = foreman_ # Whether to fetch facts from Foreman and store them on the host want_facts = True # Whether to create Ansible groups for host collections. Only tested # with Katello (Red Hat Satellite). Disabled by default to not break # the script for stand-alone Foreman. want_hostcollections = False # Whether to interpret global parameters value as JSON (if possible, else # take as is). Only tested with Katello (Red Hat Satellite). # This allows to define lists and dictionaries (and more complicated structures) # variables by entering them as JSON string in Foreman parameters. # Disabled by default as the change would else not be backward compatible. rich_params = False [cache] path = . max_age = 60 # Whether to scan foreman to add recently created hosts in inventory cache scan_new_hosts = True