From 18324fb412267bfb113731d92c4bd92f8ed40ea4 Mon Sep 17 00:00:00 2001 From: James Slagle Date: Fri, 27 Apr 2018 10:39:58 -0400 Subject: [PATCH] Fix dynamic inventory Commit If834e5e60f79a7418cbc1441d2aaf85507ac7bd2 broke support for the dynamic inventory since Ansible requires different formats for the hosts value in groups. This patch corrects the issue and restores the ability to use tripleo-ansible-inventory as either a static or dynamic inventory source. Change-Id: I035bb878508ceab06279cbaf07969aafeb66b9e5 Story: 2001929 (cherry picked from commit 480aeadc1cc23664e4c58edbecfccb5bb1c2ba61) --- tripleo_common/inventory.py | 24 ++++++-- tripleo_common/tests/test_inventory.py | 77 ++++---------------------- 2 files changed, 30 insertions(+), 71 deletions(-) diff --git a/tripleo_common/inventory.py b/tripleo_common/inventory.py index ac4b22ee1..4520da04a 100644 --- a/tripleo_common/inventory.py +++ b/tripleo_common/inventory.py @@ -106,6 +106,7 @@ class TripleoInventory(object): self.ansible_ssh_user = ansible_ssh_user self.plan_name = plan_name self.stack_outputs = StackOutputs(self.plan_name, self.hclient) + self.hostvars = {} @staticmethod def get_roles_by_service(enabled_services): @@ -152,10 +153,9 @@ class TripleoInventory(object): def list(self): ret = OrderedDict({ 'Undercloud': { - 'hosts': { - 'undercloud': { - 'ansible_host': 'localhost'}}, + 'hosts': self._hosts(['undercloud']), 'vars': { + 'ansible_host': 'localhost', 'ansible_connection': 'local', # see https://github.com/ansible/ansible/issues/41808 'ansible_remote_tmp': '/tmp/ansible-${USER}', @@ -229,16 +229,26 @@ class TripleoInventory(object): networks.update(hosts[name]['enabled_networks']) children.append(role) + + if self.hosts_format_dict: + hosts_format = hosts + else: + hosts_format = [h for h in hosts.keys()] + hosts_format.sort() + ret[role] = { - 'hosts': hosts, + 'hosts': hosts_format, 'vars': { 'ansible_ssh_user': self.ansible_ssh_user, 'bootstrap_server_id': role_node_id_map.get( 'bootstrap_server_id'), 'role_name': role, } + } + self.hostvars.update(hosts) + if children: vip_map = self.stack_outputs.get('VipMap', {}) vips = {(vip_name + "_vip"): vip @@ -263,8 +273,10 @@ class TripleoInventory(object): } } - # Prevent Ansible from repeatedly calling us to get empty host details - ret['_meta'] = {'hostvars': {}} + if not self.hosts_format_dict: + # Prevent Ansible from repeatedly calling us to get empty host + # details + ret['_meta'] = {'hostvars': self.hostvars} return ret diff --git a/tripleo_common/tests/test_inventory.py b/tripleo_common/tests/test_inventory.py index 4a4b773de..1cd21b8a7 100644 --- a/tripleo_common/tests/test_inventory.py +++ b/tripleo_common/tests/test_inventory.py @@ -189,42 +189,17 @@ class TestInventory(base.TestCase): ansible_ssh_user = 'heat-admin' expected = { 'Compute': { - 'hosts': { - 'cp-0': { - 'ansible_host': 'y.y.y.1', - 'ctlplane_ip': 'y.y.y.1', - 'deploy_server_id': 'd', - 'enabled_networks': ['ctlplane']}}, + 'hosts': ['cp-0'], 'vars': {'ansible_ssh_user': ansible_ssh_user, 'bootstrap_server_id': 'a', 'role_name': 'Compute'}}, 'Controller': { - 'hosts': { - 'c-0': { - 'ansible_host': 'x.x.x.1', - 'ctlplane_ip': 'x.x.x.1', - 'deploy_server_id': 'a', - 'enabled_networks': ['ctlplane']}, - 'c-1': { - 'ansible_host': 'x.x.x.2', - 'ctlplane_ip': 'x.x.x.2', - 'deploy_server_id': 'b', - 'enabled_networks': ['ctlplane']}, - 'c-2': { - 'ansible_host': 'x.x.x.3', - 'ctlplane_ip': 'x.x.x.3', - 'deploy_server_id': 'c', - 'enabled_networks': ['ctlplane']}}, + 'hosts': ['c-0', 'c-1', 'c-2'], 'vars': {'ansible_ssh_user': ansible_ssh_user, 'bootstrap_server_id': 'a', 'role_name': 'Controller'}}, 'CustomRole': { - 'hosts': { - 'cs-0': { - 'ansible_host': 'z.z.z.1', - 'ctlplane_ip': 'z.z.z.1', - 'deploy_server_id': 'e', - 'enabled_networks': ['ctlplane']}}, + 'hosts': ['cs-0'], 'vars': {'ansible_ssh_user': ansible_ssh_user, 'bootstrap_server_id': 'a', 'role_name': 'CustomRole'}}, @@ -235,10 +210,9 @@ class TestInventory(base.TestCase): 'ctlplane_vip': 'x.x.x.4', 'redis_vip': 'x.x.x.6'}}, 'Undercloud': { - 'hosts': { - 'undercloud': { - 'ansible_host': 'localhost'}}, + 'hosts': ['undercloud'], 'vars': {'ansible_connection': 'local', + 'ansible_host': 'localhost', 'ansible_remote_tmp': '/tmp/ansible-${USER}', 'auth_url': 'xyz://keystone.local', 'cacert': 'acacert', @@ -285,42 +259,17 @@ class TestInventory(base.TestCase): expected = { 'Compute': { - 'hosts': { - 'cp-0': { - 'ansible_host': 'y.y.y.1', - 'ctlplane_ip': 'y.y.y.1', - 'deploy_server_id': 'd', - 'enabled_networks': ['ctlplane']}}, + 'hosts': ['cp-0'], 'vars': {'ansible_ssh_user': ansible_ssh_user, 'bootstrap_server_id': 'a', 'role_name': 'Compute'}}, 'Controller': { - 'hosts': { - 'c-0': { - 'ansible_host': 'x.x.x.1', - 'ctlplane_ip': 'x.x.x.1', - 'deploy_server_id': 'a', - 'enabled_networks': ['ctlplane']}, - 'c-1': { - 'ansible_host': 'x.x.x.2', - 'ctlplane_ip': 'x.x.x.2', - 'deploy_server_id': 'b', - 'enabled_networks': ['ctlplane']}, - 'c-2': { - 'ansible_host': 'x.x.x.3', - 'ctlplane_ip': 'x.x.x.3', - 'deploy_server_id': 'c', - 'enabled_networks': ['ctlplane']}}, + 'hosts': ['c-0', 'c-1', 'c-2'], 'vars': {'ansible_ssh_user': ansible_ssh_user, 'bootstrap_server_id': 'a', 'role_name': 'Controller'}}, 'CustomRole': { - 'hosts': { - 'cs-0': { - 'ansible_host': 'z.z.z.1', - 'ctlplane_ip': 'z.z.z.1', - 'deploy_server_id': 'e', - 'enabled_networks': ['ctlplane']}}, + 'hosts': ['cs-0'], 'vars': {'ansible_ssh_user': ansible_ssh_user, 'bootstrap_server_id': 'a', 'role_name': 'CustomRole'}}, @@ -330,10 +279,9 @@ class TestInventory(base.TestCase): 'ctlplane_vip': 'x.x.x.4', 'redis_vip': 'x.x.x.6'}}, 'Undercloud': { - 'hosts': { - 'undercloud': { - 'ansible_host': 'localhost'}}, + 'hosts': ['undercloud'], 'vars': {'ansible_connection': 'local', + 'ansible_host': 'localhost', 'ansible_remote_tmp': '/tmp/ansible-${USER}', 'auth_url': 'xyz://keystone.local', 'cacert': 'acacert', @@ -411,7 +359,6 @@ class TestInventory(base.TestCase): 'vars': {'ansible_ssh_user': ansible_ssh_user, 'bootstrap_server_id': 'a', 'role_name': 'CustomRole'}}, - '_meta': {'hostvars': {}}, 'overcloud': {'children': {'Compute': {}, 'Controller': {}, 'CustomRole': {}}, @@ -429,9 +376,9 @@ class TestInventory(base.TestCase): 'vars': {'ansible_ssh_user': 'heat-admin'}}, 'sh': {'children': {'CustomRole': {}}, 'vars': {'ansible_ssh_user': 'heat-admin'}}, - 'Undercloud': {'hosts': {'undercloud': { - 'ansible_host': 'localhost'}}, + 'Undercloud': {'hosts': {'undercloud': {}}, 'vars': {'ansible_connection': 'local', + 'ansible_host': 'localhost', 'ansible_remote_tmp': '/tmp/ansible-${USER}', 'auth_url': 'xyz://keystone.local',