From d2928fa1b741aa1e11bfad64cb702fe45ab61d8e Mon Sep 17 00:00:00 2001 From: Guido Günther Date: Mon, 29 Feb 2016 18:38:47 +0100 Subject: Expand host variables as well Instead of only allowing groups created from host group params also allow to use host variables like subnet_name. Closes: #5 --- README.md | 11 +++++++---- foreman_ansible_inventory.py | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) mode change 100755 => 100644 foreman_ansible_inventory.py diff --git a/README.md b/README.md index 13701f8..780d48d 100644 --- a/README.md +++ b/README.md @@ -60,9 +60,9 @@ would turn into the ansible group: foreman_hostgroup_myapp_webtier_datacenter1 -Furthermore groups can be created on the fly using the +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. +hierarchies using parameters on the hostgroup and host variables. Lets assume you have a host that is built using this nested hostgroup: @@ -72,20 +72,23 @@ and each of the hostgroups defines a parameters respectively: myapp: app_param = myapp webtier: tier_param = webtier - datacenter1: dc_param = datacenter1 + 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}"] + "{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 diff --git a/foreman_ansible_inventory.py b/foreman_ansible_inventory.py old mode 100755 new mode 100644 index bdf1107..d21456a --- a/foreman_ansible_inventory.py +++ b/foreman_ansible_inventory.py @@ -20,6 +20,7 @@ import argparse import ConfigParser +import copy import os import re from time import time @@ -196,12 +197,21 @@ class ForemanInventory(object): safe_key = self.to_safe('foreman_%s_%s' % (group, val.lower())) self.push(self.inventory, safe_key, dns_name) - # Ansible groups by parameters in host groups based - # on group_patterns in config params = self._resolve_params(host) + + # Ansible groups by parameters in host groups and Foreman host + # attributes. + groupby = copy.copy(params) + for k, v in host.items(): + if isinstance(v, basestring): + groupby[k] = self.to_safe(v) + elif isinstance(v, int): + groupby[k] = v + + # The name of the ansible groups is given by group_patterns: for pattern in self.group_patterns: try: - key = pattern.format(**params) + key = pattern.format(**groupby) self.push(self.inventory, key, dns_name) except KeyError: pass # Host not part of this group -- cgit v1.2.3