DevOps & Outils¶
Automatiser la création d'images machine sur vSphere avec Packer et Ansible, provisionner avec une stack enterprise.
graph LR
A["vSphere Setup"] --> B["Packer Config"]
B --> C["Kickstart"]
C --> D["Ansible Roles"]
D --> E["Build Image"]
E --> F["Template VM"] Ce que vous allez apprendre¶
À la fin de ce tutoriel, vous serez capable de :
- Configurer un environnement vSphere pour Packer (permissions, réseau, datastore)
- Créer un service account vSphere avec un rôle custom minimal
- Écrire un template Packer HCL pour vSphere (
vsphere-isoetvsphere-clone) - Automatiser l'installation de Rocky 9 via kickstart
- Provisionner une image avec les collections Ansible nuevolia
- Construire et valider un template VM enterprise (Docker, monitoring, hardening)
Prérequis¶
| Outil | Version minimale | Vérification |
|---|---|---|
| vCenter | 7.0+ ou 8.0 | Accès web client |
| Licences | Enterprise Plus ou VCF | vCenter > Licensing |
| Packer | 1.10+ | packer version |
| Ansible | 2.15+ | ansible --version |
| govc (optionnel) | 0.35+ | govc version |
Accès réseau
La machine de build doit pouvoir atteindre :
- Port 443 : API vCenter
- Port 22 : SSH vers la VM temporaire de build
- Port 902 : Upload de fichiers (si utilisé)
VCF
Sur VMware Cloud Foundation, le vCenter est intégré au SDDC Manager. Les instructions sont les mêmes, avec les spécificités notées le cas echeant.
Parcours¶
Étape 1 : Configuration vSphere¶
Preparez l'environnement vCenter pour accueillir les builds Packer.
Datacenter et cluster¶
Verifiez que votre datacenter et cluster existent :
# Avec govc
export GOVC_URL="vcenter.example.com"
export GOVC_USERNAME="administrator@vsphere.local"
export GOVC_PASSWORD="votre-mot-de-passe"
export GOVC_INSECURE=true
govc datacenter.info
govc cluster.info
Dossier VM¶
Créez un dossier dédié aux templates Packer :
Datastore et ISO¶
Uploadez l'ISO Rocky 9 dans le datastore :
# Telecharger l'ISO
curl -LO https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9-latest-x86_64-minimal.iso
# Creer le dossier ISO sur le datastore
govc datastore.mkdir -ds=DS-SSD-01 ISO
# Uploader l'ISO
govc datastore.upload -ds=DS-SSD-01 Rocky-9-latest-x86_64-minimal.iso ISO/Rocky-9-latest-x86_64-minimal.iso
Port group¶
Assurez-vous qu'un port group est disponible pour les builds. La VM temporaire doit obtenir une IP (DHCP ou IP statique dans le kickstart) et être joignable en SSH depuis la machine de build.
Permissions¶
Voir la section Authentification méthode B pour créer un service account avec le rôle custom Packer Builder.
Étape 2 : Configuration Packer¶
Guide complet : Configuration Packer VMware
Points clés :
- Template HCL
vsphere-iso(parcours principal) avec kickstart Rocky 9 - Template HCL
vsphere-clone(alternative rapide) - Variables de connexion et de placement vSphere
Guide kickstart : Kickstart Rocky 9
Étape 3 : Rôles Ansible¶
Guide complet : Rôles Ansible VMware
Stack enterprise déployée :
| Collection | Rôle | Fonction |
|---|---|---|
nuevolia.cloud | guest | open-vm-tools |
nuevolia.system | hardening | SSH, firewalld, SELinux |
nuevolia.application | container_engine | Docker CE |
nuevolia.monitoring | system_metrics | node_exporter |
Étape 4 : Build et validation¶
cd packer-vsphere
export PKR_VAR_vcenter_password="votre-mot-de-passe"
packer build -only="vsphere-iso.rocky9-server" .
Le build dure généralement 15 a 25 minutes (plus long que GCP car installation OS from scratch).
Lire les logs¶
==> vsphere-iso.rocky9-server: Creating VM...
==> vsphere-iso.rocky9-server: Customizing hardware...
==> vsphere-iso.rocky9-server: Mounting ISO...
==> vsphere-iso.rocky9-server: Starting HTTP server on port 8614
==> vsphere-iso.rocky9-server: Booting VM...
==> vsphere-iso.rocky9-server: Waiting for SSH to become available...
==> vsphere-iso.rocky9-server: Connected to SSH!
==> vsphere-iso.rocky9-server: Provisioning with Ansible...
vsphere-iso.rocky9-server: PLAY [Provisionner l'image Rocky 9 Server] ****
...
vsphere-iso.rocky9-server: PLAY RECAP ****
vsphere-iso.rocky9-server: default: ok=15 changed=12 unreachable=0 failed=0
==> vsphere-iso.rocky9-server: Shutting down VM...
==> vsphere-iso.rocky9-server: Converting VM to template...
Build 'vsphere-iso.rocky9-server' finished after 18 minutes 45 seconds.
Troubleshooting¶
| Erreur | Cause | Fix |
|---|---|---|
Permission denied: VirtualMachine.Provisioning.Clone | Rôle vCenter incomplet | Vérifier les privileges du service account |
Timeout waiting for SSH | VM non joignable | Vérifier le port group, DHCP, firewall |
Kickstart not found | Serveur HTTP Packer non accessible | Vérifier que le port dynamique est ouvert entre la machine de build et la VM |
VMware Tools not running | Installation échouée | Vérifier le rôle guest et les repos Rocky 9 |
disk.enableUUID not set | Configuration disque | Ajouter disk_controller_type = ["pvscsi"] |
Étape 5 : Utilisation du template¶
Déployer une VM depuis le template¶
govc vm.clone -vm "/DC-Paris/vm/Templates/Packer/rocky9-server-1712345678" \
-ds=DS-SSD-01 \
-pool="/DC-Paris/host/Cluster-Prod/Resources" \
-folder="/DC-Paris/vm/Production" \
-on=true \
test-docker
Vérifier¶
# SSH
ssh packer@<ip-vm>
# Docker
docker version
docker compose version
docker run --rm hello-world
# Metrics
curl http://localhost:9100/metrics | head -5
# Hardening
sudo sestatus # SELinux enforcing
sudo firewall-cmd --list-ports # Ports autorises
sudo sshd -T | grep permitrootlogin # no
Nettoyage¶
vRA / Aria Automation — Self-service¶
Le template est pret. vRealize Automation (vRA 8.x) / Aria Automation permet de l'exposer en self-service : blueprints YAML, catalog avec approbation et actions day-2.
Prérequis vRA¶
| Élément | Configuration |
|---|---|
| Cloud Account | Infrastructure > Cloud Accounts > vSphere |
| Projet | infra-templates avec cloud zone vSphere associee |
| Flavor Mapping | small (2/4), medium (4/8), large (8/16) |
| Image Mapping | rocky9-server → template Packer |
Content Source¶
Design > Content Sources > New (type vSphere Template, cloud account vSphere). La synchronisation détecté automatiquement les templates du vCenter. Chaque build Packer crée un nouveau template — mettre à jour l'image mapping manuellement ou via API.
Blueprint¶
formatVersion: 1
name: Rocky 9 Server
inputs:
flavor:
type: string
enum: [small, medium, large]
default: small
hostname:
type: string
pattern: '^[a-z0-9-]{3,15}$'
resources:
vm:
type: Cloud.vSphere.Machine
properties:
name: '${input.hostname}'
image: rocky9-server
flavor: '${input.flavor}'
networks:
- network: '${resource.network.id}'
network:
type: Cloud.vSphere.Network
properties:
networkType: existing
Tester via Design > Blueprints > Test, puis versionner le blueprint.
Catalog et approbation¶
- Versionner et Release le blueprint
- Content Sharing > partager avec le projet
- Ajouter une Approval Policy si nécessaire (ex:
input.network == "intranet"→ approbation manuelle) - Configurer un Custom Form pour améliorer l'UX (placeholders, descriptions, visibilité conditionnelle)
ABX et actions Day-2¶
ABX (Action Based Extensibility) exécuté du code Python/Node.js sur des événements du cycle de vie :
| Event Topic | Déclencheur |
|---|---|
compute.provision.post | Après création de la VM |
compute.removal.pre | Avant suppression |
deployment.request.post | Après déploiement catalog |
Actions day-2 courantes : resize (CPU/RAM), snapshot, DNS register/unregister.
Extensibility > Subscriptions pour lier un event topic a une action ABX ou un webhook externe.
Parcours utilisateur¶
graph TB
A["Catalog : demande"] --> B{"Approbation ?"}
B -- oui --> C["Approbateur valide"]
B -- non --> D["Provisioning"]
C --> D
D --> E["VM deployee"]
E --> F["Actions Day-2"]
E --> G["Destroy + nettoyage"] Livrable¶
Checklist
Avant de passer à la suite, verifiez que :
- L'environnement vSphere est configuré (dossier, ISO, permissions)
-
packer build .se termine avec Build finished - Le template apparait dans l'inventaire vCenter
- Une VM déployée depuis le template a Docker, node_exporter et le hardening actifs
- Les ressources de test sont nettoyees