2026-06-24 20:17:46 -04:00
|
|
|
---
|
|
|
|
|
- name: Cloner une VM Debian depuis le modele Proxmox
|
|
|
|
|
hosts: localhost
|
|
|
|
|
connection: local
|
|
|
|
|
gather_facts: false
|
|
|
|
|
become: false
|
|
|
|
|
|
2026-07-01 15:38:42 -04:00
|
|
|
vars:
|
|
|
|
|
# Config Proxmox de l'instance : on cherche dans l'inventaire de l'instance,
|
|
|
|
|
# quel que soit son nom (lab > principal > production). Compatible « par instance ».
|
|
|
|
|
setops_inventaires: [lab, principal, production]
|
Mise en conformité prouvable : registre d'affirmations + make prouver
Le dépôt fait / explique / prouve ce qu'il affirme, vérifiable en une commande.
- Phase 1 : docs/audit/affirmations.md — 54 affirmations publiques tracées vers
une commande de preuve et un statut (✅/🟡/❌/⚪).
- Phase 2 : CLAUDE.md réduit à un pointeur mince ; contradiction SSH levée (le
code applique déjà PasswordAuthentication no + AuthenticationMethods publickey,
conforme à AGENTS.md) ; section AGENTS « Codex » → « agents IA ».
- Phase 3 : parcours démarrage réparé (QUICKSTART renvoyait à un modèle absent,
chemins de voûte faux, commandes make périmées) ; make verifier vert
(ansible-lint 33 → 0 : site.yml généré nommé, pipefail, name[template]) ;
voûte Proxmox unifiée lue par le clonage (all/vault.yml).
- Phase 4 : make prouver → docs/audit/preuve-<date>.md, harnais rejouable qui
rappelle l'outillage existant (aucune validation réimplémentée).
- Phase 5 : parcours QUICKSTART prouvé hors-ligne sur le socle ; modèle socle
rendu valide (autorite interne → auto-heberge) ; split-brain d'inventaire
corrigé (repli sur le répertoire existant, pas principal/).
make prouver : 15 OK, 0 échec, 1 sautée (voûte). ansible-lint : 0 failure.
Écarts découverts en cours de traitement (AFF-097..100) : tous résolus.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 19:53:18 -04:00
|
|
|
# Voute Proxmox : la voute UNIFIEE de l'instance (all/vault.yml, ou `make config`
|
|
|
|
|
# ecrit le token) est autoritaire ; `proxmox.vault.yml` reste accepte en compat
|
|
|
|
|
# legacy. all/vault.yml en dernier => il l'emporte s'il definit les memes cles.
|
|
|
|
|
setops_gv_proxmox: [proxmox.yml, proxmox.vault.yml, proxmox.local.yml, all/vault.yml]
|
intégrations : le rôle déclare sa politique ; le cluster passe à l'hébergeur
Deux corrections de propriété, l'une dans le plan, l'autre dans les intrants.
1. Intégrations universelles (D-33/D-34, P26)
Le plan portait 57 lignes d'intégration écrites à la main, dont 28 disaient oui à
quelque chose de vrai pour tous les hôtes. Elles n'existaient que pour être
oubliées — et elles l'avaient été : dans Chezlepro, backup-01 et infra-pki-01
n'étaient ni supervisés, ni journalisés, ni certifiés.
Le rôle déclare désormais sa politique une fois, dans meta/integration.yml ; le
plan ne garde que les vrais choix et refuse la recopie. Les exemptions se
dérivent du service rendu (sauf_role), jamais d'un nom d'hôte : l'AC ne s'enrôle
pas auprès d'elle-même, et l'exemption suit step-ca si on le déplace.
Une seule fonction de résolution — integrations_de() — lue par l'inventaire, la
voûte et le panneau. Sans le passage par la voûte, les secrets des intégrations
universelles auraient cessé d'être exigés et P18 serait passé au vert sur une
voûte incomplète.
Vérifié : diff vide sur Technolibre (la politique reproduit exactement les 41
lignes retirées) ; sur Chezlepro, exactement les groupes manquants, et pas
client_pki sur infra-pki-01.
2. Vue Intégrations : la matrice
La fiche montrait les intégrations d'UN serveur ; le trou de Chezlepro n'a pas
été trouvé par le panneau mais par le devis de pare-feu. Matrice serveurs x
intégrations : colonnes de politique en lecture seule, facultatives cochables sur
place, ligne de couverture n/N qui rend le motif visible sans le juger.
3. Propriété des intrants (D-35/D-36, P27)
Le cluster Proxmox appartient à l'hébergeur, comme sa fabric et sa frontière.
Recopié chez chaque tenant, son inventaire avait déjà divergé : deux listes de
stockages contradictoires pour le même matériel. API/nœuds/stockages/ponts vont
dans proxmox-hebergeur.yml, à côté d'underlay.yml, dont le chemin se dérive —
l'hébergeur reste non déclaré (D-17). Restent au tenant son golden template et
ses défauts de placement.
Le panneau nomme désormais le propriétaire de chaque section : éditer une section
« hébergeur » vaut pour tous ses tenants, et l'écran ne le disait pas.
26 preuves OK, 0 échec. --syntax-check des deux playbooks Proxmox.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 14:09:22 -04:00
|
|
|
# Le CLUSTER appartient a l'HEBERGEUR (API, noeuds, stockages, ponts). Son fichier
|
|
|
|
|
# vit dans le depot de l'hebergeur, que le symlink `underlay.yml` designe deja
|
|
|
|
|
# (D-14/D-17) : on en DERIVE le chemin plutot que de redeclarer l'hebergeur. Absent
|
|
|
|
|
# (depot sans underlay monte), le `stat` echoue simplement et rien n'est charge.
|
|
|
|
|
setops_proxmox_hebergeur: "{{ (playbook_dir ~ '/../../underlay.yml') | realpath | dirname }}/proxmox-hebergeur.yml"
|
2026-07-01 15:38:42 -04:00
|
|
|
|
2026-06-24 20:17:46 -04:00
|
|
|
tasks:
|
|
|
|
|
- name: Verifier les fichiers de variables Proxmox optionnels
|
|
|
|
|
ansible.builtin.stat:
|
2026-07-01 15:38:42 -04:00
|
|
|
path: "{{ playbook_dir }}/../../instance/inventories/{{ item.0 }}/group_vars/{{ item.1 }}"
|
|
|
|
|
loop: "{{ setops_inventaires | product(setops_gv_proxmox) | list }}"
|
|
|
|
|
loop_control:
|
|
|
|
|
label: "{{ item.0 }}/{{ item.1 }}"
|
2026-06-24 20:17:46 -04:00
|
|
|
register: proxmox_fichiers_variables
|
|
|
|
|
|
|
|
|
|
- name: Charger les variables Proxmox non sensibles disponibles
|
|
|
|
|
ansible.builtin.include_vars:
|
|
|
|
|
file: "{{ item.stat.path }}"
|
|
|
|
|
loop: "{{ proxmox_fichiers_variables.results }}"
|
|
|
|
|
when:
|
|
|
|
|
- item.stat.exists
|
|
|
|
|
- item.stat.path is not search('vault')
|
|
|
|
|
|
intégrations : le rôle déclare sa politique ; le cluster passe à l'hébergeur
Deux corrections de propriété, l'une dans le plan, l'autre dans les intrants.
1. Intégrations universelles (D-33/D-34, P26)
Le plan portait 57 lignes d'intégration écrites à la main, dont 28 disaient oui à
quelque chose de vrai pour tous les hôtes. Elles n'existaient que pour être
oubliées — et elles l'avaient été : dans Chezlepro, backup-01 et infra-pki-01
n'étaient ni supervisés, ni journalisés, ni certifiés.
Le rôle déclare désormais sa politique une fois, dans meta/integration.yml ; le
plan ne garde que les vrais choix et refuse la recopie. Les exemptions se
dérivent du service rendu (sauf_role), jamais d'un nom d'hôte : l'AC ne s'enrôle
pas auprès d'elle-même, et l'exemption suit step-ca si on le déplace.
Une seule fonction de résolution — integrations_de() — lue par l'inventaire, la
voûte et le panneau. Sans le passage par la voûte, les secrets des intégrations
universelles auraient cessé d'être exigés et P18 serait passé au vert sur une
voûte incomplète.
Vérifié : diff vide sur Technolibre (la politique reproduit exactement les 41
lignes retirées) ; sur Chezlepro, exactement les groupes manquants, et pas
client_pki sur infra-pki-01.
2. Vue Intégrations : la matrice
La fiche montrait les intégrations d'UN serveur ; le trou de Chezlepro n'a pas
été trouvé par le panneau mais par le devis de pare-feu. Matrice serveurs x
intégrations : colonnes de politique en lecture seule, facultatives cochables sur
place, ligne de couverture n/N qui rend le motif visible sans le juger.
3. Propriété des intrants (D-35/D-36, P27)
Le cluster Proxmox appartient à l'hébergeur, comme sa fabric et sa frontière.
Recopié chez chaque tenant, son inventaire avait déjà divergé : deux listes de
stockages contradictoires pour le même matériel. API/nœuds/stockages/ponts vont
dans proxmox-hebergeur.yml, à côté d'underlay.yml, dont le chemin se dérive —
l'hébergeur reste non déclaré (D-17). Restent au tenant son golden template et
ses défauts de placement.
Le panneau nomme désormais le propriétaire de chaque section : éditer une section
« hébergeur » vaut pour tous ses tenants, et l'écran ne le disait pas.
26 preuves OK, 0 échec. --syntax-check des deux playbooks Proxmox.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 14:09:22 -04:00
|
|
|
- name: Localiser le fichier Proxmox de l'hebergeur
|
|
|
|
|
ansible.builtin.stat:
|
|
|
|
|
path: "{{ setops_proxmox_hebergeur }}"
|
|
|
|
|
register: proxmox_fichier_hebergeur
|
|
|
|
|
|
|
|
|
|
- name: Charger le cluster de l'hebergeur (autoritaire sur ses propres cles)
|
|
|
|
|
ansible.builtin.include_vars:
|
|
|
|
|
file: "{{ setops_proxmox_hebergeur }}"
|
|
|
|
|
when: proxmox_fichier_hebergeur.stat.exists
|
|
|
|
|
|
2026-06-24 20:17:46 -04:00
|
|
|
- name: Charger les secrets Proxmox Vault
|
|
|
|
|
block:
|
Mise en conformité prouvable : registre d'affirmations + make prouver
Le dépôt fait / explique / prouve ce qu'il affirme, vérifiable en une commande.
- Phase 1 : docs/audit/affirmations.md — 54 affirmations publiques tracées vers
une commande de preuve et un statut (✅/🟡/❌/⚪).
- Phase 2 : CLAUDE.md réduit à un pointeur mince ; contradiction SSH levée (le
code applique déjà PasswordAuthentication no + AuthenticationMethods publickey,
conforme à AGENTS.md) ; section AGENTS « Codex » → « agents IA ».
- Phase 3 : parcours démarrage réparé (QUICKSTART renvoyait à un modèle absent,
chemins de voûte faux, commandes make périmées) ; make verifier vert
(ansible-lint 33 → 0 : site.yml généré nommé, pipefail, name[template]) ;
voûte Proxmox unifiée lue par le clonage (all/vault.yml).
- Phase 4 : make prouver → docs/audit/preuve-<date>.md, harnais rejouable qui
rappelle l'outillage existant (aucune validation réimplémentée).
- Phase 5 : parcours QUICKSTART prouvé hors-ligne sur le socle ; modèle socle
rendu valide (autorite interne → auto-heberge) ; split-brain d'inventaire
corrigé (repli sur le répertoire existant, pas principal/).
make prouver : 15 OK, 0 échec, 1 sautée (voûte). ansible-lint : 0 failure.
Écarts découverts en cours de traitement (AFF-097..100) : tous résolus.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 19:53:18 -04:00
|
|
|
- name: Charger les secrets de la voute Proxmox
|
2026-06-24 20:17:46 -04:00
|
|
|
ansible.builtin.include_vars:
|
|
|
|
|
file: "{{ item.stat.path }}"
|
|
|
|
|
loop: "{{ proxmox_fichiers_variables.results }}"
|
|
|
|
|
when:
|
|
|
|
|
- item.stat.exists
|
|
|
|
|
- item.stat.path is search('vault')
|
|
|
|
|
no_log: true
|
|
|
|
|
rescue:
|
|
|
|
|
- name: Expliquer l echec de chargement du Vault
|
|
|
|
|
ansible.builtin.fail:
|
|
|
|
|
msg: >-
|
Mise en conformité prouvable : registre d'affirmations + make prouver
Le dépôt fait / explique / prouve ce qu'il affirme, vérifiable en une commande.
- Phase 1 : docs/audit/affirmations.md — 54 affirmations publiques tracées vers
une commande de preuve et un statut (✅/🟡/❌/⚪).
- Phase 2 : CLAUDE.md réduit à un pointeur mince ; contradiction SSH levée (le
code applique déjà PasswordAuthentication no + AuthenticationMethods publickey,
conforme à AGENTS.md) ; section AGENTS « Codex » → « agents IA ».
- Phase 3 : parcours démarrage réparé (QUICKSTART renvoyait à un modèle absent,
chemins de voûte faux, commandes make périmées) ; make verifier vert
(ansible-lint 33 → 0 : site.yml généré nommé, pipefail, name[template]) ;
voûte Proxmox unifiée lue par le clonage (all/vault.yml).
- Phase 4 : make prouver → docs/audit/preuve-<date>.md, harnais rejouable qui
rappelle l'outillage existant (aucune validation réimplémentée).
- Phase 5 : parcours QUICKSTART prouvé hors-ligne sur le socle ; modèle socle
rendu valide (autorite interne → auto-heberge) ; split-brain d'inventaire
corrigé (repli sur le répertoire existant, pas principal/).
make prouver : 15 OK, 0 échec, 1 sautée (voûte). ansible-lint : 0 failure.
Écarts découverts en cours de traitement (AFF-097..100) : tous résolus.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 19:53:18 -04:00
|
|
|
Impossible de charger la voute Proxmox (group_vars/all/vault.yml ou
|
|
|
|
|
proxmox.vault.yml). Si elle est chiffree avec Ansible Vault, fournir son
|
|
|
|
|
mot de passe ou definir ANSIBLE_VAULT_PASSWORD_FILE avant de relancer make creer-vm.
|
2026-06-24 20:17:46 -04:00
|
|
|
|
|
|
|
|
- name: Appliquer les valeurs Proxmox avec repli environnement
|
|
|
|
|
ansible.builtin.set_fact:
|
|
|
|
|
proxmox_api_host_effectif: "{{ proxmox_api_host | default(lookup('env', 'PROXMOX_API_HOST'), true) }}"
|
|
|
|
|
proxmox_api_user_effectif: "{{ proxmox_api_user | default(lookup('env', 'PROXMOX_API_USER'), true) }}"
|
|
|
|
|
proxmox_api_token_id_effectif: "{{ proxmox_api_token_id | default(lookup('env', 'PROXMOX_API_TOKEN_ID'), true) }}"
|
|
|
|
|
proxmox_api_token_secret_effectif: "{{ proxmox_api_token_secret | default(lookup('env', 'PROXMOX_API_TOKEN_SECRET'), true) }}"
|
|
|
|
|
proxmox_api_port_effectif: "{{ proxmox_api_port | default(lookup('env', 'PROXMOX_API_PORT'), true) }}"
|
|
|
|
|
no_log: true
|
|
|
|
|
|
|
|
|
|
- name: Valider les parametres obligatoires Proxmox
|
|
|
|
|
ansible.builtin.assert:
|
|
|
|
|
that:
|
|
|
|
|
- proxmox_api_host_effectif | length > 0
|
|
|
|
|
- proxmox_api_user_effectif | length > 0
|
|
|
|
|
- proxmox_api_token_id_effectif | length > 0
|
|
|
|
|
- proxmox_api_token_secret_effectif | length > 0
|
|
|
|
|
- proxmox_clone_nom is defined
|
|
|
|
|
- proxmox_clone_nom | length > 0
|
|
|
|
|
- proxmox_clone_vmid_modele is defined
|
|
|
|
|
- proxmox_clone_vmid is defined
|
|
|
|
|
- proxmox_clone_noeud is defined
|
|
|
|
|
- proxmox_clone_noeud | length > 0
|
|
|
|
|
- proxmox_clone_ipconfig0 is defined
|
|
|
|
|
- proxmox_clone_ipconfig0 | length > 0
|
Mise en conformité prouvable : registre d'affirmations + make prouver
Le dépôt fait / explique / prouve ce qu'il affirme, vérifiable en une commande.
- Phase 1 : docs/audit/affirmations.md — 54 affirmations publiques tracées vers
une commande de preuve et un statut (✅/🟡/❌/⚪).
- Phase 2 : CLAUDE.md réduit à un pointeur mince ; contradiction SSH levée (le
code applique déjà PasswordAuthentication no + AuthenticationMethods publickey,
conforme à AGENTS.md) ; section AGENTS « Codex » → « agents IA ».
- Phase 3 : parcours démarrage réparé (QUICKSTART renvoyait à un modèle absent,
chemins de voûte faux, commandes make périmées) ; make verifier vert
(ansible-lint 33 → 0 : site.yml généré nommé, pipefail, name[template]) ;
voûte Proxmox unifiée lue par le clonage (all/vault.yml).
- Phase 4 : make prouver → docs/audit/preuve-<date>.md, harnais rejouable qui
rappelle l'outillage existant (aucune validation réimplémentée).
- Phase 5 : parcours QUICKSTART prouvé hors-ligne sur le socle ; modèle socle
rendu valide (autorite interne → auto-heberge) ; split-brain d'inventaire
corrigé (repli sur le répertoire existant, pas principal/).
make prouver : 15 OK, 0 échec, 1 sautée (voûte). ansible-lint : 0 failure.
Écarts découverts en cours de traitement (AFF-097..100) : tous résolus.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 19:53:18 -04:00
|
|
|
fail_msg: "Parametres Proxmox incomplets. Verifier proxmox.yml, la voute (all/vault.yml ou proxmox.vault.yml) et les variables make propres a la VM."
|
2026-06-24 20:17:46 -04:00
|
|
|
|
|
|
|
|
- name: Lire la cle publique SSH depuis le fichier fourni
|
|
|
|
|
ansible.builtin.set_fact:
|
|
|
|
|
proxmox_clone_sshkeys: "{{ lookup('ansible.builtin.file', proxmox_clone_cle_publique_fichier) }}"
|
|
|
|
|
when:
|
|
|
|
|
- proxmox_clone_cle_publique is not defined
|
|
|
|
|
- proxmox_clone_cle_publique_fichier is defined
|
|
|
|
|
- proxmox_clone_cle_publique_fichier | length > 0
|
|
|
|
|
|
|
|
|
|
- name: Utiliser la cle publique SSH fournie directement
|
|
|
|
|
ansible.builtin.set_fact:
|
|
|
|
|
proxmox_clone_sshkeys: "{{ proxmox_clone_cle_publique }}"
|
|
|
|
|
when:
|
|
|
|
|
- proxmox_clone_cle_publique is defined
|
|
|
|
|
- proxmox_clone_cle_publique | length > 0
|
|
|
|
|
|
|
|
|
|
- name: Construire les serveurs DNS Cloud-Init
|
|
|
|
|
ansible.builtin.set_fact:
|
|
|
|
|
proxmox_clone_nameservers: >-
|
|
|
|
|
{{
|
|
|
|
|
(proxmox_clone_dns | default('') | split(','))
|
|
|
|
|
| map('trim')
|
|
|
|
|
| reject('equalto', '')
|
|
|
|
|
| list
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
|
|
- name: Verifier la bibliotheque Python proxmoxer locale
|
|
|
|
|
ansible.builtin.command:
|
|
|
|
|
cmd: "{{ ansible_playbook_python }} -c 'import proxmoxer'"
|
|
|
|
|
changed_when: false
|
|
|
|
|
failed_when: false
|
|
|
|
|
register: proxmoxer_verification
|
|
|
|
|
|
|
|
|
|
- name: Refuser si proxmoxer est absent
|
|
|
|
|
ansible.builtin.fail:
|
|
|
|
|
msg: >-
|
|
|
|
|
La bibliotheque Python proxmoxer est absente pour {{ ansible_playbook_python }}.
|
|
|
|
|
Installer le paquet systeme approprie, par exemple
|
|
|
|
|
sudo apt install python3-proxmoxer, ou installer proxmoxer dans
|
|
|
|
|
l'environnement Python utilise par Ansible, puis relancer make creer-vm.
|
|
|
|
|
when: proxmoxer_verification.rc != 0
|
|
|
|
|
|
|
|
|
|
- name: Cloner la VM depuis le modele
|
|
|
|
|
community.general.proxmox_kvm:
|
|
|
|
|
api_host: "{{ proxmox_api_host_effectif }}"
|
|
|
|
|
api_port: "{{ proxmox_api_port_effectif | int if proxmox_api_port_effectif | length > 0 else omit }}"
|
|
|
|
|
api_user: "{{ proxmox_api_user_effectif }}"
|
|
|
|
|
api_token_id: "{{ proxmox_api_token_id_effectif }}"
|
|
|
|
|
api_token_secret: "{{ proxmox_api_token_secret_effectif }}"
|
|
|
|
|
validate_certs: "{{ proxmox_validate_certs | default(false) | bool }}"
|
|
|
|
|
node: "{{ proxmox_clone_noeud }}"
|
|
|
|
|
clone: "{{ proxmox_clone_source_nom | default('modele-debian13') }}"
|
|
|
|
|
vmid: "{{ proxmox_clone_vmid_modele | int }}"
|
|
|
|
|
newid: "{{ proxmox_clone_vmid | int }}"
|
|
|
|
|
name: "{{ proxmox_clone_nom }}"
|
2026-06-30 10:07:04 -04:00
|
|
|
cores: "{{ proxmox_clone_coeurs | int if proxmox_clone_coeurs is defined and proxmox_clone_coeurs | string | length > 0 else omit }}"
|
|
|
|
|
memory: "{{ proxmox_clone_memoire | int if proxmox_clone_memoire is defined and proxmox_clone_memoire | string | length > 0 else omit }}"
|
2026-06-24 20:17:46 -04:00
|
|
|
storage: "{{ proxmox_clone_stockage | default(omit, true) }}"
|
|
|
|
|
format: "{{ proxmox_clone_format | default(omit, true) }}"
|
|
|
|
|
full: "{{ proxmox_clone_complet | default(true) | bool }}"
|
|
|
|
|
timeout: "{{ proxmox_clone_timeout | default(600) | int }}"
|
|
|
|
|
|
|
|
|
|
- name: Ajuster le reseau de la VM clonee
|
|
|
|
|
community.general.proxmox_nic:
|
|
|
|
|
api_host: "{{ proxmox_api_host_effectif }}"
|
|
|
|
|
api_port: "{{ proxmox_api_port_effectif | int if proxmox_api_port_effectif | length > 0 else omit }}"
|
|
|
|
|
api_user: "{{ proxmox_api_user_effectif }}"
|
|
|
|
|
api_token_id: "{{ proxmox_api_token_id_effectif }}"
|
|
|
|
|
api_token_secret: "{{ proxmox_api_token_secret_effectif }}"
|
|
|
|
|
validate_certs: "{{ proxmox_validate_certs | default(false) | bool }}"
|
|
|
|
|
vmid: "{{ proxmox_clone_vmid | int }}"
|
|
|
|
|
interface: "{{ proxmox_clone_interface | default('net0') }}"
|
|
|
|
|
model: virtio
|
|
|
|
|
bridge: "{{ proxmox_clone_pont }}"
|
|
|
|
|
tag: "{{ proxmox_clone_vlan | int if proxmox_clone_vlan is defined and proxmox_clone_vlan | string | length > 0 else omit }}"
|
|
|
|
|
firewall: "{{ proxmox_clone_parefeu_interface | default(false) | bool }}"
|
|
|
|
|
state: present
|
|
|
|
|
when:
|
|
|
|
|
- proxmox_clone_pont is defined
|
|
|
|
|
- proxmox_clone_pont | length > 0
|
|
|
|
|
|
2026-07-01 15:38:42 -04:00
|
|
|
- name: Agrandir le disque principal du clone (grow-only)
|
2026-06-24 20:17:46 -04:00
|
|
|
community.general.proxmox_disk:
|
|
|
|
|
api_host: "{{ proxmox_api_host_effectif }}"
|
|
|
|
|
api_port: "{{ proxmox_api_port_effectif | int if proxmox_api_port_effectif | length > 0 else omit }}"
|
|
|
|
|
api_user: "{{ proxmox_api_user_effectif }}"
|
|
|
|
|
api_token_id: "{{ proxmox_api_token_id_effectif }}"
|
|
|
|
|
api_token_secret: "{{ proxmox_api_token_secret_effectif }}"
|
|
|
|
|
validate_certs: "{{ proxmox_validate_certs | default(false) | bool }}"
|
|
|
|
|
vmid: "{{ proxmox_clone_vmid | int }}"
|
|
|
|
|
disk: "{{ proxmox_clone_disque | default('scsi0') }}"
|
|
|
|
|
size: "{{ proxmox_clone_taille_disque }}"
|
|
|
|
|
state: resized
|
2026-07-01 15:38:42 -04:00
|
|
|
register: proxmox_redim_disque
|
|
|
|
|
# Le disque derive du plan est un MINIMUM. Si le template est deja plus grand,
|
|
|
|
|
# Proxmox refuse de retrecir : on tolere ce cas (grow-only), la VM garde le
|
|
|
|
|
# disque du template. Toute autre erreur reste bloquante.
|
|
|
|
|
failed_when:
|
|
|
|
|
- proxmox_redim_disque is failed
|
|
|
|
|
- "'shrinking disks is not supported' not in (proxmox_redim_disque.msg | default(''))"
|
2026-06-24 20:17:46 -04:00
|
|
|
when:
|
|
|
|
|
- proxmox_clone_taille_disque is defined
|
|
|
|
|
- proxmox_clone_taille_disque | length > 0
|
|
|
|
|
|
|
|
|
|
- name: Configurer Cloud-Init sur le clone
|
|
|
|
|
community.general.proxmox_kvm:
|
|
|
|
|
api_host: "{{ proxmox_api_host_effectif }}"
|
|
|
|
|
api_port: "{{ proxmox_api_port_effectif | int if proxmox_api_port_effectif | length > 0 else omit }}"
|
|
|
|
|
api_user: "{{ proxmox_api_user_effectif }}"
|
|
|
|
|
api_token_id: "{{ proxmox_api_token_id_effectif }}"
|
|
|
|
|
api_token_secret: "{{ proxmox_api_token_secret_effectif }}"
|
|
|
|
|
validate_certs: "{{ proxmox_validate_certs | default(false) | bool }}"
|
|
|
|
|
node: "{{ proxmox_clone_noeud }}"
|
|
|
|
|
vmid: "{{ proxmox_clone_vmid | int }}"
|
|
|
|
|
name: "{{ proxmox_clone_nom }}"
|
|
|
|
|
update: true
|
|
|
|
|
ciuser: "{{ proxmox_clone_ciuser | default(omit, true) }}"
|
|
|
|
|
sshkeys: "{{ proxmox_clone_sshkeys | default(omit) }}"
|
|
|
|
|
ipconfig:
|
|
|
|
|
ipconfig0: "{{ proxmox_clone_ipconfig0 }}"
|
|
|
|
|
nameservers: "{{ proxmox_clone_nameservers if proxmox_clone_nameservers | length > 0 else omit }}"
|
|
|
|
|
searchdomains: "{{ proxmox_clone_domaines_recherche | default(omit, true) }}"
|
|
|
|
|
agent: "enabled=1"
|
|
|
|
|
|
|
|
|
|
- name: Demarrer le clone
|
|
|
|
|
community.general.proxmox_kvm:
|
|
|
|
|
api_host: "{{ proxmox_api_host_effectif }}"
|
|
|
|
|
api_port: "{{ proxmox_api_port_effectif | int if proxmox_api_port_effectif | length > 0 else omit }}"
|
|
|
|
|
api_user: "{{ proxmox_api_user_effectif }}"
|
|
|
|
|
api_token_id: "{{ proxmox_api_token_id_effectif }}"
|
|
|
|
|
api_token_secret: "{{ proxmox_api_token_secret_effectif }}"
|
|
|
|
|
validate_certs: "{{ proxmox_validate_certs | default(false) | bool }}"
|
|
|
|
|
node: "{{ proxmox_clone_noeud }}"
|
|
|
|
|
vmid: "{{ proxmox_clone_vmid | int }}"
|
|
|
|
|
name: "{{ proxmox_clone_nom }}"
|
|
|
|
|
state: started
|
|
|
|
|
when: proxmox_clone_demarrer | default(true) | bool
|
|
|
|
|
|
|
|
|
|
- name: Afficher le resume du clone
|
|
|
|
|
ansible.builtin.debug:
|
|
|
|
|
msg:
|
|
|
|
|
- "VM creee: {{ proxmox_clone_nom }} (VMID {{ proxmox_clone_vmid }})"
|
|
|
|
|
- "Cloud-Init ipconfig0: {{ proxmox_clone_ipconfig0 }}"
|