--- - name: Créer un utilisateur admin Proxmox via SSH (pve/pam) #hosts: Proxmox gather_facts: false become: true become_user: root serial: 5 # Les variables new_user, new_realm et new_password seront fournies # par Semaphore via des Prompts de template. vars: new_realm: "{{ new_realm | default('pve') }}" # valeur par défaut userid: "{{ new_user }}@{{ new_realm }}" tasks: - name: Vérifier que les variables obligatoires sont renseignées assert: that: - new_user is defined and new_user | length > 0 - new_password is defined and new_password | length > 0 fail_msg: "Les variables new_user et new_password doivent être fournies (Prompts Semaphore)." # --- Liste des utilisateurs en JSON (forcer le format) --- - name: Liste des utilisateurs (JSON) command: pvesh get /access/users --output-format json register: users_json changed_when: false - name: Parser la liste des users en toute sécurité set_fact: users_list: "{{ (users_json.stdout | default('[]')) | from_json }}" - name: Déterminer si l'utilisateur existe déjà set_fact: user_exists: "{{ users_list | selectattr('userid','equalto', userid) | list | length > 0 }}" # --- Realm pve : création directe avec mot de passe --- - name: Créer l'utilisateur (realm pve) shell: > pveum user add {{ userid | quote }} --password {{ new_password | quote }} --comment "Compte créé par Ansible" when: not user_exists and new_realm == 'pve' no_log: true # --- Realm pam : créer l'utilisateur Linux + déclarer dans Proxmox --- - name: Créer l'utilisateur Linux (realm pam) user: name: "{{ new_user }}" password: "{{ new_password | password_hash('sha512') }}" shell: /bin/bash create_home: true when: new_realm == 'pam' - name: Déclarer l'utilisateur PAM à Proxmox shell: > pveum user add {{ userid | quote }} --comment "Compte PAM créé par Ansible" when: not user_exists and new_realm == 'pam' no_log: true - name: Activer l'utilisateur (au cas où) shell: pveum user modify {{ userid | quote }} --enable 1 changed_when: false # --- ACL Administrator sur / (idempotent) --- - name: Récupérer les ACL existantes (JSON) command: pvesh get /access/acl --output-format json register: acls_json changed_when: false - name: Parser les ACL set_fact: acls_list: "{{ (acls_json.stdout | default('[]')) | from_json }}" - name: Vérifier si l'ACL Administrator sur / existe déjà set_fact: has_admin_acl: >- {{ acls_list | selectattr('path','equalto','/') | selectattr('ugid','equalto', userid) | selectattr('roleid','equalto','Administrator') | list | length > 0 }} - name: Attribuer le rôle Administrator sur / shell: > pveum acl modify / -user {{ userid | quote }} -role Administrator -propagate 1 when: not has_admin_acl no_log: true - name: Résumé debug: msg: "Sur {{ inventory_hostname }} : {{ userid }} présent et rôle Administrator appliqué sur /."