Merge pull request #10957 from feanil/feanil/retain_nonetypes

Don't convert nulls to strings.
pull/12024/head
Toshio Kuratomi 9 years ago
commit 4f32a61504

@ -18,6 +18,13 @@ Major Changes:
If you need the old behaviour, quote the value and it will get passed around as a string
* added meta: refresh_inventory to force rereading the inventory in a play
* vars are now settable at play, block, role and task level
* template code now retains types for bools, and Numbers instead of turning them into strings
If you need the old behaviour, quote the value and it will get passed around as a string. In the
case of nulls, the output used to be an empty string.
* Empty variables and variables set to null in yaml will no longer be converted to empty strings.
They will retain the value of `None`. To go back to the old behaviour, you can override
the `null_representation` setting to an empty string in your config file or by setting the
`ANSIBLE_NULL_REPRESENTATION` environment variable.
Deprecated Modules (new ones in parens):
* ec2_ami_search (ec2_ami_find)

@ -40,7 +40,7 @@ def mk_boolean(value):
else:
return False
def get_config(p, section, key, env_var, default, boolean=False, integer=False, floating=False, islist=False):
def get_config(p, section, key, env_var, default, boolean=False, integer=False, floating=False, islist=False, isnone=False):
''' return a configuration variable with casting '''
value = _get_config(p, section, key, env_var, default)
if boolean:
@ -53,6 +53,9 @@ def get_config(p, section, key, env_var, default, boolean=False, integer=False,
elif islist:
if isinstance(value, string_types):
value = [x.strip() for x in value.split(',')]
elif isnone:
if value == "None":
value = None
elif isinstance(value, string_types):
value = unquote(value)
return value
@ -205,6 +208,7 @@ DEFAULT_LOAD_CALLBACK_PLUGINS = get_config(p, DEFAULTS, 'bin_ansible_callbacks'
DEFAULT_CALLBACK_WHITELIST = get_config(p, DEFAULTS, 'callback_whitelist', 'ANSIBLE_CALLBACK_WHITELIST', [], islist=True)
RETRY_FILES_ENABLED = get_config(p, DEFAULTS, 'retry_files_enabled', 'ANSIBLE_RETRY_FILES_ENABLED', True, boolean=True)
RETRY_FILES_SAVE_PATH = get_config(p, DEFAULTS, 'retry_files_save_path', 'ANSIBLE_RETRY_FILES_SAVE_PATH', '~/')
DEFAULT_NULL_REPRESENTATION = get_config(p, DEFAULTS, 'null_representation', 'ANSIBLE_NULL_REPRESENTATION', None, isnone=True)
# CONNECTION RELATED
ANSIBLE_SSH_ARGS = get_config(p, 'ssh_connection', 'ssh_args', 'ANSIBLE_SSH_ARGS', None)

@ -37,6 +37,7 @@ from ansible.template.vars import AnsibleJ2Vars
from ansible.utils.debug import debug
from numbers import Number
from types import NoneType
__all__ = ['Templar']
@ -187,6 +188,8 @@ class Templar:
resolved_val = self._available_variables[var_name]
if isinstance(resolved_val, NON_TEMPLATED_TYPES):
return resolved_val
elif isinstance(resolved_val, NoneType):
return C.DEFAULT_NULL_REPRESENTATION
result = self._do_template(variable, preserve_trailing_newlines=preserve_trailing_newlines, fail_on_undefined=fail_on_undefined, overrides=overrides)

@ -3,6 +3,7 @@ templated_var_loaded
{
"bool": true,
"multi_part": "1Foo",
"null_type": null,
"number": 5,
"string_num": "5"
}

@ -5,10 +5,12 @@ string_num: "5"
bool_var: true
part_1: 1
part_2: "Foo"
null_type: !!null
templated_dict:
number: "{{ number_var }}"
string_num: "{{ string_num }}"
null_type: "{{ null_type }}"
bool: "{{ bool_var }}"
multi_part: "{{ part_1 }}{{ part_2 }}"

@ -32,6 +32,7 @@ import pwd
import ast
import traceback
from numbers import Number
from types import NoneType
from ansible.utils.string_functions import count_newlines_from_end
from ansible.utils import to_bytes, to_unicode
@ -343,7 +344,7 @@ def template_from_string(basedir, data, vars, fail_on_undefined=False):
var_name = only_one.group(1)
if var_name in vars:
resolved_val = vars[var_name]
if isinstance(resolved_val, (bool, Number)):
if isinstance(resolved_val, (bool, Number, NoneType)):
return resolved_val
def my_finalize(thing):

Loading…
Cancel
Save