Files
2026-05-29 18:30:16 +02:00

236 lines
10 KiB
Markdown

# deploy-vm
Rôle Ansible pour déployer des VMs Proxmox depuis un template cloud-init.
Supporte le déploiement multi-VM, la migration inter-nœuds, le redimensionnement de disque et l'ajout de disques supplémentaires.
## Fonctionnement
1. **asserts** — valide les variables obligatoires et les formats (IP CIDR, taille disque, extra disks)
2. **clone** — détecte le nœud du template dans le cluster, vérifie si la VM existe déjà, clone si non (idempotent)
3. **migrate** — si `proxmox_node` est différent du nœud du template, migre la VM hors-ligne vers le nœud cible
4. **configure** — applique CPU, RAM, sockets, cloud-init (IP/gateway/DNS/SSH), démarrage auto, resize disque et ajout de disques supplémentaires
5. **start** — démarre la VM et affiche un résumé
## Prérequis
- Ansible >= 2.14
- Collection `community.general >= 9.0.0` :
```bash
ansible-galaxy collection install -r requirements.yml
```
- Template Proxmox cloud-init existant (Packer ou manuel)
- Accès API Proxmox (utilisateur + mot de passe)
## Variables
### Obligatoires par VM (dans la liste `vms`)
| Champ | Description | Exemple |
|----------|----------------------------------|----------------------|
| `name` | Nom de la VM dans Proxmox | `"srv-web01"` |
| `ip` | Adresse IP en notation CIDR | `"192.168.1.100/24"` |
### Connexion Proxmox (à stocker dans vault)
| Variable | Description |
|------------------------|------------------------------------|
| `proxmox_api_user` | Utilisateur Proxmox (`user@realm`) |
| `proxmox_api_password` | Mot de passe Proxmox |
### Infrastructure (globales)
| Variable | Description | Défaut |
|--------------------------|-----------------------------------------------------------------------------|---------|
| `proxmox_host` | Adresse de l'API Proxmox | `""` |
| `proxmox_storage` | Pool de stockage par défaut pour le clone | `""` |
| `proxmox_node` | Nœud cible pour la VM. Vide = même nœud que le template. Surchargeble par VM. | `""` |
| `proxmox_validate_certs` | Valider le certificat TLS de l'API | `false` |
| `template_name` | Nom du template source (surchargeble par VM) | `""` |
### Ressources VM (globales, surchargeables par VM)
| Variable | Description | Défaut |
|---------------|----------------------|--------|
| `vm_cores` | Nombre de vCPUs | `2` |
| `vm_sockets` | Nombre de sockets | `1` |
| `vm_memory` | RAM en Mo | `2048` |
### Réseau (globales, surchargeables par VM)
| Variable | Description | Défaut |
|--------------|--------------------------------|--------------------------------------|
| `vm_gateway` | Passerelle par défaut | `"192.168.1.1"` |
| `vm_dns` | Liste des serveurs DNS | `["9.9.9.9", "8.8.8.8", "8.8.4.4"]` |
### Disque principal (globales, surchargeables par VM)
| Variable | Description | Défaut |
|----------------|-----------------------------------------------------------------------------|----------|
| `vm_disk_name` | Identifiant du disque à redimensionner | `"scsi0"` |
| `vm_disk_size` | Taille cible. Vide = pas de resize. Format : `"50G"`, `"500M"`, `"+10G"` | `""` |
> **Note** : `vm_disk_size` avec préfixe `+` agrandit le disque existant. Sans préfixe, définit la taille absolue. Proxmox **ne réduit pas** les disques.
### Disques supplémentaires (surchargeables par VM)
| Variable | Description | Défaut |
|-----------------|---------------------------------------------------------------|--------|
| `vm_extra_disks`| Liste de disques supplémentaires à créer | `[]` |
Champs de chaque disque :
| Champ | Obligatoire | Description | Exemple |
|-------------|:-----------:|-------------------------------------------------|---------------|
| `disk` | ✓ | Slot Proxmox (`scsi1`, `virtio1`, `sata1`…) | `"scsi1"` |
| `size` | ✓ | Taille absolue (pas de `+`). Format : `NUNité` | `"50G"` |
| `storage` | | Pool de stockage (défaut : `proxmox_storage`) | `"datavm"` |
| `ssd` | | Émuler un SSD | `true` |
| `iothread` | | Activer iothread | `true` |
| `backup` | | Inclure dans les sauvegardes | `true` |
| `cache` | | Mode de cache (`writeback`, `none`…) | `"writeback"` |
### Cloud-init (globales, surchargeables par VM)
| Variable | Description | Défaut |
|-----------------|------------------------------------------------------|--------|
| `vm_ciuser` | Utilisateur créé par cloud-init | `""` |
| `vm_cipassword` | Mot de passe (préférer `vm_sshkeys`, stocker en vault) | `""` |
| `vm_sshkeys` | Clés SSH publiques (séparées par `\n`) | `""` |
### Options de déploiement (globales, surchargeables par VM)
| Variable | Description | Défaut |
|-------------------------------|------------------------------------------------------------------|---------|
| `vm_full_clone` | Clone complet (`true`) ou lié (`false`) | `true` |
| `vm_start_on_boot` | Démarrage automatique avec le nœud Proxmox | `true` |
| `vm_wait_timeout` | Timeout pour le clone et le démarrage (secondes) | `300` |
| `vm_force_update` | Autoriser la reconfiguration d'une VM existante | `false` |
| `vm_migrate_with_local_disks` | Migrer les disques locaux (nécessaire si stockage non partagé) | `true` |
## Utilisation
### 1. Installer les dépendances
```bash
ansible-galaxy collection install -r requirements.yml
```
### 2. Déclarer les VMs dans les variables du play
```yaml
# group_vars/proxmox.yml (ou host_vars, ou directement dans le playbook)
proxmox_host: "192.168.1.4"
proxmox_storage: "datavm"
proxmox_node: "proxmox01" # nœud par défaut pour toutes les VMs
template_name: "template-debian-12"
vms:
- name: srv-web01
ip: "192.168.1.101/24"
cores: 2
memory: 2048
disk_size: "30G"
- name: srv-db01
ip: "192.168.1.110/24"
cores: 4
memory: 8192
disk_size: "50G"
extra_disks:
- disk: scsi1
size: "100G"
storage: "datavm"
ssd: true
backup: true
- name: srv-app01
ip: "192.168.1.120/24"
proxmox_node: "proxmox02" # nœud différent → migration automatique
cores: 4
memory: 4096
disk_size: "30G"
```
### 3. Appeler le rôle dans un playbook
```yaml
- hosts: proxmox
gather_facts: false
vars_files:
- vault.yml
roles:
- role: brainsys.deploy_vm
tags: deploy_vm
```
### 4. Lancer le déploiement
```bash
ansible-playbook playbooks/proxmox.yml \
-l proxmox01.homelab.example.com \
-t deploy_vm \
--ask-vault-pass
```
### 5. Reconfigurer une VM existante
Par défaut le rôle échoue si la VM existe déjà (protection contre les modifications accidentelles).
Pour autoriser la reconfiguration :
```bash
ansible-playbook playbooks/proxmox.yml \
-l proxmox01.homelab.example.com \
-t deploy_vm \
--ask-vault-pass \
-e vm_force_update=true
```
Ou par VM dans la liste :
```yaml
vms:
- name: srv-web01
ip: "192.168.1.101/24"
force_update: true
```
## Champs disponibles dans la liste `vms`
Chaque item de la liste `vms` peut surcharger n'importe quelle variable globale :
| Champ | Variable rôle correspondante |
|-----------------------------|-----------------------------------|
| `name` | `vm_name` *(obligatoire)* |
| `ip` | `vm_ip` *(obligatoire)* |
| `id` | `vm_id` (auto si absent) |
| `proxmox_node` | `proxmox_node` |
| `template_name` | `template_name` |
| `cores` | `vm_cores` |
| `sockets` | `vm_sockets` |
| `memory` | `vm_memory` |
| `gateway` | `vm_gateway` |
| `dns` | `vm_dns` |
| `disk_name` | `vm_disk_name` |
| `disk_size` | `vm_disk_size` |
| `extra_disks` | `vm_extra_disks` |
| `ciuser` | `vm_ciuser` |
| `cipassword` | `vm_cipassword` |
| `sshkeys` | `vm_sshkeys` |
| `full_clone` | `vm_full_clone` |
| `start_on_boot` | `vm_start_on_boot` |
| `wait_timeout` | `vm_wait_timeout` |
| `force_update` | `vm_force_update` |
| `migrate_with_local_disks` | `vm_migrate_with_local_disks` |
## Sécurité
- Chiffrer `vault.yml` avec `ansible-vault encrypt vault.yml` — ne jamais le committer en clair.
- Préférer les clés SSH (`vm_sshkeys`) aux mots de passe cloud-init (`vm_cipassword`).
- Créer un utilisateur Proxmox dédié avec les permissions minimales plutôt que d'utiliser `root@pam`.
- Ajouter `vault.yml` au `.gitignore` si le fichier n'est pas chiffré.
## Licence
MIT