Aller au contenu

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-iso et vsphere-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 :

govc folder.create /DC-Paris/vm/Templates
govc folder.create /DC-Paris/vm/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.

Mode debug

PACKER_LOG=1 packer build .

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

govc vm.destroy test-docker

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

  1. Versionner et Release le blueprint
  2. Content Sharing > partager avec le projet
  3. Ajouter une Approval Policy si nécessaire (ex: input.network == "intranet" → approbation manuelle)
  4. 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