Membuat pengguna dan kata sandi baru dengan Ansible

103

Saya memiliki tugas yang memungkinkan yang membuat pengguna baru di ubuntu 12.04;

- name: Add deployment user
    action: user name=deployer password=mypassword

itu selesai seperti yang diharapkan tetapi ketika saya masuk sebagai pengguna itu dan mencoba sudo dengan kata sandi yang saya atur selalu mengatakan itu salah. Apa yang saya lakukan salah?

raphael_turtle
sumber
1
Apakah Anda masuk dengan kata sandi atau kunci ssh yang sama? Apakah Anda memeriksa file bayangan Anda untuk memastikan isinya seperti yang diharapkan? Anda passwordjuga tidak seharusnya dalam teks biasa melainkan prehashed.
MXX
kata sandi saya adalah teks biasa, dapatkah saya tidak menggunakannya seperti itu? Saya tidak mengerti bagaimana membuatnya dienkripsi, atau benar-benar perlu.
raphael_turtle

Jawaban:

101

Jika Anda membaca Ansible's manual for usermodule , Anda akan diarahkan ke repo github Ansible-contoh untuk mengetahui detail cara menggunakan passwordparameter .

Di sana Anda akan melihat bahwa kata sandi Anda harus di-hash.

- hosts: all
  user: root
  vars:
    # created with:
    # python -c 'import crypt; print crypt.crypt("This is my Password", "$1$SomeSalt$")'
    password: $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.

  tasks:
    - user: name=tset password={{password}}

Jika buku pedoman atau baris perintah Anda memiliki kata sandi apa adanya dalam teks biasa, ini berarti hash kata sandi Anda terekam dalam bayangan Anda file salah. Itu berarti ketika Anda mencoba mengautentikasi dengan kata sandi Anda, hashnya tidak akan pernah cocok.

Selain itu, lihat Pertanyaan Umum yang Mungkin tentang beberapa nuansa parameter kata sandi dan cara menggunakannya dengan benar.

Mxx
sumber
25
Terima kasih atas tipnya. Saya hanya ingin menunjukkan bahwa dokumentasi modul pengguna yang ditautkan di atas merekomendasikan penggunaan openssl passwd -salt <salt> -1 <plaintext>untuk menghasilkan hash kata sandi, daripada Python one-liner yang Anda miliki di atas. Saya mengalami masalah mendapatkan keluaran yang benar dari Python, mungkin karena ketidakmampuan saya sendiri dan perintah openssl bekerja lebih baik.
Brendan Wood
6
Bagaimana Anda menyinkronkan garam untuk digunakan dengan OS?
Breedly
5
@Breedly: tidak perlu - salt selalu disimpan sebagai bagian dari kata sandi ($ 1 $ thesalt $ thepasswordhash) yang berarti portabel antar OS menggunakan fungsi hash yang sama
Benjamin Dale
3
Menggunakan perintah python ini untuk menghasilkan hash tidak berhasil untuk saya. Tapi saya menemukan hash /etc/shadowsetelah mengatur kata sandi secara manual menggunakan passwd <user>.
dokaspar
172

Saya mungkin terlambat untuk menjawabnya, tetapi baru-baru ini saya mengetahui bahwa filter jinja2 memiliki kemampuan untuk menangani pembuatan sandi terenkripsi. Di saya, main.ymlsaya membuat kata sandi terenkripsi sebagai:

- name: Creating user "{{ uusername }}" with admin access
  user: 
    name: {{ uusername }}
    password: {{ upassword | password_hash('sha512') }}
    groups: admin append=yes
  when:  assigned_role  == "yes"

- name: Creating users "{{ uusername }}" without admin access
  user:
    name: {{ uusername }}
    password: {{ upassword | password_hash('sha512') }}
  when:  assigned_role == "no"

- name: Expiring password for user "{{ uusername }}"
  shell: chage -d 0 "{{ uusername }}"

"uusername" dan "upassword" diteruskan sebagai --extra-vars ke playbook dan pemberitahuan bahwa saya telah menggunakan filter jinja2 di sini untuk mengenkripsi sandi yang lewat.

Saya telah menambahkan tutorial di bawah yang terkait dengan ini ke blog saya

monster berpikir
sumber
6
Untuk menghindari item selalu "berubah", Anda dapat menambahkan "salt" rahasia sebagai parameter ke-2 ke password_hash.
Michael Wyraz
11
Sesuai saran @ MichaelWyraz: menambahkan parameter "garam" kedua menghindari "berubah". Anda dapat mengatur ini melalui variabel, misalnya password={{upassword|password_hash('sha512', upassword_salt)}}. Itu memungkinkan Anda meletakkan garam di brankas variabel , seperti yang mungkin Anda lakukan upasswordjuga, menjaga keduanya keluar dari task.yml.
pengguna85461
Saya juga akan menerapkan pemeriksaan status @ bbaassssiee dan menambahkan update_password: on_createmodul pengguna ke jawaban ini untuk mencegah kata sandi kedaluwarsa untuk pengguna yang sudah dibuat.
gila
Terima kasih atas teladan bagus Anda, ini membawa saya ke jalur yang benar. Namun demikian saya harus melakukan beberapa hal lagi untuk membuatnya berfungsi di mac dengan kemungkinan versi 2.8.2. Pertama-tama pada mac tidak mungkin menggunakan crypt oleh karena itu diperlukan untuk menginstal pustaka passlib dengan pip install passlib. Kemudian untuk dapat menggunakan lemari besi string terenkripsi inline saya harus memformat dengan tambahan berikut: password: {{ upassword | string | password_hash('sha512') }}. Ini menghindari pesan kesalahansecret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode
Michael Aicher
meskipun menggunakan metode ini untuk menyetel sandi: "{{my_password | string | password_hash ('sha512')}}" Saya masih akan mendapatkan - [PERINGATAN]: Kata sandi yang dimasukkan tampaknya belum di-hash. Argumen 'password' harus dienkripsi agar modul ini bekerja dengan baik.
openCivilisation
46

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_passwordatribut dalam usermodul 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.

orang gila
sumber
3
Saya tidak bisa mendapatkan solusi lain yang berfungsi untuk saya. Namun jawaban Anda sederhana dan berhasil. Saya ingin memberi Anda 5 suara positif, jika saya bisa.
leesei
Saya tidak ingin kata sandi saya dikodekan seperti itu :( Apakah mungkin untuk mengeluarkannya dari lemari besi yang mungkin dan menyuntikkannya di sini? Bersarang "{{ '{{vaulted_password}}' | password_hash('sha512') }}"sepertinya tidak berhasil ...
dokaspar
Sudahkah Anda mencoba {{ vaulted_password | password_hash('sha512') }}, di mana vaulted_passwordkunci nilai di vault?
gila
update_password: on_createsepertinya tidak berfungsi (ada bug terbuka tentangnya dari 2017), jadi kata sandi akan berubah setiap kali ada perubahan status pada pengguna.
Diti
11

Modul Ansible 'user' mengelola pengguna, dengan cara idempoten . Dalam playbook di bawah, tugas pertama menyatakan state = present untuk pengguna. Perhatikan bahwa ' register: newuser ' pada tindakan pertama membantu tindakan kedua untuk menentukan apakah pengguna tersebut baru (newuser.changed == True) atau existing ( newuser.changed==False), untuk hanya menghasilkan sandi sekali.

The Ansible Playbook memiliki:

tasks:
  - name: create deployment user
    user: 
      name: deployer 
      createhome: yes 
      state: present 
    register: newuser

  - name: generate random password for user only on creation
    shell: /usr/bin/openssl rand -base64 32 | passwd --stdin deployer
    when: newuser.changed
bbaassssiiee
sumber
Hanya satu solusi yang berfungsi untuk saya dengan kata sandi vault. Terima kasih banyak.
Denis Savenko
setidaknya distribusi berbasis Debian baru-baru ini tampaknya tidak mendukung opsi GNU yang panjang "--stdin" ke biner passwd.
XXL
10

coba seperti ini

vars_prompt:
 - name: "user_password"    
   prompt: "Enter a password for the user"    
   private: yes    
   encrypt: "md5_crypt" #need to have python-passlib installed in local machine before we can use it    
   confirm: yes    
   salt_size: 7

 - name: "add new user" user: name="{{user_name}}" comment="{{description_user}}" password="{{user_password}}" home="{{home_dir}}" shell="/bin/bash"
Artem Feofanov
sumber
2
Saya suka solusi ini karena memungkinkan untuk mengetikkan kata sandi saat skrip berjalan. Solusi bagus untuk skrip bootstrap yang tidak boleh dijalankan setiap saat. Untuk Ubuntu saya menggunakan "sha512_crypt".
Gunnar
6

Tujuan dari peran dalam jawaban ini adalah untuk menghasilkan kata sandi acak untuk nama_user_baru dan segera kedaluwarsa kata sandi. New_user_name diperlukan untuk mengubah kata sandi pada logon pertamanya.

create_user.yml:

---
# create_user playbook

- hosts: your_host_group
  become: True
  user: ansible

  roles:
    - create_user

peran / create_user / tugas / main.yml:

---
# Generate random password for new_user_name and the new_user_name
# is required to change his/her password on first logon. 

- name: Generate password for new user
  shell: makepasswd --chars=20
  register: user_password

- name: Generate encrypted password
  shell: mkpasswd --method=SHA-512 {{ user_password.stdout }}
  register: encrypted_user_password

- name: Create user account
  user: name={{ new_user_name }}
        password={{ encrypted_user_password.stdout }}
        state=present
        append=yes
        shell="/bin/bash"
        update_password=always
  when: new_user_name is defined and new_user_name in uids
  register: user_created

- name: Force user to change password
  shell: chage -d 0 {{ new_user_name }}
  when: user_created.changed

- name: User created
  debug: msg="Password for {{ new_user_name }} is {{ user_password.stdout }}"
  when: user_created.changed

Saat Anda ingin membuat pengguna baru:

ansible-playbook -i hosts.ini create_user.yml --extra-vars "new_user_name=kelvin"
McKelvin
sumber
3

Ini cara mudahnya:

---
- name: Create user
  user: name=user shell=/bin/bash home=/srv/user groups=admin,sudo generate_ssh_key=yes ssh_key_bits=2048
- name: Set password to user
  shell: echo user:plain_text_password | sudo chpasswd
  no_log: True
Menyala
sumber
shell: akan selalu menyebabkan perubahan dilaporkan.
bbaassssiiee
@datasmid Anda dapat menambahkan nolog: Opsi benar docs.ansible.com/ansible/…
Phill Pafford
3

Beginilah cara kerjanya untuk saya

- hosts: main
  vars:
  # created with:
  #  python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('<password>')"
  # above command requires the PassLib library: sudo pip install passlib
  - password: '$6$rounds=100000$H/83rErWaObIruDw$DEX.DgAuZuuF.wOyCjGHnVqIetVt3qRDnTUvLJHBFKdYr29uVYbfXJeHg.IacaEQ08WaHo9xCsJQgfgZjqGZI0'

tasks:

- user: name=spree password={{password}} groups=sudo,www-data shell=/bin/bash append=yes
  sudo: yes
hecbuma
sumber
3

Hanya untuk kelengkapan saya akan memposting perintah ad-hoc menggunakan ansible karena ada tangkapan di sana juga.

Pertama coba buat kata sandi terenkripsi menggunakan utilitas mkpasswd yang tersedia di sebagian besar sistem Linux:

mkpasswd --method=SHA-512

Kemudian coba perintah ad-hock yang mungkin:

ansible all -m user -a 'name=testuser shell=/bin/bash \
     comment="Test User" password=$6$XXXX' -k -u admin --sudo

Tapi pastikan:

  1. Perintahnya dalam tanda kutip tunggal dan BUKAN ganda jika tidak, kata sandi Anda tidak akan pernah berfungsi
  2. Anda menjalankannya dengan --sudoatau Anda berakhir dengan kesalahan seperti ( useradd: cannot lock /etc/passwd; try again later)
pgaref.dll
sumber
terima kasih sobat, saya secara khusus mencari versi adhoc, dan memiliki masalah kutipan yang sama seperti yang Anda sebutkan
alexakarpov
2

Definisi tugas untuk modul pengguna harus berbeda pada versi terbaru yang memungkinkan.

tasks:
  - user: name=test password={{ password }} state=present
Christian Berendt
sumber
2

Menggabungkan beberapa solusi dari atas, saya membuat buku pedoman yang secara otomatis menghasilkan hash kata sandi yang benar berdasarkan kata sandi teks biasa yang disimpan dalam file brankas lokal yang terenkripsi:

---
- hosts: [your hosts]
  tasks:
  - include_vars: [path to your encrypted vault file]
  - local_action: "command openssl passwd -salt '{{password_salt}}' -1 '{{password}}'"
    register: password_hash
  - user: >
        name=[your username]
        state=present
        password="{{password_hash.stdout}}"

Jalankan perintah ini menggunakan opsi "--ask-vault-pass" untuk mendekripsi file vault Anda (lihat ansible-vault untuk info tentang cara mengelola vault terenkripsi).

Steve Midgley
sumber
2

Cara membuat kata sandi terenkripsi untuk meneruskan ke passwordvar ke usertugas Ansible (dari komentar @Brendan Wood):

openssl passwd -salt 'some_plain_salt' -1 'some_plain_pass'

Hasilnya akan terlihat seperti:

$1$some_pla$lmVKJwdV3Baf.o.F0OOy71

Contoh usertugas:

- name: Create user
  user: name="my_user" password="$1$some_pla$lmVKJwdV3Baf.o.F0OOy71"

UPD: crypt menggunakan SHA-512 lihat di sini dan di sini :

Python

$ python -c "import crypt, getpass, pwd; print crypt.crypt('password', '\$6\$saltsalt\$')"

$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

Perl

$ perl -e 'print crypt("password","\$6\$saltsalt\$") . "\n"'

$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

Rubi

$ ruby -e 'puts "password".crypt("$6$saltsalt$")'

$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/
Dmitriy
sumber
1
Bukankah ini menghasilkan kata sandi berciri md5? Bukankah itu tidak aman?
Tandai
2

Anda dapat menggunakan ansible-vault untuk menggunakan kunci rahasia di playbook. Tentukan kata sandi Anda dalam yml.

ex. lulus: rahasia atau

user:
  pass: secret
  name: fake

mengenkripsi file rahasia Anda dengan:

ansible-vault encrypt /path/to/credential.yml

ansible akan meminta kata sandi untuk mengenkripsinya. (saya akan menjelaskan cara menggunakan pass itu)

Dan kemudian Anda dapat menggunakan variabel Anda di tempat yang Anda inginkan. Tidak ada yang bisa membacanya tanpa vault-key.

Penggunaan kunci Vault:

melalui argumen yang lewat saat menjalankan pedoman.

--ask-vault-pass: secret

atau Anda dapat menyimpan ke file seperti password.txt dan bersembunyi di suatu tempat. (berguna untuk pengguna CI)

--vault-password-file=/path/to/file.txt

Dalam kasus Anda: sertakan vars yml dan gunakan variabel Anda.

- include_vars: /path/credential.yml

  - name: Add deployment user
    action: user name={{user.name}} password={{user.pass}}
pmoksuz
sumber
Saya telah mencoba persis seperti ini, dan tidak berhasil. Saya percaya, itu karena password={{user.pass}}akan diperluas untuk memasukkan kata sandi yang sebenarnya, sementara kemungkinan mengharapkan hash di sana.
texnic
2

Menghasilkan kata sandi acak untuk pengguna

pertama-tama perlu mendefinisikan variabel pengguna kemudian ikuti di bawah ini

tugas:

- name: Generate Passwords
  become: no
  local_action: command pwgen -N 1 8
  with_items: '{{ users }}'
  register: user_passwords

- name: Update User Passwords
  user:
    name: '{{ item.item }}'
    password: "{{ item.stdout | password_hash('sha512')}}"
    update_password: on_create
  with_items: '{{ user_passwords.results }}'

- name: Save Passwords Locally
  become: no
  local_action: copy content={{ item.stdout }} dest=./{{ item.item }}.txt
  with_items: '{{ user_passwords.results }}'
Apuri Srikanth
sumber
1

Jawaban Mxx benar tetapi Anda crypt.crypt()metode python tidak aman ketika sistem operasi yang berbeda terlibat (terkait dengan algoritma hash glibc yang digunakan pada sistem Anda.)

Misalnya, Ini tidak akan berfungsi jika Anda menghasilkan hash dari MacOS dan menjalankan buku pedoman di linux. Dalam kasus seperti itu, Anda dapat menggunakan passlib ( pip install passlibuntuk menginstal secara lokal).

from passlib.hash import md5_crypt
python -c 'import crypt; print md5_crypt.encrypt("This is my Password,salt="SomeSalt")'
'$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.'
Joel B
sumber
1

Tidak ada solusi yang berfungsi langsung di Mac saya yang mengontrol Ubuntu. Jadi demi orang lain, menggabungkan jawaban Mxx dan JoelB, berikut adalah solusi Python 3 saat ini:

pip3 install passlib

python3 -c 'from passlib.hash import md5_crypt; \
      print(md5_crypt.encrypt("This is my Password", salt="SomeSalt"))'

Hasilnya akan $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.seperti jawaban Mxx.

Lebih baik lagi , gunakan SHA512 daripada MD5:

python3 -c 'from passlib.hash import sha512_crypt; \
      print(sha512_crypt.encrypt("This is my Password", salt="SomeSalt"))' 

Hasil:

$ 6 $ putaran = 656000 $ SomeSalt $ oYpmnpZahIsvn5FK8g4bDFEAmGpEN114Fe6Ko4HvinzFaz5Rq2UXQxoJZ9ZQyQoi9zaBo3gBH / FEAov3FHv48

texnic
sumber
1

Saya telah membuat sebuah buku pedoman yang memungkinkan Anda untuk membuat akun linux yang memungkinkan otentikasi kata sandi.

Lihat CreateLinuxAccountWithAnsible .

Kata sandi berciri dibuat dengan menggunakan mkpasswdperintah. Saya telah menyediakan cara untuk menginstal mkpasswdpada sistem operasi yang berbeda.

Berikut langkah-langkah yang diperlukan untuk menggunakan skrip saya:

  1. Ganti <your_user_name>dan <your_password>di dalam run.shdengan nama pengguna dan kata sandi yang Anda inginkan.

  2. Ubah informasi koneksi inventorysehingga memungkinkan dapat terhubung ke mesin untuk membuat pengguna.

  3. Jalankan ./run.shuntuk menjalankan skrip.

Brian
sumber
1
File tersebut sudah tidak ada di GitHub lagi.
Janus
0

Jika Anda ingin melakukannya sebagai perintah Ad-hoc yang mungkin, Anda dapat melakukan hal berikut:

$ password='SomethingSecret!'
$ ansible 192.168.1.10 -i some_inventory -b -m user -a "name=joe_user \
       update_password=always password=\"{{ \"$password\" | password_hash('sha512') }}\""

Output dari perintah di atas:

192.168.1.10 | SUCCESS => {
    "append": false,
    "changed": true,
    "comment": "Joe User",
    "group": 999,
    "home": "/home/joe_user",
    "move_home": false,
    "name": "joe_user",
    "password": "NOT_LOGGING_PASSWORD",
    "shell": "/bin/bash",
    "state": "present",
    "uid": 999
}
slm
sumber
0

Saya tahu bahwa saya terlambat ke pesta, tetapi ada solusi lain yang saya gunakan. Ini mungkin berguna untuk distro yang tidak memiliki --stdinbiner passwd.

- hosts: localhost
  become: True
  tasks:
    - name: Change user password
      shell: "yes '{{ item.pass }}' | passwd {{ item.user }}"
      loop:
       - { pass: 123123, user: foo }
       - { pass: asdf, user: bar }
      loop_control:
        label: "{{ item.user }}"

Label di loop_controlbertanggung jawab untuk mencetak hanya nama pengguna. Seluruh pedoman atau hanya variabel pengguna (yang dapat Anda gunakan vars_files:) harus dienkripsi dengan ansible-vault.

Alex Baranowski
sumber
0

Solusi saya adalah menggunakan pencarian dan menghasilkan kata sandi secara otomatis.

---
- hosts: 'all'
  remote_user: root
  gather_facts: no
  vars:
    deploy_user: deploy
    deploy_password: "{{ lookup('password', '/tmp/password chars=ascii_letters') }}"

  tasks:
    - name: Create deploy user
      user:
        name: "{{ deploy_user }}"
        password: "{{ deploy_password | password_hash('sha512') }}"
alex naumov
sumber
0

Mencoba banyak utilitas termasuk mkpasswd, Python dll. Tetapi sepertinya ada masalah kompatibilitas dengan Ansible dalam membaca nilai HASH yang dihasilkan oleh alat lain. Jadi akhirnya ini bekerja dengan nilai # yang mungkin itu sendiri.

ansible all -i localhost, -m debug -a "msg = {{'yourpasswd' | password_hash ('sha512', 'mysecretsalt')}}"

Playbook -

- name: User creation
  user: 
    name: username  
    uid: UID
    group: grpname
    shell: /bin/bash
    comment: "test user"
    password: "$6$mysecretsalt$1SMjoVXjYf.3sJR3a1WUxlDCmdJwC613.SUD4DOf40ASDFASJHASDFCDDDWERWEYbs8G00NHmOg29E0"
DjangoChained
sumber
-1

Saya benar-benar terlambat ke pesta :) Saya membutuhkan permainan yang memungkinkan yang membuat banyak pengguna lokal dengan kata sandi acak. Ini yang saya dapatkan, menggunakan beberapa contoh dari atas dan menggabungkannya dengan beberapa perubahan.

buat-pengguna-dengan-kata sandi.yml

---
# create_user playbook

- hosts: all
  become: True
  user: root
  vars:
#Create following user
   users:
    - test24
    - test25
#with group
   group: wheel
  roles:
    - create-user-with-password

/roles/create-user-with-password/tasks/main.yml

- name: Generate password for new user
  local_action: shell pwgen -s -N 1 20
  register: user_password
  with_items: "{{ users }}"
  run_once: true

- name: Generate encrypted password
  local_action: shell python -c 'import crypt; print(crypt.crypt( "{{ item.stdout }}", crypt.mksalt(crypt.METHOD_SHA512)))'
  register: encrypted_user_password
  with_items: "{{ user_password.results }}"
  run_once: true

- name: Create new user with group
  user:
    name: "{{ item }}"
    groups: "{{ group }}"
    shell: /bin/bash
    append: yes
    createhome: yes
    comment: 'Created with ansible'
  with_items:
    - "{{ users }}"
  register: user_created

- name: Update user Passwords
  user:
    name: '{{ item.0 }}'
    password: '{{ item.1.stdout }}'
  with_together:
    - "{{ users }}"
    - "{{ encrypted_user_password.results }}"
  when: user_created.changed

- name: Force user to change the password at first login
  shell: chage -d 0 "{{ item }}"
  with_items:
    - "{{ users }}"
  when: user_created.changed

- name: Save Passwords Locally
  become: no
  local_action: copy content={{ item.stdout }} dest=./{{ item.item }}.txt
  with_items: "{{ user_password.results }}"
  when: user_created.changed
Juhani
sumber