Nic
Nic

Reputation: 3507

update user dict with list of values

Ansible 2.7, server and targets are running ubuntu.

At a point of my playbook, I have a users list of dicts:

ok: [virtual_tournesol] => {
"users": [
    {
        "key": "toto",
        "value": [
            "toto",
            "/home/toto/.ssh/id_rsa"
        ]
    },
    {
        "key": "riri",
        "value": [
            "www-data",
            "/home/riri/.ssh/id_rsa"
        ]
    }
]
}

I also fetch generated ssh keys within a pubkeys list:

ok: [virtual_tournesol] => {
"pubkeys": [
    "ssh-rsa XXX1 ansible-generated on tournesol",
    "ssh-rsa XXX2 ansible-generated on tournesol"
]
}

How could I merge both data such I can continue my tasks using users only ? I wish to get:

ok: [virtual_tournesol] => {
"users": [
    {
        "key": "toto",
        "value": [
            "toto",
            "/home/toto/.ssh/id_rsa",
            "ssh-rsa XXX1 ansible-generated on tournesol"
        ]
    },
    {
        "key": "riri",
        "value": [
            "www-data",
            "/home/riri/.ssh/id_rsa",
            "ssh-rsa XXX2 ansible-generated on tournesol"
        ]
    }
]
}

EDIT: In python, that would give something like:

for u, k in zip(users, pubkeys):
    u['value'].append(k)

Upvotes: 0

Views: 46

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 68254

zip is a good choice. The code below

- set_fact:
    user1: "{{ user1|default({}) | combine(
             { item.0.key: item.0.value + [ item.1 ] } ) }}"
  loop: "{{ users|zip(pubkeys)|list }}"
- debug:
    msg: "{{ user1|dict2items }}"

gives

"msg": [
    {
        "key": "riri", 
        "value": [
            "www-data", 
            "/home/riri/.ssh/id_rsa", 
            "ssh-rsa XXX2 ansible-generated on tournesol"
        ]
    }, 
    {
        "key": "toto", 
        "value": [
            "toto", 
            "/home/toto/.ssh/id_rsa", 
            "ssh-rsa XXX1 ansible-generated on tournesol"
        ]
    }
]

Upvotes: 1

Related Questions