ansible-config: ensure we get templated default (#82974) (#83009)

AKA all defaults rendered

(cherry picked from commit 46137127a2)
pull/83040/head
Brian Coca 8 months ago committed by GitHub
parent 09f4549859
commit 1b860558e3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,2 @@
bugfixes:
- ansible-config will now properly template defaults before dumping them.

@ -270,7 +270,7 @@ class ConfigCLI(CLI):
if not settings[setting].get('description'): if not settings[setting].get('description'):
continue continue
default = settings[setting].get('default', '') default = self.config.template_default(settings[setting].get('default', ''), get_constants())
if subkey == 'env': if subkey == 'env':
stype = settings[setting].get('type', '') stype = settings[setting].get('type', '')
if stype == 'boolean': if stype == 'boolean':
@ -352,7 +352,7 @@ class ConfigCLI(CLI):
if entry['key'] not in seen[entry['section']]: if entry['key'] not in seen[entry['section']]:
seen[entry['section']].append(entry['key']) seen[entry['section']].append(entry['key'])
default = opt.get('default', '') default = self.config.template_default(opt.get('default', ''), get_constants())
if opt.get('type', '') == 'list' and not isinstance(default, string_types): if opt.get('type', '') == 'list' and not isinstance(default, string_types):
# python lists are not valid ini ones # python lists are not valid ini ones
default = ', '.join(default) default = ', '.join(default)
@ -414,14 +414,16 @@ class ConfigCLI(CLI):
if context.CLIARGS['format'] == 'display': if context.CLIARGS['format'] == 'display':
if isinstance(config[setting], Setting): if isinstance(config[setting], Setting):
# proceed normally # proceed normally
value = config[setting].value
if config[setting].origin == 'default': if config[setting].origin == 'default':
color = 'green' color = 'green'
value = self.config.template_default(value, get_constants())
elif config[setting].origin == 'REQUIRED': elif config[setting].origin == 'REQUIRED':
# should include '_terms', '_input', etc # should include '_terms', '_input', etc
color = 'red' color = 'red'
else: else:
color = 'yellow' color = 'yellow'
msg = "%s(%s) = %s" % (setting, config[setting].origin, config[setting].value) msg = "%s(%s) = %s" % (setting, config[setting].origin, value)
else: else:
color = 'green' color = 'green'
msg = "%s(%s) = %s" % (setting, 'default', config[setting].get('default')) msg = "%s(%s) = %s" % (setting, 'default', config[setting].get('default'))

@ -305,6 +305,17 @@ class ConfigManager(object):
# ensure we always have config def entry # ensure we always have config def entry
self._base_defs['CONFIG_FILE'] = {'default': None, 'type': 'path'} self._base_defs['CONFIG_FILE'] = {'default': None, 'type': 'path'}
def template_default(self, value, variables):
if isinstance(value, string_types) and (value.startswith('{{') and value.endswith('}}')) and variables is not None:
# template default values if possible
# NOTE: cannot use is_template due to circular dep
try:
t = NativeEnvironment().from_string(value)
value = t.render(variables)
except Exception:
pass # not templatable
return value
def _read_config_yaml_file(self, yml_file): def _read_config_yaml_file(self, yml_file):
# TODO: handle relative paths as relative to the directory containing the current playbook instead of CWD # TODO: handle relative paths as relative to the directory containing the current playbook instead of CWD
# Currently this is only used with absolute paths to the `ansible/config` directory # Currently this is only used with absolute paths to the `ansible/config` directory
@ -548,17 +559,7 @@ class ConfigManager(object):
to_native(_get_entry(plugin_type, plugin_name, config))) to_native(_get_entry(plugin_type, plugin_name, config)))
else: else:
origin = 'default' origin = 'default'
value = defs[config].get('default') value = self.template_default(defs[config].get('default'), variables)
if isinstance(value, string_types) and (value.startswith('{{') and value.endswith('}}')) and variables is not None:
# template default values if possible
# NOTE: cannot use is_template due to circular dep
try:
t = NativeEnvironment().from_string(value)
value = t.render(variables)
except Exception:
pass # not templatable
# ensure correct type, can raise exceptions on mismatched types
try: try:
value = ensure_type(value, defs[config].get('type'), origin=origin) value = ensure_type(value, defs[config].get('type'), origin=origin)
except ValueError as e: except ValueError as e:

@ -41,3 +41,6 @@ do
ANSIBLE_LOOKUP_PLUGINS=./ ansible-config init types -t lookup -f "${format}" > "files/types.new.${format}" ANSIBLE_LOOKUP_PLUGINS=./ ansible-config init types -t lookup -f "${format}" > "files/types.new.${format}"
diff -u "files/types.${format}" "files/types.new.${format}" diff -u "files/types.${format}" "files/types.new.${format}"
done done
# ensure we don't show default templates, but templated defaults
[ "$(ansible-config init |grep '={{' -c )" -eq 0 ]

Loading…
Cancel
Save