Ansible : Ajout d'un élément à une liste de dictionnaires avec une nouvelle chaîne aléatoire

Aug 18 2020

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

2 Zeitounator Aug 17 2020 at 23:20

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