I have done similar things. With enough "experimentation", you can get it
right.
Here's an example from a recent project:
---
all:
vars:
randomkey: "1" # set this first to override
{% for k in inventory_data.key1.key2["key3-with-dashes"] -%}
{% set v = inventory_data.key1.key2["key3-with-dashes"][k] %}
{{ k | indent( width=1 )}}: {% if v is string %}{{ v | to_nice_json }}{%
else %}{{ v | to_nice_json(indent=2) | indent( width=10, first=true) }}{%
endif %}
{% endfor %}
Notice three things:
- the initial spaces in front
- the to_nice_json(indent=2)
- the EXTRA indent(width=10, first=true) afterwards
My workaround here is that nested values end up being json instead of pure
yaml (yaml is a superset of json).
This doesn't produce exactly what I would do with hand crafted yaml, but it
does produce valid yaml.
NB: the inventory_data var is passed in to the template like this:
- name: Create inventory file and populate
template:
src: localhost_inventory.yml.j2
dest: "{{ ansible_dir }}/inventory/localhost.yml"
mode: '0644'
owner: root
vars:
inventory_data: "{{
lookup('file','./ansible-inventory/settings/static/group1/hosts.yml') |
from_yaml }}"
On Wednesday, February 28, 2018 at 4:56:01 AM UTC-8, ishan jain wrote:
>
> Hi,
>
> More indentation doesn't work. Maybe i should think of some other approach
> entirely.
> Thanks for your help.
>
> BR,
> Ishan
>
> On Tuesday, 27 February 2018 17:22:25 UTC+1, Kai Stian Olstad wrote:
>>
>> On Tuesday, 27 February 2018 16.54.17 CET ishan jain wrote:
>> > Hi,
>> >
>> > 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 ?
>>
>> Have you tried this for 2 space indentation
>>
>> # BEGIN BLOCK {{ key }}
>> {{ key }}:
>> {{ value | to_nice_yaml(indent=2) }}
>> # END BLOCK {{ key }}
>>
>> for 4 space you can use this
>> # BEGIN BLOCK {{ key }}
>> {{ key }}:
>> {{ value | to_nice_yaml(indent=4) }}
>> # END BLOCK {{ key }}
>>
>> You will never managed to create this with to_nice_yaml
>> keyA:
>> A1:
>> - bla
>> - bla
>>
>> Since the correct 2 space indentation is
>> keyA:
>> A1:
>> - bla
>> - bla
>>
>> But if you can live with that the code above should work.
>>
>> Another thing, dictionary is not sorted so you can get different order of
>> the keyX between subsequent runs.
>>
>> --
>> Kai Stian Olstad
>>
>
--
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 post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/8bb33da8-6bc1-41cf-996f-e275885d2c37%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.