Saya ingin mengusulkan solusi lain:
- name: Create madhead user
user:
name: madhead
password: "{{ 'password' | password_hash('sha512') }}"
shell: /bin/zsh
update_password: on_create
register: madhead
- name: Force madhead to change password
shell: chage -d 0 madhead
when: madhead.changed
Mengapa lebih baik? Seperti yang telah dijelaskan di sini, drama yang memungkinkan harus idempoten. Anda harus menganggapnya bukan sebagai urutan tindakan dalam gaya imperatif, tetapi seperti keadaan yang diinginkan, gaya deklaratif. Akibatnya, Anda harus dapat menjalankannya beberapa kali dan mendapatkan hasil yang sama, status server yang sama.
Ini semua terdengar bagus, tetapi ada beberapa nuansa. Salah satunya adalah mengelola pengguna. "Keadaan yang diinginkan" berarti bahwa setiap kali Anda menjalankan permainan yang menghasilkan pengguna, dia akan diperbarui untuk mencocokkan keadaan itu dengan tepat. Yang saya maksud dengan "diperbarui" adalah kata sandinya akan diubah juga. Tapi kemungkinan besar bukan itu yang Anda butuhkan. Biasanya, Anda perlu membuat pengguna, mengatur dan mengakhiri kata sandinya hanya sekali, pemutaran selanjutnya tidak harus memperbarui kata sandinya.
Untungnya, Ansible memiliki update_password
atribut dalam user
modul yang memecahkan masalah ini. Mencampur ini dengan variabel terdaftar Anda juga dapat mengakhiri kata sandinya hanya ketika pengguna benar-benar diperbarui.
Perhatikan bahwa jika Anda mengubah shell pengguna secara manual (misalkan, Anda tidak menyukai shell yang dipaksakan oleh admin jahat dalam permainannya) pengguna akan diperbarui, sehingga kata sandinya akan kedaluwarsa.
Perhatikan juga bagaimana Anda dapat dengan mudah menggunakan kata sandi awal teks biasa dalam permainan. Tidak perlu menyandikannya di tempat lain dan menempelkan hash, Anda dapat menggunakan filter Jinja2 untuk itu. Namun, ini bisa menjadi kelemahan keamanan jika seseorang kebetulan masuk sebelum Anda pertama kali melakukannya.
password
juga tidak seharusnya dalam teks biasa melainkan prehashed.