diff --git a/lib/ansible/utils/string_functions.py b/lib/ansible/utils/string_functions.py index 6d71c7bfa2e..4972cc07625 100644 --- a/lib/ansible/utils/string_functions.py +++ b/lib/ansible/utils/string_functions.py @@ -5,3 +5,11 @@ def isprintable(instring): isprintable = set(instring).issubset(printset) return isprintable +def count_newlines_from_end(str): + i = len(str) + while i > 0: + if str[i-1] != '\n': + break + i -= 1 + return len(str) - i + diff --git a/lib/ansible/utils/template.py b/lib/ansible/utils/template.py index 5b61bc125f0..751be225f3a 100644 --- a/lib/ansible/utils/template.py +++ b/lib/ansible/utils/template.py @@ -32,6 +32,8 @@ import pwd import ast import traceback +from ansible.utils.string_functions import count_newlines_from_end + class Globals(object): FILTERS = None @@ -495,8 +497,14 @@ def template_from_file(basedir, path, vars): except jinja2.exceptions.UndefinedError, e: raise errors.AnsibleUndefinedVariable("One or more undefined variables: %s" % str(e)) - if data.endswith('\n') and not res.endswith('\n'): - res = res + '\n' + # The low level calls above do not preserve the newline + # characters at the end of the input data, so we use the + # calculate the difference in newlines and append them + # to the resulting output for parity + res_newlines = count_newlines_from_end(res) + data_newlines = count_newlines_from_end(data) + if data_newlines > res_newlines: + res += '\n' * (data_newlines - res_newlines) if isinstance(res, unicode): # do not try to re-template a unicode string