Aujourd'hui nous allons parler d'un outil très orienté Infrastructure As Code ( IAC pour les intimes ) : Packer. Grâce à lui, nous allons pouvoir automatiser la création de nos templates sur la plateforme VMware vSphere.

Packer : C'est quoi ?

Packer permet d'automatiser la création de tout type d'images de machine et ce pour différentes plateformes. Mais tout ceci à partir d'une source unique ( votre fichier de configuration au format json! ).

Parmi les plateformes de destinations possibles nous allons retrouver :

  • Azure,
  • AWS,
  • GCP,
  • VMware,
  • Qemu,
  • Virtualbox,
  • DigitalOcean,
  • etc.

Packer peut également utiliser votre gestionnaire de configuration habituel ( Cheff, Ansible ou même Puppet ) afin d'éxécuter vos scripts et installer les logiciels dont vous avez besoin.

Je vais détailler l'utilisation de cet outil - très léger et qui fonctionne sur tout les principaux systèmes d'exploitaion - afin de créer un template CentOS 8 sur vSphere. Il est tout à fait possible de réaliser le même cheminement avec un autre système d'exploitation ( Debian par exemple ) et vers une autre plateforme ! Je reviendrai plus tard sur la création d'images Debian/Ubuntu vers KVM !

C'est parti pour créer notre premier template !

Un template ! Un template !

Toute la configuration de votre template va donc se jouer autour d'un fichier json. Pour cet article, je vais appeler ce fichier template.json.

Commeçons par déclarer les variables nécessaires à la connexion à notre vSphere :

{
  "builders": [
    {
      "type": "vsphere-iso",

      "vcenter_server": "vsphere.myinfra.local",
      "username": "administrator@vsphere.local",
      "password": "My@Sec3ur3!P@ssw0rD",
      
      "datacenter": "MyDatacenter",
      "cluster": "MyCluster",
      "datastore": "MYDATASTORE",
      "folder": "Templates",
      
      "insecure_connection": "true",
      "notes": "Thanks to www.grottedubarbu.fr",
    }
  ]
}

Quelques explications :

"type": "vsphere-iso"

On déclare ici le type de builder à utiliser. Il en existe un nombre très important et vous pourrez sûrement trouver votre bonheur si celui présenté aujourd'hui ne vous convient pas : https://www.packer.io/docs/builders !

"vcenter_server": "vsphere.myinfra.local",
"username": "administrator@vsphere.local",
"password": "My@Sec3ur3!P@ssw0rD",

Je pense que vous aurez compris, mais ici je déclare la connexion à mon serveur vSphere.

"datacenter": "MyDatacenter",
"cluster": "MyCluster",
"datastore": "MYDATASTORE",
"folder": "Templates",

Les informations de votre plateforme vSphere. Packer va créer votre image dans le dossier Templates et utilisera l'espace disque disponible dans le datastore déclaré préalablement.

"insecure_connection": "true",
"notes": "Thanks to www.grottedubarbu.fr"

Si vous utilisez un certificat auto-signé, insecure_connection doit être sur true.

Et enfin j'ajoute juste une petite note à mon futur template ! 😂

Alors oui, si votre but est d'utiliser Packer pour créer vos images de production, il va falloir utiliser autre chose pour stocker vos accès... !!! Par exemple ... Vault d'HashiCorp? 😀

J'aurai pu - et même dû - déclarer une section variable pour cette partie de la configuration. Mais le but aujourd'hui est de faire une première approche du logiciel et de fournir un exemple qui reste simple et fonctionnel.

Après la connexion à notre vSphere, nous allons pouvoir déclarer les informations "physiques" de notre image ( nom du template, nombre de CPU/RAM, disque dur, carte réseau ... )

Toujours dans le même fichier json, vous pouvez ajouter après la dernière instruction :

      "vm_name": "CentOS-8.x",
      "CPUs": "1",
      "RAM": "2048",
      "RAM_reserve_all": "false",
      "firmware": "bios",
      "guest_os_type": "centos8_64Guest",
      
      "boot_command": "<enter><enter>",
      "boot_order": "disk,cdrom",
      "boot_wait": "10s",
      
      "convert_to_template": "true",
      
      "iso_paths": [
        "[MYDATASTORE] ISOs/CentOS-8.2.2004-x86_64-minimal.iso",
        "[] /vmimages/tools-isoimages/linux.iso"
      ],

      "network_adapters": [
        {
          "network": "VM Lan",
          "network_card": "vmxnet3"
        }
      ],

      "disk_controller_type": "pvscsi",
      
      "storage": [
        {
          "disk_size": "20480",
          "disk_thin_provisioned": "true"
        }
      ],

      "ssh_username": "centos",
      "ssh_password": "My@Password!"

Je ne vais pas détailler toutes les lignes de cette partie mais uniquement quelques unes. Le gros avantage de Packer est que son fichier de configuration est facile à relire/comprendre.

"iso_paths": [
"[DATASTORE] ISOs/CentOS-8.2.2004-x86_64-minimal.iso",
"[] /vmimages/tools-isoimages/linux.iso"
],

Je vais charger l'iso de CentOS 8 que j'aurais préalablement chargé dans un dossier ISOs de mon MYDATASTORE.

Toutes ces informations sont du niveau hardware sauf ... :

 "ssh_username": "centos",
 "ssh_password": "My@Password!"

Il faut comprendre comment Packer fonctionne ( pas trop tôt ? 😅 ) ! Packer va créer une machine virtuelle, lancer notre iso et ... attendre tout simplement. Mais quoi ?

Attendre que le système d'exploitation s'installe - tout seul comme un grand - , et obtienne une adresse IP. C'est pourquoi, vous avez besoin des VMware Tools ( propriétaires ou open-source ) afin que vSphere remonte cette information.

Enfin une fois l'information obtenue, Packer va vérifier que ssh fonctionne afin de valider votre template.

Oui mais ...

Dis, comment on fait ... ?

Pour réaliser une installation automatique de CentOS ?

Il existe - heureusement pour nous - un fichier de configuration pour réaliser cela : https://docs.centos.org/en-US/centos/install-guide/Kickstart2/

Pour Debian/Ubuntu, il s'agit du fichier preseed.cfg : https://wiki.debian.org/fr/DebianInstaller/Preseed

Il va donc falloir le générer et l'envoyer à notre installeur. Je vais vous aider et vous fournir un premier fichier ks.cfg que vous pourrez ensuite adapter à vos besoins :

lang fr_FR
keyboard fr
timezone Europe/Paris --isUtc
#platform x86, AMD64, or Intel EM64T
reboot
text
cdrom
bootloader --location=mbr --append="rhgb quiet crashkernel=auto"
zerombr
clearpart --all --initlabel
autopart
network --device=ens192 --hostname=centos --bootproto=dhcp
authselect --passalgo=sha512 --useshadow
selinux --enforcing
firewall --enabled --ssh
skipx
firstboot --disable
rootpw XXXXXXXXXXXXXXX --iscrypted
user --name=centos --groups=wheel --iscrypted --password=XXXXXXXXXXXXXXXXXXXX
%packages
@^minimal-environment
@standard
%end

%post --log=/var/log/ks.post02.log
#!/bin/bash

set -x

# Install VMWare guest tools
echo "Installing VM Tools..."
# Install open-vm-tools, required to detect IP when building on ESXi
dnf install -y open-vm-tools
systemctl enable vmtoolsd
systemctl start vmtoolsd

%end

Pour information Red Hat propose un générateur de configuration kickstart à cette adresse : https://access.redhat.com/labsinfo/kickstartconfig

L'utilisation de l'application nécessite un "contrat", mais vous pouvez obtenir une license d'utilisation en créant un compte développeur.

Pour chiffrer les mots de passe dans votre fichier, ici en :

authselect --passalgo=sha512 --useshadow

Vous pouvez utiliser la commande openssl passwd -6 afin de hash votre mot de passe pour votre fichier de configuration.

Il ne reste plus qu'à démarrer notre installeur avec le fichier ks.cfg que nous venons juste de créer !

It's magic !

Vous pourrez trouver de nombreux tutoriels sur internet pour effectuer ces manipulations mais une majorité d'entre eux va utiliser le lecteur de ... disquette pour avoir accès au fichier !

Hélas - ou heureusement - une grande majorité des distributions commence à retirer le pilote : https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/considerations_in_adopting_rhel_8/index#removed-hardware-support_hardware-enablement

Nous allons donc utiliser pour cet exemple un fichier iso et un second lecteur cdrom sur notre machine.

On commence par créer le fichier iso :

genisoimage -o centos8_ks.iso -V "OEMDRV" ks.cfg

Vous allez devoir uploader votre fichier iso centos8_ks.iso dans votre datastore.

Une fois réalisée, vous pouvez ajouter les lignes suivantes à votre template Packer :

"iso_paths": [
  "[DATASTORE] ISOs/CentOS-8.2.2004-x86_64-minimal.iso",
  "[DATASTORE] ISOs/rhel8_ks.iso",
  "[] /vmimages/tools-isoimages/linux.iso"
],

On arrive au but !

Validons notre template Packer :

$ packer validate template.json

Enfin je lance la construction du template :

$ packer build template.json

En vous connectant sur votre vSphere, vous allez pouvoir constater la création de votre futur template :

Template CentOS-8.x

Vous pouvez également vérifier l'avancement de votre installation depuis la console VMware :

CentOS installation

Depuis votre console, voici les éléments qui doivent s'afficher :

Packer

Vous savez maintenant comment réaliser votre template d'installation à l'aide de Packer !

Avec cet outil, nous verrons prochainement comment réaliser vos templates Debian/Ubuntu mais aussi ... Windows !

Nous pourrons également voir dans une autre série comment utiliser terraform pour déployer nos infrastructures avec nos templates et utiliser Ansible pour configurer installer et configurer nos logiciels.

Un grand merci à Vincent Rabah pour son article sur le sujet qui m'a servi de référence :

Suite à une remarque en commentaire, et pour aller plus loin sur le sujet, voici une excellente série présente sur Medium :

Guillermo Musumeci – Medium
Read writing from Guillermo Musumeci on Medium. Certified AWS, Azure & GCP Architect | HashiCorp Ambassador | Terraform SME | Entrepreneur & Innovator | Startup Mentor | Book Author | Husband & Dad of ✌.
N'hésitez pas à permettre au blog de continuer à exister et à fournir un contenu de qualité - enfin je l'espère - au travers de vos dons sur : buymeacoff.ee/lfache
Et n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter, ou ici 👇