diff --git a/changelogs/fragments/blockinfile-line-ending-fix.yaml b/changelogs/fragments/blockinfile-line-ending-fix.yaml new file mode 100644 index 00000000000..57c680cf7e7 --- /dev/null +++ b/changelogs/fragments/blockinfile-line-ending-fix.yaml @@ -0,0 +1,4 @@ +bugfixes: + - > + blockinfile - fix regression that results in incorrect block in file when the + block to be inserted does not end in a line separator (https://github.com/ansible/ansible/pull/69734) diff --git a/lib/ansible/modules/blockinfile.py b/lib/ansible/modules/blockinfile.py index f11d7f8eeb9..f5b422c6bbc 100644 --- a/lib/ansible/modules/blockinfile.py +++ b/lib/ansible/modules/blockinfile.py @@ -272,6 +272,8 @@ def main(): # Escape sequences like '\n' need to be handled in Ansible 1.x if module.ansible_version.startswith('1.'): block = re.sub('', block, '') + if not block.endswith(b(os.linesep)): + block += b(os.linesep) blocklines = [marker0] + block.splitlines(True) + [marker1] else: blocklines = [] diff --git a/test/integration/targets/blockinfile/tasks/main.yml b/test/integration/targets/blockinfile/tasks/main.yml index 5accf5b5875..ffcfd18d3ef 100644 --- a/test/integration/targets/blockinfile/tasks/main.yml +++ b/test/integration/targets/blockinfile/tasks/main.yml @@ -137,3 +137,35 @@ - 'blockinfile_test2 is changed' - 'blockinfile_test2.msg == "Block inserted"' - 'blockinfile_test2_grep.stdout == "6"' + + +- name: Add block without trailing line separator + blockinfile: + path: "{{ output_dir_test }}/chomped_block_test.txt" + create: yes + content: |- + one + two + three + register: chomptest1 + +- name: Add block without trailing line separator again + blockinfile: + path: "{{ output_dir_test }}/chomped_block_test.txt" + content: |- + one + two + three + register: chomptest2 + +- name: Check output file + stat: + path: "{{ output_dir_test }}/chomped_block_test.txt" + register: chomptest_file + +- name: Ensure chomptest results are correct + assert: + that: + - chomptest1 is changed + - chomptest2 is not changed + - chomptest_file.stat.checksum == '50d49f528a5f7147c7029ed6220c326b1ee2c4ae'