I have a large number of YAML files prepared manually which have a fixed structure - list of dictionaries. But within different files, sequence of these keys and their values differ. I need to manage them automatically, so i am writing a kind of converter to add marker blocks. But i am stuck at this point:
example input YAML file
`
#something
keyA:
A1:
bla
bla
A2: bla bla
A3:
A3.1: bla
A3.2: bla
keyA:
C1:
bla
C2: bla bla
C3:
C3.1: bla
keyB:
B1:
bla
bla
B2: bla bla
B3:
B3.1: bla
B3.2: bla
B3.3: bla
B4:
bla
bla
`
playbook to load one of the YAML, and try to write the same variables again with markers appended
`
include_vars:
file: “path to one of the YAML file”
name: yamlVars
template:
src: updated.yaml.j2
dest: “path to that same file”
`
the template
`
{% for key, value in yamlVars.iteritems() %}
BEGIN BLOCK {{ key }}
{{ value | to_nice_yaml }}
END BLOCK {{ key }}
{% endfor %}
`
Poblem is, always the contents of each key is printed:
(manually prepared output to hide my variables)
actual output
`
BEGIN BLOCK keyA
A1:
bla
bla
A2: bla bla
A3:
A3.1: bla
A3.2: bla
END BLOCK keyA
BEGIN BLOCK keyC
C1:
bla
C2: bla bla
C3:
C3.1: bla
END BLOCK keyC
BEGIN BLOCK keyB
B1:
bla
bla
B2: bla bla
B3:
B3.1: bla
B3.2: bla
B3.3: bla
B4:
bla
bla
END BLOCK keyB
`
expected output
`
BEGIN BLOCK keyA
keyA:
A1:
bla
bla
A2: bla bla
A3:
A3.1: bla
A3.2: bla
END BLOCK keyA
BEGIN BLOCK keyC
keyC:
C1:
bla
C2: bla bla
C3:
C3.1: bla
END BLOCK keyC
BEGIN BLOCK keyB
keyB:
B1:
bla
bla
B2: bla bla
B3:
B3.1: bla
B3.2: bla
B3.3: bla
B4:
You are going to have to not use vars files then. Or you will need to store the data as strings.
If you don’t want formatting to change at all, you can’t convert from YAML to python dict, to YAML, to jinja2+YAML. You will need to find a way to join them without going through those steps.
To add markers in all of them, i either have the option of lineinefile with regex or this. Regex for such a case look almost impossible. So i have to make this work.
When i print the complete yamlVars, it works perfectly fine. Can i not append each key-value pair to a temporary dictionary and print that dictionary ?