Ansible: Menambahkan elemen ke daftar kamus dengan string acak baru
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
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