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.

Reply via email to