ansible-core 2.12 - changes to "to_nice_yaml" output

We are seeing a small change to the output of “to_nice_yaml” and “to_yaml” when using ansible-core 2.12 versus 2.11.5 and older. The changes are only about escaping for wrapped multi-line strings.

If this in on purpose, please let me know how I can get the older ansible versions to produce the same output.

Thanks
Claus

Simple playbook:

  • hosts: localhost
    gather_facts: false
    vars:
    test_var: |
    test line 1 which is very long so it wraps around during templating …
    test line 2 which is indented
    tasks:
  • debug:
    msg: ‘{{ lookup(“template”,“test.j2”) }}’
  • debug:
    msg: ‘{{ lookup(“template”,“test.j2”) | from_yaml }}’
  • debug:
    msg: ‘{{ lookup(“template”,“test.j2”) | from_yaml | to_nice_yaml(indent=2, sort_keys=False) }}’

And very simple template:

test: |
{{ test_var | indent(2,false) }}

Output from 2.11.5:
TASK [debug] **********************************************************************************************************************************************************************************

tirsdag 09 november 2021 10:54:14 +0100 (0:00:00.013) 0:00:00.013 ****** ok: [localhost] => { “msg”: “test: |\n test line 1 which is very long so it wraps around during templating …\n test line 2 which is indented\n” } TASK [debug] ********************************************************************************************************************************************************************************** tirsdag 09 november 2021 10:54:14 +0100 (0:00:00.025) 0:00:00.039 ****** ok: [localhost] => { “msg”: { “test”: “test line 1 which is very long so it wraps around during templating …\n test line 2 which is indented\n” } } TASK [debug] ********************************************************************************************************************************************************************************** tirsdag 09 november 2021 10:54:14 +0100 (0:00:00.030) 0:00:00.069 ****** ok: [localhost] => { “msg”: “test: "test line 1 which is very long so it wraps around during templating …\n\\n \ test line 2 which is indented\n"\n” }

Output from 2.12.0:

TASK [debug] **********************************************************************************************************************************************************************************
tirsdag 09 november 2021 11:03:48 +0100 (0:00:00.014) 0:00:00.014 ******
ok: [localhost] => {
“msg”: “test: |\n test line 1 which is very long so it wraps around during templating …\n test line 2 which is indented\n”
}

TASK [debug] **********************************************************************************************************************************************************************************
tirsdag 09 november 2021 11:03:48 +0100 (0:00:00.028) 0:00:00.042 ******
ok: [localhost] => {
“msg”: {
“test”: “test line 1 which is very long so it wraps around during templating …\n test line 2 which is indented\n”
}
}

TASK [debug] **********************************************************************************************************************************************************************************
tirsdag 09 november 2021 11:03:48 +0100 (0:00:00.029) 0:00:00.072 ******
ok: [localhost] => {
“msg”: “test: "test line 1 which is very long so it wraps around during templating …\n\n \ test line 2 which is indented\n"\n”
}

The only changes to YAML in 2.12 were to properly prefer the C extension/libyaml over the pure python implementation. So it’s possible there is some emitter difference between the pyyaml (python) and libyaml (C) implementations.

Thanks Matt
Is there a way I can force Ansible 2.11.x into using the C extension/libyaml variant?

Your points lead me to this article: https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#formatting-data-yaml-and-json
Which notes the difference with default width of 80 with pyyaml. I changed the width to 2147483647 on the “to_nice_yaml”:

  • debug:
    msg: “{{ lookup(‘template’,‘test.j2’) | from_yaml | to_nice_yaml(indent=2, sort_keys=False, width=2147483647) }}”

and now I see the same output from 2.11 and 2.12.

Thank you for the quick support!