It doesn't help at all that googlegroups uses varying width fonts, especially since whitespace is so important in both YAML and Python.

The docs, as far as I've found, never define what |to_nice_yaml|'s |indent| parameter controls, but the experiment below shows it only affects the indentation of mapping keys, with the first position in an indentation being either a space or, if this is the first mapping of a list, a dash. The other unfortunate side effect of |to_nice_yaml| is that it sorts dictionary keys. Both |to_yaml| and |to_nice_yaml| are wrappers around calls to |yaml.dump()| with slightly different parameters. (Particularly, |default_flow_style| being |None| and |False|, respectively, and |to_nice_yaml| having a default |indent| of 4, both of which you can override with either |to_yaml| or |to_nice_yaml|.)

The |indent| filter does not indent "the first attribute of the list despite |first=false|." The whitespace you see in your output before |- class| is the literal spaces before the |{{|.

Save the following as |indent.yml| and run
|ansible-playbook indent.yml && cat ./indent.yml|
to see exactly what "it only affects the indentation of mapping keys" means. It's a lot more subtle than I expected.

|- name: Saving a list of dictionaries to a file gather_facts: false hosts: - localhost tasks: - name: Saving a list of dictionaries to a file vars: topvar: volumes: - class: 'data' id: 'a61b96e7-427e-493a-993c-c3efc8a16aa1' size: '500GB' type: 'ssd' dict: dictd: dictd1: 1 dictd2: 2 dictc: - 111 - 222 - dictcdict: able: a baker: b charlie: - c1 - c2 dictb: beta dicta: alpha copy: content: | topvar_indent_2: {{ topvar | to_nice_yaml(indent=2) | indent(width=2, first=true) }} topvar_no_indent_defaults_to_4: {{ topvar | to_nice_yaml( ) | indent(width=4, first=true) }} topvar_indent_8: {{ topvar | to_nice_yaml(indent=4) | indent(width=8, first=true) }} dest: "./indent_output.yml" |

The output is rather long, but I'll post it here to save you the trouble:

|topvar_indent_2: volumes: - class: data dict: dicta: alpha dictb: beta dictc: - 111 - 222 - dictcdict: able: a baker: b charlie: - c1 - c2 dictd: dictd1: 1 dictd2: 2 id: a61b96e7-427e-493a-993c-c3efc8a16aa1 size: 500GB type: ssd topvar_no_indent_defaults_to_4: volumes: - class: data dict: dicta: alpha dictb: beta dictc: - 111 - 222 - dictcdict: able: a baker: b charlie: - c1 - c2 dictd: dictd1: 1 dictd2: 2 id: a61b96e7-427e-493a-993c-c3efc8a16aa1 size: 500GB type: ssd topvar_indent_8: volumes: - class: data dict: dicta: alpha dictb: beta dictc: - 111 - 222 - dictcdict: able: a baker: b charlie: - c1 - c2 dictd: dictd1: 1 dictd2: 2 id: a61b96e7-427e-493a-993c-c3efc8a16aa1 size: 500GB type: ssd |

On 7/28/22 4:04 AM, jean-christophe manciot wrote:

@Todd Lewis
Thanks for pointing me to the right direction. :-)
Your suggestion is a bit too short:
volumes:
        -   class: data
        id: a61b96e7-427e-493a-993c-c3efc8a16aa1
        size: 500GB
        type: ssd

Strangely, it indents the first attribute of the list despite 'first=false'.
With:
volumes:
        {{ volumes | to_nice_yaml | indent(width=8, first=false) }}

we get a correct result:
volumes:
        -   class: data
            id: a61b96e7-427e-493a-993c-c3efc8a16aa1
            size: 500GB
            type: ssd

which is close enough, although I don't understand why we can't get the original expected result.
On Wednesday, July 27, 2022 at 8:02:19 PM UTC+2 [email protected] wrote:

    You've misunderstoodwhat the indent parameter of |to_nice_yaml
    does|.It doesn't shift everything to the right by that much.
    Rather,it tells how much to indent those things which must be
    indented,like dictionaries within dictionaries. You don't have any
    so ithas no effect.

    Use the |indent|filter instead.

    |volumes:{{ volumes | to_nice_yaml() | indent(width=4, first=false) }}|

    On 7/27/22 1:19 PM, jean-christophemanciot wrote:
    The goal seems to be simple, but I cannot manage to get
    theindentation right.

    *Playbook*:
    - name: Saving a list ofdictionaries to a file
      gather_facts: false
      hosts:
            - localhost
      strategy: debug
      tasks:
            - name: Saving a list of dictionaries to a file
              vars:
                    volumes:
                            - class: 'data'
    id:'a61b96e7-427e-493a-993c-c3efc8a16aa1'
                              size: '500GB'
                              type: 'ssd'
              template:
                    src: "volumes.j2"
                    dest: "../files/volumes.yml"

    *Template*:
    volumes:
            {{ volumes | to_nice_yaml(indent=10) }}

    *Result*:
    volumes:
            - class: data
      id: a61b96e7-427e-493a-993c-c3efc8a16aa1
      size: 500GB
      type: ssd

    *Expected result*:
    volumes:
            - class: data
              id: a61b96e7-427e-493a-993c-c3efc8a16aa1
              size: 500GB
              type: ssd

    What is strange is that the indent value has no effect onthe result.
    Am I doing something wrong or is this an issue withansible?

​

--
You received this message because you are subscribed to the Google Groups "Ansible 
Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/932e1a87-f27f-257d-5da9-b6fb05131f53%40gmail.com.

Reply via email to