@ -401,6 +401,8 @@ class Constructable(_BaseInventoryPlugin):
def _add_host_to_keyed_groups ( self , keys , variables , host , strict = False , fetch_hostvars = True ) :
def _add_host_to_keyed_groups ( self , keys , variables , host , strict = False , fetch_hostvars = True ) :
""" helper to create groups for plugins based on variable values and add the corresponding hosts to it """
""" helper to create groups for plugins based on variable values and add the corresponding hosts to it """
should_default_value = ( None , ' ' )
if keys and isinstance ( keys , list ) :
if keys and isinstance ( keys , list ) :
for keyed in keys :
for keyed in keys :
if keyed and isinstance ( keyed , dict ) :
if keyed and isinstance ( keyed , dict ) :
@ -417,7 +419,9 @@ class Constructable(_BaseInventoryPlugin):
trailing_separator = keyed . get ( ' trailing_separator ' )
trailing_separator = keyed . get ( ' trailing_separator ' )
if trailing_separator is not None and default_value_name is not None :
if trailing_separator is not None and default_value_name is not None :
raise AnsibleParserError ( " parameters are mutually exclusive for keyed groups: default_value|trailing_separator " )
raise AnsibleParserError ( " parameters are mutually exclusive for keyed groups: default_value|trailing_separator " )
if key or ( key == ' ' and default_value_name is not None ) :
use_default = key in should_default_value and default_value_name is not None
if key or use_default :
prefix = keyed . get ( ' prefix ' , ' ' )
prefix = keyed . get ( ' prefix ' , ' ' )
sep = keyed . get ( ' separator ' , ' _ ' )
sep = keyed . get ( ' separator ' , ' _ ' )
raw_parent_name = keyed . get ( ' parent_group ' , None )
raw_parent_name = keyed . get ( ' parent_group ' , None )
@ -433,23 +437,21 @@ class Constructable(_BaseInventoryPlugin):
continue
continue
new_raw_group_names = [ ]
new_raw_group_names = [ ]
if isinstance ( key , string_types ) :
if use_default :
# if key is empty, 'default_value' will be used as group name
if key == ' ' and default_value_name is not None :
new_raw_group_names . append ( default_value_name )
new_raw_group_names . append ( default_value_name )
el se:
elif isinstance ( key , string_types ) :
new_raw_group_names . append ( key )
new_raw_group_names . append ( key )
elif isinstance ( key , list ) :
elif isinstance ( key , list ) :
for name in key :
for name in key :
# if list item is empty, 'default_value' will be used as group name
# if list item is empty, 'default_value' will be used as group name
if name == ' ' and default_value_name is not None :
if name in should_default_value and default_value_name is not None :
new_raw_group_names . append ( default_value_name )
new_raw_group_names . append ( default_value_name )
else :
else :
new_raw_group_names . append ( name )
new_raw_group_names . append ( name )
elif isinstance ( key , Mapping ) :
elif isinstance ( key , Mapping ) :
for ( gname , gval ) in key . items ( ) :
for ( gname , gval ) in key . items ( ) :
bare_name = ' %s %s %s ' % ( gname , sep , gval )
bare_name = ' %s %s %s ' % ( gname , sep , gval )
if gval == ' ' :
if gval in should_default_value :
# key's value is empty
# key's value is empty
if default_value_name is not None :
if default_value_name is not None :
bare_name = ' %s %s %s ' % ( gname , sep , default_value_name )
bare_name = ' %s %s %s ' % ( gname , sep , default_value_name )