semaphore/proxmox_create_admin.yml

98 lines
3.0 KiB
YAML

---
- name: Créer un utilisateur admin Proxmox via SSH (pve/pam)
hosts: proxmox
gather_facts: false
become: true
become_user: root
serial: 5
vars_prompt:
- name: new_user
prompt: "Nouvel utilisateur (ex: adminops)"
private: no
- name: new_realm
prompt: "Realm (pve ou pam)"
default: "pve"
private: no
- name: new_password
prompt: "Mot de passe du nouvel utilisateur"
private: yes
vars:
userid: "{{ new_user }}@{{ new_realm }}"
tasks:
# --- 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 /."