semaphore/proxmox_create_admin.yml

97 lines
3.2 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
# 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 /."