How to create a list of dicts

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.

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.

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?

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

Sorry about that. I did warn you it was off the top of my head :slight_smile:

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.

Hey, it worked :slight_smile:

Thanks, Kai and Karl.