Skip to main content

Exemple de Playbook avec UID Dynamique - Playbook 3



1 - Introduction


Ce playbook propose une solution avancée pour gérer la création d'utilisateurs en :

  • Vérifiant l'existence des UIDs
  • Générant dynamiquement des UIDs alternatifs en cas de conflit
  • Utilisant des mots de passe hashés de manière sécurisée

Nous verrons un playbook Ansible amélioré qui :
Vérifie si un UID est déjà utilisé
Génère dynamiquement un nouvel UID si le précédent est pris
Crée les utilisateurs avec un mot de passe sécurisé



2 - Playbook Final : UID Dynamique en Cas de Conflit


- name: Générer des utilisateurs avec des mots de passe hashés
hosts: all

tasks:
- name: Générer un sel sécurisé
ansible.builtin.set_fact:
secure_salt: "{{ lookup('password', '/dev/null chars=ascii_letters,digits length=16') }}"

- name: Vérifier si l'UID existe déjà sur le système
shell: "id -u {{ item.uid }} || echo 'not found'"
register: uid_check
changed_when: false
failed_when: false
loop:
- { username: "alice1", uid: 1001 }
- { username: "bob1", uid: 1002 }
- { username: "charlie1", uid: 1003 }

- name: Générer un UID unique si nécessaire
shell: "shuf -i 2000-65000 -n 1"
register: unique_uid
when: item.stdout is not search('not found')
loop: "{{ uid_check.results }}"

- name: Associer les UID dynamiques aux utilisateurs
set_fact:
user_list: >-
[{% for item in uid_check.results %}
{
"username": "{{ item.item.username }}",
"password": "{{ ('password' ~ loop.index) | password_hash('sha512', secure_salt) }}",
"uid": "{{ unique_uid.results[loop.index0].stdout if item.stdout is not search('not found') else item.item.uid }}"
}
{% if not loop.last %},{% endif %}
{% endfor %}
]
loop: "{{ uid_check.results }}"
loop_control:
extended: true

- name: Créer des utilisateurs avec UID dynamiques si nécessaire
ansible.builtin.user:
name: "{{ item.username }}"
password: "{{ item.password }}"
uid: "{{ item.uid }}"
loop: "{{ user_list }}"


3 - Explication du Playbook


Explication

  1. Vérification des UID existants

    • shell: id -u {{ item.uid }} || echo 'not found'
    • Stocke les résultats dans uid_check.
  2. Génération d'un UID unique si nécessaire

    • Si l'UID est déjà pris (not found absent), un nouvel UID aléatoire entre 2000-65000 est généré via shuf.
  3. Création d'une liste avec les UID corrigés

    • On remplace l'UID existant par un UID aléatoire si nécessaire.
    • user_list est une nouvelle liste d'utilisateurs avec UID corrigés.
  4. Création des utilisateurs

    • ansible.builtin.user crée les utilisateurs avec leurs UID mis à jour.


4 - Avantages


Empêche tout conflit d'UID
Génère un UID unique dynamiquement si nécessaire
Utilise des mots de passe sécurisés avec un sel dynamique


Recommandation

💡 Si vous ne voulez aucun problème d’UID et que l'UID statique n’est pas obligatoire, vous pouvez aussi supprimer uid du ansible.builtin.user et laisser le système gérer.


💡

Avec ce playbook, les utilisateurs sont créés proprement avec un UID garanti unique ! 🚀