Ansible : Ajout d'un élément à une liste de dictionnaires avec une nouvelle chaîne aléatoire
J'ai une variable ansible qui est une liste de dicts:
userdata:
- { first: Mike, last: Smith, username: msmith}
- { first: Jane, last: Largo, username: jlargo}
- { first: Evan, last: Jones, username: ejones}
Je voudrais ajouter un champ à chaque entrée, 'mot de passe' qui a un mot de passe alphanumérique de 20 caractères généré aléatoirement attribué à chaque entrée afin que je puisse l'utiliser selon le cas pendant le playbook pour les différentes actions qui doivent synchroniser ce mot de passe à. J'ai essayé de faire un bloc :, mais j'ai appris que vous ne pouvez pas le faire avec_items. Je n'ai pas non plus trouvé de moyen d'utiliser with_items et de sauvegarder dans le dictionnaire de cet élément. Le plugin de recherche de mot de passe semble prometteur (https://docs.ansible.com/ansible/latest/plugins/lookup/password.html) pour obtenir un mot de passe aléatoire sans avoir à l'enregistrer dans un fichier (/dev/null), mais je n'arrive pas à l'obtenir dans chaque élément de la liste.
Au final, je voudrais une structure comme celle-ci:
userdata:
- { first: Mike, last: Smith, username: msmith, password: FdUChpPtfonoPexMZmt0}
- { first: Jane, last: Largo, username: jlargo, password: QR13sN7CP00LbdXZ0gON}
- { first: Evan, last: Jones, username: ejones, password: OCQSmqCbO8239jHpQiRm}
Réponses
Vous devez créer une nouvelle liste en boucle sur votre liste d'origine. Pour chaque élément, vous combinez l'existant avec l'attribut de mot de passe. Ce qui suit est un exemple:
---
- hosts: localhost
gather_facts: false
vars:
userdata:
- { first: Mike, last: Smith, username: msmith }
- { first: Jane, last: Largo, username: jlargo }
- { first: Evan, last: Jones, username: ejones }
tasks:
- name: Create a new list with random password
vars:
user_entry: "{{ item | combine({'password': lookup('password', '/dev/null')}) }}"
set_fact:
users_with_pass: "{{ users_with_pass | default([]) + [user_entry] }}"
loop: "{{ userdata }}"
- name: Show result
debug:
var: users_with_pass
Qui donne:
$ ansible-playbook test.yml
PLAY [localhost] **************************************************************************************************************************************************************************************************
TASK [Create a new list with random password] *********************************************************************************************************************************************************************
ok: [localhost] => (item={'first': 'Mike', 'last': 'Smith', 'username': 'msmith'})
ok: [localhost] => (item={'first': 'Jane', 'last': 'Largo', 'username': 'jlargo'})
ok: [localhost] => (item={'first': 'Evan', 'last': 'Jones', 'username': 'ejones'})
TASK [Show result] ************************************************************************************************************************************************************************************************
ok: [localhost] => {
"users_with_pass": [
{
"first": "Mike",
"last": "Smith",
"password": "w-zk-BAqJuJ090mTy8g0",
"username": "msmith"
},
{
"first": "Jane",
"last": "Largo",
"password": "J6g07utP.ANtbY7Z58Za",
"username": "jlargo"
},
{
"first": "Evan",
"last": "Jones",
"password": "eqHdpKDpkpEBY21qTyz5",
"username": "ejones"
}
]
}
PLAY RECAP ********************************************************************************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0