How to create a list of dicts

47 views
Skip to first unread message

Ashok

unread,
Mar 13, 2019, 2:55:25 AM3/13/19
to Ansible Project
Hi All,

I have a list  ` logf_dest ` (of log files):

"logf_dest": [
       
"/logs/mx/mail.log",
       
"/logs/dyn.log",  
       
"/logs/apache-servers/other.log"
   
]

I need to form a "list of dicts" called ` logfile_config `, like the below:

- logfile_name: remote.conf
  logfile_pattern
: /logs/mx/mail.log
  logfile_owner
: root


- logfile_name: remote.conf
  logfile_pattern
: /logs/dyn.log
  logfile_owner
: root


- logfile_name: remote.conf
  logfile_pattern
: /logs/apache-servers/other.log
  logfile_owner
: root


I've come this far in doing so:

    - name: Create list of dicts
      set_fact
:
        logfile_config
: |
           
{    
           
{% for k in logf_dest %}
           logfile_name
: remote.conf
           logfile_pattern
: {{ k }}
           logfile_owner
: root
           
{% endfor %}
           
}

But, above is obviously not formatted correctly.

I need help on what I am missing here. 

Thanks in advance.

Karl Auer

unread,
Mar 13, 2019, 3:20:31 AM3/13/19
to ansible-project
How dynamic is the content of that source list? One simple approach would be:

- logfile_name: remote.conf
  logfile_pattern: "{{ logf_dest[0] }}"

  logfile_owner: root
- logfile_name: remote.conf
  logfile_pattern: "{{ logf_dest[1] }}"

  logfile_owner: root
- logfile_name: remote.conf
  logfile_pattern: "{{ logf_dest[2] }}"
  logfile_owner: root

If the list is not always three items long, you can do it with a loop:

- set_fact:
     logdict: "{{ loglist |default([]) +
           [  {
                                'logfile_name':    'remote.conf',
                  'logfile_pattern': item,
                 'logfile_owner':   'root'
                            }
           ] }}"
  with_items: "{{ logf_dest }}"

Anyway, something like that. That's off the top of my head, so you may need to correct the syntax a bit, but you get the idea.

Regards, k.


--
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 ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/61b38102-c346-495f-96e5-cd149800d4f9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


--
Karl Auer

Email  : ka...@2pisoftware.com
Website: http://2pisoftware.com


GPG/PGP : 958A 2647 6C44 D376 3D63 86A5 FFB2 20BC 0257 5816
Previous: F0AB 6C70 A49D 1927 6E05 81E7 AD95 268F 2AB6 40EA

Ashok

unread,
Mar 13, 2019, 7:08:33 AM3/13/19
to Ansible Project
The content of the source is very dynamic on each run, hence, going static isn't viable. 

I tried with your logic, like below:

    - name: Form list of dicts
      set_fact
:
        logfile_config
: "{{ logf_dest |default([]) +

                     [ {
                        'logfile_name': 'remote.conf',
                        'logfile_pattern': item,
                        'logfile_owner':   'root'
                       }
                     ] }}"

      with_items
: "{{ logf_dest }}"


   
- debug:
       
var: logfile_config

It doesn't give the desired output. `logfile_config` is:

TASK [debug] *********************************************************************************************************************************
task path: /home/ansible/playbooks/loghost-new.yml:42
ok: [log-dvl.vpn] => {
    "logfile_config": [
        "/logs/mx/mail.log", 
        "/logs/dyn.log", 
        "/logs/apache-servers/other.log", 
        {
            "logfile_name": "remote.conf", 
            "logfile_owner": "root", 
            "logfile_pattern": "/logs/apache-servers/other.log"
        }
    ]
}

Anything I missed? 

Kai Stian Olstad

unread,
Mar 13, 2019, 8:26:52 AM3/13/19
to ansible...@googlegroups.com
On 13.03.2019 12:08, Ashok wrote:
> The content of the source is very dynamic on each run, hence, going
> static
> isn't viable.
>
> I tried with your logic, like below:
>
> - name: Form list of dicts
> set_fact:
> logfile_config: "{{ logf_dest |default([]) +

This need to be
logfile_config: "{{ logfile_config |default([]) +

--
Kai Stian Olstad

Karl Auer

unread,
Mar 13, 2019, 6:16:12 PM3/13/19
to ansible-project
Sorry about that. I did warn you it was off the top of my head :-)

--
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 ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Karl Auer

unread,
Mar 13, 2019, 6:22:09 PM3/13/19
to ansible-project
As Kai Stian Olstad wrote, I got the target list wrong. The first ocurrence of "loglist" should  be "logdict", OR (even better) do as Kai suggested and substitute "logfile_config" for loglist and logdict.

Regards, K.



For more options, visit https://groups.google.com/d/optout.

Ashok

unread,
Mar 14, 2019, 8:48:24 AM3/14/19
to Ansible Project
Hey, it worked :)

Thanks, Kai and Karl. 
Reply all
Reply to author
Forward
0 new messages