Tạo người dùng và mật khẩu mới với Ansible


103

Tôi có một nhiệm vụ không thể trả lời là tạo một người dùng mới trên ubuntu 12.04;

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

nó hoàn thành như mong đợi nhưng khi tôi đăng nhập với tư cách người dùng đó và cố gắng xử lý bằng mật khẩu tôi đã đặt, nó luôn nói rằng nó không chính xác. Tôi đang làm gì sai?


1
Bạn đang đăng nhập bằng cùng một mật khẩu hoặc khóa ssh? Bạn đã kiểm tra tệp bóng của mình để đảm bảo nội dung của nó như mong đợi chưa? Ngoài ra, của bạn passwordkhông được cho là ở dạng văn bản thuần túy mà phải được băm sẵn.
Mxx

mật khẩu của tôi là bản rõ, tôi có thể không sử dụng nó theo cách đó được không? Tôi không hiểu làm thế nào để mã hóa nó hoặc thực sự cần.
raphael_turtle

Câu trả lời:


101

Nếu bạn đọc hướng dẫn sử dụng Ansible cho usermô-đun , nó sẽ hướng bạn đến kho github Ansible -amples để biết chi tiết cách sử dụng passwordtham số .

Ở đó, bạn sẽ thấy rằng mật khẩu của bạn phải được băm.

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

Nếu playbook hoặc dòng lệnh ansible của bạn có mật khẩu của bạn ở dạng văn bản thuần túy, điều này có nghĩa là hàm băm mật khẩu của bạn được ghi lại trong bóng của bạn tệp là sai. Điều đó có nghĩa là khi bạn cố gắng xác thực bằng mật khẩu của mình, hàm băm của nó sẽ không bao giờ khớp.

Ngoài ra, hãy xem Câu hỏi thường gặp về Ansible về một số sắc thái của tham số mật khẩu và cách sử dụng nó một cách chính xác.


25
Cảm ơn vì tiền hỗ trợ. Tôi chỉ muốn chỉ ra rằng tài liệu mô-đun người dùng được liên kết ở trên khuyên bạn nên sử dụng openssl passwd -salt <salt> -1 <plaintext>để tạo băm mật khẩu, thay vì một lớp lót Python mà bạn có ở trên. Tôi đã gặp một số khó khăn khi nhận đầu ra chính xác từ Python, có thể do sự kém cỏi của bản thân và lệnh openssl hoạt động tốt hơn.
Brendan Wood

6
Làm cách nào để bạn đồng bộ hóa muối được sử dụng với HĐH?
Breedly

5
@Breedly: không cần - muối luôn được lưu trữ như một phần của mật khẩu ($ 1 $ thesalt $ thepasswordhash) có nghĩa là nó có thể di động giữa các hệ điều hành sử dụng cùng một hàm băm
Benjamin Dale

3
Tôi không sử dụng lệnh python này để tạo hàm băm. Nhưng tôi đã tìm thấy hàm băm /etc/shadowsau khi đặt mật khẩu theo cách thủ công passwd <user>.
dokaspar

172

Tôi có thể đã quá muộn để trả lời điều này nhưng gần đây tôi đã phát hiện ra rằng bộ lọc jinja2 có khả năng xử lý việc tạo mật khẩu được mã hóa. Trong của tôi, main.ymltôi đang tạo mật khẩu được mã hóa dưới dạng:

- 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" và "upassword" được chuyển --extra-varsđến playbook và thông báo rằng tôi đã sử dụng bộ lọc jinja2 ở đây để mã hóa mật khẩu đã chuyển.

Tôi đã thêm hướng dẫn bên dưới liên quan đến điều này vào blog của tôi


6
Để tránh mục luôn bị "thay đổi", bạn có thể thêm "muối" bí mật làm tham số thứ 2 cho password_hash.
Michael Wyraz

11
Theo gợi ý của @ MichaelWyraz: thêm thông số "muối" thứ 2 sẽ tránh được "thay đổi". Bạn có thể thiết lập này thông qua một biến, ví dụ password={{upassword|password_hash('sha512', upassword_salt)}}. Điều đó cho phép bạn đặt muối vào một kho biến số , như bạn có lẽ cũng sẽ làm upasswordnhư vậy, tránh cả hai nhiệm vụ.yml.
user85461 14/02/16

Tôi cũng sẽ áp dụng kiểm tra trạng thái của @ bbaassssiiee và thêm update_password: on_createmô-đun người dùng vào câu trả lời này để ngăn mật khẩu hết hạn cho những người dùng đã tạo.
madhead

Cảm ơn vì ví dụ tuyệt vời của bạn, điều này đã đưa tôi đi đúng hướng. Tuy nhiên, tôi phải làm thêm một số việc để nó hoạt động trên máy mac có phiên bản 2.8.2 ansible. Trước hết, trên mac không thể sử dụng crypt do đó bắt buộc phải cài đặt thư viện passlib với pip install passlib. Sau đó, để có thể sử dụng một hầm mã hóa chuỗi inline tôi đã phải định dạng lại với việc bổ sung sau đây: password: {{ upassword | string | password_hash('sha512') }}. Điều này tránh được thông báo lỗisecret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode
Michael Aicher

mặc dù đã sử dụng phương pháp này để đặt mật khẩu: "{{my_password | string | password_hash ('sha512')}}" Tôi vẫn nhận được - [CẢNH BÁO]: Mật khẩu nhập có vẻ như chưa được băm. Đối số 'mật khẩu' phải được mã hóa để mô-đun này hoạt động bình thường.
openCivilisation

46

Tôi muốn đề xuất một giải pháp khác:

- 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

Tại sao nó tốt hơn? Giống như đã được lưu ý ở đây, các vở kịch của Ansible nên được đánh giá cao. Bạn nên nghĩ chúng không phải là một chuỗi hành động theo kiểu mệnh lệnh, mà giống như một trạng thái mong muốn, kiểu khai báo. Kết quả là bạn sẽ có thể chạy nó nhiều lần và nhận được cùng một kết quả, cùng một trạng thái máy chủ.

Tất cả điều này nghe có vẻ tuyệt vời, nhưng có một số sắc thái. Một trong số đó là quản lý người dùng. "Trạng thái mong muốn" có nghĩa là mỗi khi bạn chạy một vở kịch tạo người dùng, anh ta sẽ được cập nhật để khớp chính xác với trạng thái đó. Bằng cách "cập nhật", tôi có nghĩa là mật khẩu của anh ấy cũng sẽ được thay đổi. Nhưng hầu hết có lẽ nó không phải là thứ bạn cần. Thông thường, bạn chỉ cần tạo người dùng, đặt và hết hạn mật khẩu của anh ấy một lần, các lần chơi tiếp theo không nên cập nhật mật khẩu của anh ấy.

May mắn thay, Ansible có update_passwordthuộc tính trong usermô-đun giải quyết vấn đề này. Kết hợp điều này với các biến đã đăng ký, bạn cũng có thể hết hạn mật khẩu của mình chỉ khi người dùng thực sự được cập nhật.

Lưu ý rằng nếu bạn thay đổi trình bao của người dùng theo cách thủ công (giả sử, bạn không thích trình bao mà quản trị viên độc ác buộc trong trò chơi của anh ta) thì người dùng sẽ được cập nhật, do đó mật khẩu của anh ta sẽ hết hạn.

Cũng lưu ý cách bạn có thể dễ dàng sử dụng mật khẩu ban đầu bằng văn bản thuần túy trong các lượt chơi. Không cần mã hóa chúng ở nơi khác và dán các hàm băm, bạn có thể sử dụng bộ lọc Jinja2 cho việc đó. Tuy nhiên, đây có thể là một lỗ hổng bảo mật nếu ai đó tình cờ đăng nhập trước khi bạn đăng nhập.


3
Tôi không thể tìm được giải pháp khác phù hợp với mình. Tuy nhiên, bạn trả lời là đơn giản và hiệu quả. Tôi muốn cho bạn 5 phiếu bầu, nếu tôi có thể.
leesei

Tôi không muốn mật khẩu của tôi để được mã hóa cứng như thế :( Có thể lấy nó ra khỏi ansible-vault và bơm nó ở đây làm tổ như thế nào? "{{ '{{vaulted_password}}' | password_hash('sha512') }}"Dường như không làm việc ...
dokaspar

Bạn đã thử {{ vaulted_password | password_hash('sha512') }}, đâu vaulted_passwordlà chìa khóa cho giá trị trong vault?
madhead

update_password: on_createdường như không hoạt động (có một lỗi mở về nó từ năm 2017), vì vậy mật khẩu sẽ thay đổi bất cứ khi nào có thay đổi trạng thái trên người dùng.
Diti

11

Các Ansible 'user' mô-đun quản lý người dùng, trong idempotent cách. Trong playbook bên dưới, tác vụ đầu tiên khai báo trạng thái = hiện tại cho người dùng. Lưu ý rằng ' register: newuser ' trong hành động đầu tiên giúp hành động thứ hai xác định xem người dùng là mới (newuser.changed == True) hay hiện có ( newuser.changed==False), để chỉ tạo mật khẩu một lần.

Sách chơi Ansible có:

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

Chỉ có một giải pháp phù hợp với tôi với mật khẩu vault. Cảm ơn bạn rất nhiều.
Denis Savenko

ít nhất là các bản phân phối dựa trên Debian gần đây dường như không hỗ trợ tùy chọn GNU dài "--stdin" cho tệp nhị phân mật khẩu.
XXL

10

thử như thế này

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"

2
Tôi thích giải pháp này vì nó cho phép nhập mật khẩu khi tập lệnh chạy. Giải pháp tốt cho tập lệnh bootstrap không nên chạy mọi lúc. Đối với Ubuntu, tôi đã sử dụng "sha512_crypt".
Gunnar

6

Mục đích của vai trò trong câu trả lời này là tạo mật khẩu ngẫu nhiên cho new_user_name và mật khẩu hết hạn ngay lập tức. New_user_name được yêu cầu thay đổi mật khẩu trong lần đăng nhập đầu tiên của mình.

create_user.yml:

---
# create_user playbook

- hosts: your_host_group
  become: True
  user: ansible

  roles:
    - create_user

role / create_user / task / 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

Khi bạn muốn tạo người dùng mới:

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

3

Đây là cách dễ dàng:

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

shell: sẽ luôn tạo ra một thay đổi được báo cáo.
bbaassssiiee

@datasmid, bạn có thể thêm no_log: True option docs.ansible.com/ansible/…
Phill Pafford

3

Đây là cách nó làm việc cho tôi

- 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

3

Để hoàn thiện, tôi sẽ đăng lệnh đặc biệt bằng cách sử dụng ansible vì cũng có một lệnh bắt ở đó.

Trước tiên, hãy thử tạo mật khẩu được mã hóa bằng tiện ích mkpasswd có sẵn trên hầu hết các hệ thống Linux:

mkpasswd --method=SHA-512

Sau đó, hãy thử lệnh ansible ad-hock:

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

Nhưng hãy chắc chắn rằng:

  1. Lệnh nằm trong dấu nháy đơn và KHÔNG được kép nếu không mật khẩu của bạn sẽ không bao giờ hoạt động
  2. Bạn chạy nó với --sudohoặc bạn gặp lỗi như ( useradd: cannot lock /etc/passwd; try again later)

cảm ơn người bạn đời, tôi đặc biệt đang tìm kiếm phiên bản adhoc và gặp phải vấn đề báo giá rất giống như bạn đã đề cập
alexakarpov


2

Kết hợp một số giải pháp từ trên, tôi đã tạo một playbook tự động tạo các hàm băm mật khẩu chính xác dựa trên mật khẩu văn bản rõ được lưu trữ trong tệp vault cục bộ, được mã hóa:

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

Chạy lệnh này bằng cách sử dụng tùy chọn "--ask-vault-pass" để giải mã tệp vault của bạn (xem ansible-vault để biết thông tin về cách quản lý một vault được mã hóa).


2

Cách tạo mật khẩu được mã hóa để chuyển tới tác vụ passwordvar tới Ansible user(từ nhận xét của @Brendan Wood):

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

Kết quả sẽ như sau:

$1$some_pla$lmVKJwdV3Baf.o.F0OOy71

Ví dụ về usernhiệm vụ:

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

UPD: crypt sử dụng SHA-512 xem tại đâyđây :

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/

Ruby

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

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

1
Đây không phải là tạo ra một mật khẩu băm md5? Đó không phải là không an toàn?
Đánh dấu

2

Bạn có thể sử dụng ansible-vault để sử dụng khóa bí mật trong sách phát. Xác định mật khẩu của bạn trong yml.

Ví dụ. pass: bí mật hoặc

user:
  pass: secret
  name: fake

mã hóa tệp bí mật của bạn bằng:

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

ansible sẽ hỏi mật khẩu để mã hóa nó. (Tôi sẽ giải thích cách sử dụng thẻ đó)

Và sau đó bạn có thể sử dụng các biến của mình ở nơi bạn muốn. Không ai có thể đọc chúng nếu không có vault-key.

Cách sử dụng khóa Vault:

thông qua truyền đối số khi chạy playbook.

--ask-vault-pass: secret

hoặc bạn có thể lưu vào tệp như password.txt và ẩn ở đâu đó. (hữu ích cho người dùng CI)

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

Trong trường hợp của bạn: bao gồm vars yml và sử dụng các biến của bạn.

- include_vars: /path/credential.yml

  - name: Add deployment user
    action: user name={{user.name}} password={{user.pass}}

Tôi đã thử chính xác điều này, và nó không hoạt động. Tôi tin rằng, đó là vì password={{user.pass}}sẽ mở rộng để bao gồm mật khẩu thực, trong khi ansible mong đợi hàm băm ở đó.
texnic

2

Tạo mật khẩu ngẫu nhiên cho người dùng

trước tiên cần xác định biến người dùng sau đó làm theo bên dưới

nhiệm vụ:

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

1

Câu trả lời của Mxx là đúng nhưng bạn crypt.crypt()phương pháp python không an toàn khi có các hệ điều hành khác nhau (liên quan đến thuật toán băm glibc được sử dụng trên hệ thống của bạn.)

Ví dụ: Nó sẽ không hoạt động nếu bạn tạo mã băm của mình từ MacOS và chạy một playbook trên linux. Trong trường hợp này, bạn có thể sử dụng passlib ( pip install passlibđể cài đặt cục bộ).

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

1

Cả hai giải pháp đều không hoạt động trực tiếp trên máy Mac điều khiển Ubuntu của tôi. Vì vậy, vì lợi ích của người khác, kết hợp câu trả lời Mxx và JoelB, đây là giải pháp Python 3 hiện tại:

pip3 install passlib

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

Kết quả sẽ là $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI., như trong câu trả lời của Mxx.

Vẫn tốt hơn , hãy sử dụng SHA512 thay vì MD5:

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

Kết quả:

$ 6 $ vòng = 656000 $ SomeSalt $ oYpmnpZahIsvn5FK8g4bDFEAmGpEN114Fe6Ko4HvinzFaz5Rq2UXQxoJZ9ZQyQoi9zaBo3gBH / FEAov3FHv48


1

Tôi đã tạo ansible-playbook cho phép bạn tạo tài khoản linux cho phép xác thực mật khẩu.

Xem CreateLinuxAccountWithAnsible .

Mật khẩu băm được tạo bằng mkpasswdlệnh. Tôi đã cung cấp các cách cài đặt mkpasswdtrên các hệ điều hành khác nhau.

Dưới đây là các bước cần thiết để sử dụng tập lệnh của tôi:

  1. Thay thế <your_user_name><your_password>bên trong run.shbằng tên người dùng và mật khẩu mong muốn của bạn.

  2. Thay đổi thông tin kết nối inventoryđể ansible có thể kết nối với máy tạo người dùng.

  3. Chạy ./run.shđể thực thi tập lệnh.


1
Tệp không còn trên GitHub nữa.
Janus

0

Nếu bạn muốn thực hiện điều này dưới dạng lệnh đặc biệt Ansible, bạn có thể thực hiện như sau:

$ 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') }}\""

Đầu ra từ lệnh trên:

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
}

0

Tôi biết rằng tôi đến muộn bữa tiệc, nhưng có một giải pháp khác mà tôi đang sử dụng. Nó có thể hữu ích cho các bản phân phối không có --stdintrong tệp nhị phân mật khẩu.

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

Nhãn ở loop_controlcó trách nhiệm in ấn chỉ tên người dùng. Toàn bộ playbook hoặc chỉ các biến người dùng (bạn có thể sử dụng vars_files:) phải được mã hóa bằng ansible-vault.


0

Giải pháp của tôi là sử dụng tra cứu và tạo mật khẩu tự động.

---
- 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') }}"

0

Đã thử nhiều tiện ích bao gồm mkpasswd, Python, v.v. Nhưng có vẻ như có một số vấn đề tương thích với Ansible trong việc đọc các giá trị HASH do các công cụ khác tạo ra. Vì vậy, cuối cùng nó đã hoạt động bởi chính giá trị ansible #.

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"

-1

Chà, tôi hoàn toàn muộn để dự tiệc :) Tôi có nhu cầu về một trò chơi có thể kiểm soát được tạo ra nhiều người dùng cục bộ có mật khẩu randoms. Đây là những gì tôi đã nghĩ ra, sử dụng một số ví dụ ở trên và ghép chúng lại với một số thay đổi.

create-user-with-password.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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.