diff --git a/changelogs/fragments/template_override.yml b/changelogs/fragments/template_override.yml new file mode 100644 index 00000000000..92f513b114f --- /dev/null +++ b/changelogs/fragments/template_override.yml @@ -0,0 +1,3 @@ +bugfixes: + - More gracefully handle separator errors in jinja2 template overrides (https://github.com/ansible/ansible/pull/77495). + - Support colons in jinja2 template override values (https://github.com/ansible/ansible/pull/77495). diff --git a/lib/ansible/template/__init__.py b/lib/ansible/template/__init__.py index e605a7f6e9c..56fd2857d70 100644 --- a/lib/ansible/template/__init__.py +++ b/lib/ansible/template/__init__.py @@ -1054,7 +1054,10 @@ class Templar: line = data[len(JINJA2_OVERRIDE):eol] data = data[eol + 1:] for pair in line.split(','): - (key, val) = pair.split(':') + if ':' not in pair: + raise AnsibleError("failed to parse jinja2 override '%s'." + " Did you use something different from colon as key-value separator?" % pair.strip()) + (key, val) = pair.split(':', 1) key = key.strip() setattr(myenv, key, ast.literal_eval(val.strip())) diff --git a/test/integration/targets/template/files/override_colon_value.expected b/test/integration/targets/template/files/override_colon_value.expected new file mode 100644 index 00000000000..257cc5642cb --- /dev/null +++ b/test/integration/targets/template/files/override_colon_value.expected @@ -0,0 +1 @@ +foo diff --git a/test/integration/targets/template/tasks/main.yml b/test/integration/targets/template/tasks/main.yml index e8a2b9a82a0..94fe9abdfc3 100644 --- a/test/integration/targets/template/tasks/main.yml +++ b/test/integration/targets/template/tasks/main.yml @@ -761,3 +761,35 @@ - test vars: test: "{{ lookup('file', '{{ output_dir }}/empty_template.templated')|length == 0 }}" + +- name: test jinja2 override without colon throws proper error + block: + - template: + src: override_separator.j2 + dest: "{{ output_dir }}/override_separator.templated" + - assert: + that: + - False + rescue: + - assert: + that: + - "'failed to parse jinja2 override' in ansible_failed_result.msg" + +- name: test jinja2 override with colon in value + template: + src: override_colon_value.j2 + dest: "{{ output_dir }}/override_colon_value.templated" + ignore_errors: yes + register: override_colon_value_task + +- copy: + src: override_colon_value.expected + dest: "{{output_dir}}/override_colon_value.expected" + +- command: "diff {{ output_dir }}/override_colon_value.templated {{ output_dir}}/override_colon_value.expected" + register: override_colon_value_diff + +- assert: + that: + - override_colon_value_task is success + - override_colon_value_diff.rc == 0 diff --git a/test/integration/targets/template/templates/override_colon_value.j2 b/test/integration/targets/template/templates/override_colon_value.j2 new file mode 100644 index 00000000000..2ca9bb86580 --- /dev/null +++ b/test/integration/targets/template/templates/override_colon_value.j2 @@ -0,0 +1,4 @@ +#jinja2: line_statement_prefix:":" +: if true +foo +: endif diff --git a/test/integration/targets/template/templates/override_separator.j2 b/test/integration/targets/template/templates/override_separator.j2 new file mode 100644 index 00000000000..7589cc300da --- /dev/null +++ b/test/integration/targets/template/templates/override_separator.j2 @@ -0,0 +1 @@ +#jinja2: lstrip_blocks=True