Wenn Sie mehrere Benutzer mit Ansible Playbook erstellen, ist es normal, den Benutzernamen, die UID, den Gruppennamen usw. im Voraus in der Listenvariablen festzulegen und alle gleichzeitig mit dem Benutzermodul + Schleife zu erstellen.
Wenn Sie jedoch zu viele Benutzer erstellen, ist es mühsam, die Listenvariable vorzubereiten.
Ich wünschte, ich hätte ein Spielbuch, mit dem Benutzer schnell Seriennummern erstellen könnten, aber ich habe endlich ein anständiges erstellt, sodass ich es als Denkmal belassen werde.
Erstellen Sie eine große Anzahl von Benutzern mit Seriennummer, z. B. für Entwickler.
VirtualBox (+ vagrant) CentOS 7.7 ansible 2.9.6
Playbook
Um den Artikel verständlicher zu machen, werde ich alles in einem Playbook "usercreate.yml" auflisten. (Es ist nicht so, dass ich die Best Practices nicht kenne. Nur für den Fall.)
Bereiten Sie zunächst verschiedene Variablen vor. In diesem Beispiel erstellen wir Benutzer mit Seriennummern von 01 bis 20. Eine ausführliche Erklärung finden Sie in den Kommentaren.
usercreate.yml
---
- name: Create many user
hosts: localhost
vars:
#Erstellen Sie eine Zeichenfolge, die 1 bis 20 mit einem Komma verbindet. Das Ende endet mit einem Komma, aber ich werde später etwas dagegen tun.
user_num_data: "{% for n in range(20) %}{{n+1}},{% endfor %}"
#Teilen Sie die oben erstellte Variable durch ein Komma und registrieren Sie sie in der Listenvariablen. Das letzte Element ist leer, aber wir werden später etwas dagegen tun.
user_num: "{{ user_num_data.split(',') }}"
#Erstes Passwort für den Benutzer zum Erstellen
initialpw: zaq12wsx
# UID/GID-Präfix. Ich werde die 5000er Serie verwenden.
pre_id: 50
#Benutzername Präfix.
pre_name: devuser
#Es ist eine gemeinsame Gruppe, die alle zu erstellenden Benutzer registriert.
common_group: devgroup
Als nächstes folgt die Aufgabendefinition. Erstellen Sie zunächst eine gemeinsame Gruppe. Erstellen Sie mit GID = 5000, Nummer 0, die vom Benutzer nicht verwendet wird.
usercreate.yml
tasks:
- name: Common group is created
group:
name: '{{ common_group }}'
gid: '{{ pre_id }}00'
state: present
Erstellen Sie als Nächstes eine Gruppe für jeden zu erstellenden Benutzer. Schließen Sie das letzte leere Element aus, indem Sie die Schleifenlistenvariable auf "{{user_num [: -1]}}" setzen. Wenn Sie dann eine Seriennummer für den Benutzernamen usw. verwenden, verwenden Sie "item.zfill (2)", um sie auf zwei Ziffern auszurichten.
usercreate.yml
- name: Groups are created
group:
name: '{{ pre_name }}{{ item.zfill(2) }}'
gid: '{{ pre_id }}{{ item.zfill(2) }}'
state: present
with_items:
- '{{ user_num[:-1] }}'
Erstellen Sie schließlich einen Benutzer.
usercreate.yml
- name: Users are created
user:
name: '{{ pre_name }}{{ item.zfill(2) }}'
group: '{{ pre_name }}{{ item.zfill(2) }}'
groups: '{{ pre_name }}{{ item.zfill(2) }}, {{ common_group }}'
uid: '{{ pre_id }}{{ item.zfill(2) }}'
state: present
password: "{{ initialpw | password_hash('sha512') }}"
update_password: on_create
with_items:
- '{{ user_num[:-1] }}'
register: usercreated
Deaktivieren Sie als Bonus das Passwort, um Sie aufzufordern, das ursprüngliche Passwort zu ändern. Geben Sie in der vorherigen Aufgabe eine Bedingung an, bei der nur ausgeführt werden soll, wenn der Benutzer erstellt wurde. Geben Sie außerdem die Bezeichnung loop_control an, um die Ausgabe beim Ausführen von ansible-playbook zu unterdrücken.
usercreate.yml
- name: Passwords are expired
shell: |
passwd -e '{{ item.invocation.module_args.name }}'
with_items:
- '{{ usercreated.results }}'
when:
- item.changed
- item.invocation.module_args.state == "present"
loop_control:
label: "{{ item.invocation.module_args.name }}"
Es ist ein normales Ausführungsergebnis.
$ ansible-playbook -i inventories/test usercreate.yml
PLAY [Create many user] ************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [localhost]
TASK [Common group is created] *****************************************************************************************
changed: [localhost]
TASK [Groups are created] **********************************************************************************************
changed: [localhost] => (item=1)
changed: [localhost] => (item=2)
changed: [localhost] => (item=3)
changed: [localhost] => (item=4)
changed: [localhost] => (item=5)
changed: [localhost] => (item=6)
changed: [localhost] => (item=7)
changed: [localhost] => (item=8)
changed: [localhost] => (item=9)
changed: [localhost] => (item=10)
changed: [localhost] => (item=11)
changed: [localhost] => (item=12)
changed: [localhost] => (item=13)
changed: [localhost] => (item=14)
changed: [localhost] => (item=15)
changed: [localhost] => (item=16)
changed: [localhost] => (item=17)
changed: [localhost] => (item=18)
changed: [localhost] => (item=19)
changed: [localhost] => (item=20)
TASK [Users are created] ***********************************************************************************************
changed: [localhost] => (item=1)
changed: [localhost] => (item=2)
changed: [localhost] => (item=3)
changed: [localhost] => (item=4)
changed: [localhost] => (item=5)
changed: [localhost] => (item=6)
changed: [localhost] => (item=7)
changed: [localhost] => (item=8)
changed: [localhost] => (item=9)
changed: [localhost] => (item=10)
changed: [localhost] => (item=11)
changed: [localhost] => (item=12)
changed: [localhost] => (item=13)
changed: [localhost] => (item=14)
changed: [localhost] => (item=15)
changed: [localhost] => (item=16)
changed: [localhost] => (item=17)
changed: [localhost] => (item=18)
changed: [localhost] => (item=19)
changed: [localhost] => (item=20)
TASK [Passwords are expired] *******************************************************************************************
changed: [localhost] => (item=devuser01)
changed: [localhost] => (item=devuser02)
changed: [localhost] => (item=devuser03)
changed: [localhost] => (item=devuser04)
changed: [localhost] => (item=devuser05)
changed: [localhost] => (item=devuser06)
changed: [localhost] => (item=devuser07)
changed: [localhost] => (item=devuser08)
changed: [localhost] => (item=devuser09)
changed: [localhost] => (item=devuser10)
changed: [localhost] => (item=devuser11)
changed: [localhost] => (item=devuser12)
changed: [localhost] => (item=devuser13)
changed: [localhost] => (item=devuser14)
changed: [localhost] => (item=devuser15)
changed: [localhost] => (item=devuser16)
changed: [localhost] => (item=devuser17)
changed: [localhost] => (item=devuser18)
changed: [localhost] => (item=devuser19)
changed: [localhost] => (item=devuser20)
PLAY RECAP *************************************************************************************************************
localhost : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Wenn Sie sich / etc / passwd ansehen, wird es wunderschön mit Seriennummern erstellt.
$ grep devuser /etc/passwd
devuser01:x:5001:5001::/home/devuser01:/bin/bash
devuser02:x:5002:5002::/home/devuser02:/bin/bash
devuser03:x:5003:5003::/home/devuser03:/bin/bash
devuser04:x:5004:5004::/home/devuser04:/bin/bash
devuser05:x:5005:5005::/home/devuser05:/bin/bash
devuser06:x:5006:5006::/home/devuser06:/bin/bash
devuser07:x:5007:5007::/home/devuser07:/bin/bash
devuser08:x:5008:5008::/home/devuser08:/bin/bash
devuser09:x:5009:5009::/home/devuser09:/bin/bash
devuser10:x:5010:5010::/home/devuser10:/bin/bash
devuser11:x:5011:5011::/home/devuser11:/bin/bash
devuser12:x:5012:5012::/home/devuser12:/bin/bash
devuser13:x:5013:5013::/home/devuser13:/bin/bash
devuser14:x:5014:5014::/home/devuser14:/bin/bash
devuser15:x:5015:5015::/home/devuser15:/bin/bash
devuser16:x:5016:5016::/home/devuser16:/bin/bash
devuser17:x:5017:5017::/home/devuser17:/bin/bash
devuser18:x:5018:5018::/home/devuser18:/bin/bash
devuser19:x:5019:5019::/home/devuser19:/bin/bash
devuser20:x:5020:5020::/home/devuser20:/bin/bash
Gleiches gilt für / etc / group.
$ grep dev /etc/group
devgroup:x:5000:devuser01,devuser02,devuser03,devuser04,devuser05,devuser06,devuser07,devuser08,devuser09,devuser10,devuser11,devuser12,devuser13,devuser14,devuser15,devuser16,devuser17,devuser18,devuser19,devuser20
devuser01:x:5001:devuser01
devuser02:x:5002:devuser02
devuser03:x:5003:devuser03
devuser04:x:5004:devuser04
devuser05:x:5005:devuser05
devuser06:x:5006:devuser06
devuser07:x:5007:devuser07
devuser08:x:5008:devuser08
devuser09:x:5009:devuser09
devuser10:x:5010:devuser10
devuser11:x:5011:devuser11
devuser12:x:5012:devuser12
devuser13:x:5013:devuser13
devuser14:x:5014:devuser14
devuser15:x:5015:devuser15
devuser16:x:5016:devuser16
devuser17:x:5017:devuser17
devuser18:x:5018:devuser18
devuser19:x:5019:devuser19
devuser20:x:5020:devuser20
Das Passwort ist ebenfalls abgelaufen.
$ sudo chage -l devuser01
Last password change : password must be changed
Password expires : password must be changed
Password inactive : password must be changed
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
Wenn nicht genügend Benutzer vorhanden sind, können Sie das Playbook erneut ausführen, indem Sie den folgenden Bereich (20) in Bereich (40) usw. ändern. Die erstellten Benutzer sind davon nicht betroffen und es werden nur die zusätzlichen Teile erstellt. ..
user_num_data: "{% for n in range(20) %}{{n+1}},{% endfor %}"
Verpassen Sie es nicht, auch wenn mehrere Teams mit Dutzenden von Mitgliedern aufgestellt sind! ist.