From 9d28973b5e8bc8844395206b39c2ff09d1de5e0f Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Wed, 1 Nov 2017 17:48:50 -0400 Subject: [PATCH] ini plugin should recursively instantiate pending solves inconsistent behaviour on ini host format depending on definition order fixes #32196 --- lib/ansible/plugins/inventory/ini.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/ansible/plugins/inventory/ini.py b/lib/ansible/plugins/inventory/ini.py index 578f899b86..a3374a8408 100644 --- a/lib/ansible/plugins/inventory/ini.py +++ b/lib/ansible/plugins/inventory/ini.py @@ -193,9 +193,7 @@ class InventoryModule(BaseFileInventoryPlugin): if groupname in pending_declarations and state != 'vars': if pending_declarations[groupname]['state'] == 'children': - for parent in pending_declarations[groupname]['parents']: - self.inventory.add_child(parent, groupname) - del pending_declarations[groupname] + self._add_pending_children(groupname, pending_declarations) continue elif line.startswith('[') and line.endswith(']'): @@ -248,6 +246,13 @@ class InventoryModule(BaseFileInventoryPlugin): elif decl['state'] == 'children': raise AnsibleError("%s:%d: Section [%s:children] includes undefined group: %s" % (path, decl['line'], decl['parents'].pop(), decl['name'])) + def _add_pending_children(self, group, pending): + for parent in pending[group]['parents']: + self.inventory.add_child(parent, group) + if parent in pending and pending[parent]['state'] == 'children': + self._add_pending_children(parent, pending) + del pending[group] + def _parse_group_name(self, line): ''' Takes a single line and tries to parse it as a group name. Returns the