Ansible: Menambahkan elemen ke daftar kamus dengan string acak baru

Aug 18 2020

Saya memiliki variabel yang memungkinkan yang merupakan daftar penis:

userdata:
  - { first: Mike, last: Smith, username: msmith}
  - { first: Jane, last: Largo, username: jlargo}
  - { first: Evan, last: Jones, username: ejones}

Saya ingin menambahkan bidang ke setiap entri, 'kata sandi' yang memiliki kata sandi alfanumerik 20 karakter yang dibuat secara acak yang ditetapkan untuk setiap entri sehingga saya dapat menggunakannya sebagaimana berlaku selama pedoman untuk berbagai tindakan yang perlu menyinkronkan kata sandi itu untuk. Saya mencoba melakukan satu blok :, tetapi mengetahui bahwa Anda tidak dapat melakukannya dengan item_. Saya juga tidak dapat menemukan cara untuk menggunakan with_items dan menyimpan kembali ke kamus item tersebut. Plugin pencarian kata sandi terlihat menjanjikan (https://docs.ansible.com/ansible/latest/plugins/lookup/password.html) untuk mendapatkan kata sandi acak tanpa harus menyimpannya ke file (/ dev / null), tetapi saya tidak bisa mendapatkannya di setiap elemen daftar.

Pada akhirnya, saya ingin struktur seperti ini:

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}

Jawaban

2 Zeitounator Aug 17 2020 at 23:20

Anda perlu membuat daftar baru yang mengulang yang asli. Untuk setiap item, Anda menggabungkan yang ada dengan atribut kata sandi. Berikut ini contohnya:

---
- 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

Yang memberikan:

$ 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