diff --git a/library/files/lineinfile b/library/files/lineinfile index 82658cae65..e05652a1f9 100644 --- a/library/files/lineinfile +++ b/library/files/lineinfile @@ -348,7 +348,11 @@ def main(): if ins_bef is None and ins_aft is None: ins_aft = 'EOF' - present(module, dest, params['regexp'], params['line'], + # Replace the newline character with an actual newline. Don't replace + # escaped \\n, hence sub and not str.replace. + line = re.sub(r'\n', os.linesep, params['line']) + + present(module, dest, params['regexp'], line, ins_aft, ins_bef, create, backup, backrefs) else: if params['regexp'] is None and params.get('line', None) is None: diff --git a/test/TestRunner.py b/test/TestRunner.py index e9207c229a..027a4c6c9e 100644 --- a/test/TestRunner.py +++ b/test/TestRunner.py @@ -524,6 +524,23 @@ class TestRunner(unittest.TestCase): result = self._run(*testcase) assert result['failed'] + # insert multiline at the end of the file + testline1 = '#12: The \\n character replaced with' + testline2 = 'an actual newline.' + testcase = ('lineinfile', [ + "dest=%s" % sample, + "regexp='^#12: '", + "line='%s\n%s'" % (testline1, testline2) + ]) + result = self._run(*testcase) + assert result['changed'] + assert result['msg'] == 'line added' + artifact = [x.strip() for x in open(sample)] + assert artifact[-2] == testline1 + assert artifact[-1] == testline2 + assert artifact.count(testline1) == 1 + assert artifact.count(testline2) == 1 + # cleanup os.unlink(sample)