[LINUX] Créez plusieurs utilisateurs avec des numéros de série à la fois avec Ansible Playbook

introduction

Lors de la création de plusieurs utilisateurs avec Ansible Playbook, il est normal de définir à l'avance le nom d'utilisateur, l'UID, le nom du groupe, etc. dans la variable de liste et de les créer tous en même temps avec le module utilisateur + boucle.

Cependant, si vous créez trop d'utilisateurs, il est fastidieux de préparer la variable de liste.

J'aurais aimé avoir un livre de jeu qui pourrait rapidement créer des utilisateurs avec des numéros de série, mais j'en ai finalement fait un décent, alors je le laisserai comme un mémorial.

Cas présumé

Créez un grand nombre d'utilisateurs de numéros de série, par exemple pour les développeurs.

environnement

VirtualBox (+ vagrant) CentOS 7.7 ansible 2.9.6

Playbook

Encore une fois, pour rendre l'article plus facile à comprendre, je vais tout lister dans un seul Playbook ʻusercreate.yml`. (Ce n'est pas que je ne connaisse pas les meilleures pratiques. Juste au cas où.)

Tout d'abord, préparez diverses variables au début. Dans cet exemple, nous allons créer des utilisateurs avec des numéros de série de 01 à 20. Voir les commentaires pour une explication détaillée.

usercreate.yml


---
- name: Create many user
  hosts: localhost
  vars:
    #Créez une chaîne de caractères reliant 1 à 20 par une virgule. La fin se termine par une virgule, mais je ferai quelque chose à ce sujet plus tard.
    user_num_data: "{% for n in range(20) %}{{n+1}},{% endfor %}"
    #Divisez la variable créée ci-dessus par une virgule et enregistrez-la dans la variable de liste. Le dernier élément est vide, mais nous ferons quelque chose à ce sujet plus tard.
    user_num: "{{ user_num_data.split(',') }}"
    #Mot de passe initial que l'utilisateur doit créer
    initialpw: zaq12wsx
    # UID/Préfixe GID. J'utiliserai la série 5000.
    pre_id: 50
    #Préfixe du nom d'utilisateur.
    pre_name: devuser
    #C'est un groupe commun qui enregistre tous les utilisateurs à créer.
    common_group: devgroup

Vient ensuite la définition de la tâche. Tout d'abord, créez un groupe commun. Créer avec GID = 5000, numéro 0 non utilisé par l'utilisateur.

usercreate.yml


  tasks:
    - name: Common group is created
      group:
        name: '{{ common_group }}'
        gid: '{{ pre_id }}00'
        state: present

Ensuite, créez un groupe pour chaque utilisateur à créer. Excluez le dernier élément vide en définissant la variable de la liste en boucle sur `` '{{user_num [: -1]}}' '. Ensuite, lorsque vous utilisez un numéro de série pour un nom d'utilisateur, etc., utilisez ʻitem.zfill (2) `pour l'aligner sur deux chiffres.

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

Enfin, créez un utilisateur.

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

En prime, désactivez le mot de passe pour vous inviter à changer le mot de passe initial. Dans la tâche précédente, spécifiez une condition avec quand exécuter uniquement lorsque l'utilisateur a été créé. Spécifiez également le libellé de loop_control pour supprimer la sortie lors de l'exécution de ansible-playbook.

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

Exemple d'exécution

C'est un résultat d'exécution normal.

$ 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

Si vous regardez / etc / passwd, il est magnifiquement créé avec des numéros de série.

$ 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

La même chose s'applique à / 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

Le mot de passe est également expiré.

$ 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

S'il n'y a pas assez d'utilisateurs, vous pouvez réexécuter le playbook en changeant le suivant range (20) en range (40) etc., et les utilisateurs créés ne seront pas affectés et seules les parties supplémentaires seront créées. ..

user_num_data: "{% for n in range(20) %}{{n+1}},{% endfor %}"

Avec cela, même si plusieurs équipes avec des dizaines de membres sont mises en place, ne le manquez pas! est.

Recommended Posts

Créez plusieurs utilisateurs avec des numéros de série à la fois avec Ansible Playbook
Créez plusieurs utilisateurs avec des numéros de série à la fois dans Ansible Playbook: Partie 2
Mettre à jour plusieurs tables à la fois avec pandas to_sql
Convertissez plusieurs fichiers proto à la fois avec python
[Laravel] Un alias qui crée un fichier de migration pour plusieurs tables à la fois.
Remplacez tout d'un coup par sed
Utilisez Matplotlib pour créer plusieurs graphiques linéaires à partir d'un bloc de données à la fois
Envoyez des newsletters en une seule fois avec Gmail
Sortez de plusieurs boucles à la fois