Aller au contenu

Paramétrer vos vm avec Packer

La suite logique après la construction d’une image avec packer, c’est de mettre au point cloud-init pour paramétrer vos vms lors des instanciations dans votre cluster. Même si cloud-init se destine à la base au déploiement de machines virtuelles dans le cloud, on peut tout à fait le mettre en œuvre dans un contexte local. Avant je ferais un rappel sur l’installation de kvm.

Définition de l’image de base

Vous pouvez soit utiliser l’image de cloud générique de CentOS, soit utilisé votre propre image créée avec packer qui devra juste contenir cloud-init pour que cela fonctionne.

Terminal window
mkdir images; cd images
wget http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2

Installation et Configuration de kvm

Tout d’abord, installez KVM et divers outils :

Terminal window
sudo apt install qemu-system-x86 qemu-kvm qemu libvirt-bin virt-manager virtinst bridge-utils cpu-checker virt-viewer
sudo usermod -aG kvm $USER
sudo usermod -aG libvirt $USER
sudo chmod +r /boot/vmlinuz-*

Rebooter votre machine et contrôler que tout fonctionne avec cette commande :

Terminal window
kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

Interface par défaut

Par défaut, KVM crée un commutateur virtuel qui apparaît comme une interface hôte nommée «virbr0» à l’aide de 192.168.122.0/24.

commutateur virtuel kvm

Vous devriez voir cette interface :

Terminal window
ip addr show virbr0
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:54:00:46:26:04 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever

Cette interface fonctionne en mode NAT, ce qui permet au système d’exploitation invité de communiquer, mais autorise uniquement l’hôte (et les VM de son sous-réseau) à établir des connexions entrantes. On doit juste le démarrer :

Terminal window
virsh net-start default
virsh net-autostart default

Pool de stockage

Le pool de stockage «par défaut» utilisé pour le stockage des vm se trouve dans le répertoire /var/lib/libvirt/images. Cela peux convenir pour de simples tests. Vous pouvez en créer un nouveau dans un répertoire où vous aurez plus de place. Dans les commandes ci-dessous configurer le répertoire de votre choix :

Terminal window
virsh pool-list --all
Name State Autostart
-------------------------------------------
default active yes
virsh pool-destroy default
virsh pool-undefine default
mkdir -p /media/work/kvm
virsh pool-define-as --name default --type dir --target /media/work/kvm
virsh pool-start default
virsh pool-autostart default
virsh pool-list --all
Name State Autostart
-------------------------------------------
default active yes

Commandes base pour gérer des images kvm

Création d’une vm de base

À partir de l’image téléchargé tout à l’heure :

Terminal window
cp images/CentOS-7-x86_64-GenericCloud.qcow2 test.qcow2
virt-install --import --name test --ram 1024 --vcpus 1 --disk test.qcow2,format=qcow2,bus=virtio --network bridge=virbr0,model=virtio --os-type=linux --os-variant=rhel7.0 --noautoconsole
Starting install...
Domain creation completed.

La commande pour lister les vm :

Terminal window
virsh list --all
Id Name State
----------------------
24 test running

Destruction des vms

Il suffit de taper les commandes suivantes :

Terminal window
virsh destroy test
virsh undefine test
virsh list --all

Voilà tout est en place.

Création de votre premier fichier cloud-init

Installation des prérequis

Nous avons besoin de quelques packages pour créer l’image iso qui sera utilisé pour stocker le paramétrage de cloud-init.

Terminal window
sudo apt install -y cloud-image-utils libosinfo-bin libguestfs-tools

Changement du mot de passe root d’une image Centos

On va changer le mot de passe root de notre image kvm juste pour pouvoir debugger si cela ne fonctionne pas.

Terminal window
cd images
openssl passwd -1 password
$1$//qcHmeK$0JZCiy8fNPNVeOqXAVGzy1
guestfish -a CentOS-7-x86_64-GenericCloud.qcow2
><fs> run
><fs> list-filesystems
><fs> mount /dev/sda1 /
><fs> vi /etc/shadow

Dans la ligne root:!!: changer les !! par le mot de passe généré précédemment.

Sauvegarder et quitter

Terminal window
><fs> quit

Augmentation de la la taille de l’image kvm

On va aussi augmenter sa taille à 10G:

Terminal window
qemu-img create -b ~/images/CentOS-7-x86_64-GenericCloud.qcow2 -f qcow2 test.qcow2 10G

Ecriture du premier fichier cloud-init

Un fichier cloud-init est un fichier au format yaml dont les valeurs sont décrites à cette adresse :

Voici un exemple permettant de :

  • changer le nom de la vm
  • créer un user centos
  • copier votre clé <sshPUBKEY> dans les machines autorisées à se connecter
Terminal window
vi user-data

Collez-y ceci:

Changment du nom de la vm
hostname: test
fqdn: test.example.com
manage_etc_hosts: true
Création d'un user
users:
- name: centos
sudo: ALL=(ALL) NOPASSWD:ALL
groups: adm,sys
home: /home/centos
shell: /bin/bash
lock_passwd: false
ssh_authorized_keys:
- <sshPUBKEY>
On autorise de se connecter avec un user/mdp
ssh_pwauth: true
disable_root: false
Mis à jour des packages
package_update: true
Installation des packages
packages:
- qemu-guest-agent
- epel-release

et un fichier meta_data :

Terminal window
vi meta-data
instance-id: test
local-hostname: test

Génération de l’image iso cloud-init

genisoimage -output data.iso -volid cidata -joliet -r user-data meta-data

Lancement de notre première vm paramétré avec cloud-init

Lancons notre première vm :

Terminal window
virt-install --import --name test --ram 1024 --vcpus 1 --disk test.qcow2,format=qcow2,bus=virtio --disk data.iso,device=cdrom --network bridge=virbr0,model=virtio --os-type=linux --os-variant=rhel7.0 --noautoconsole

Pour se connecter on lance la commande suivante :

Terminal window
virsh list --all
Id Name State
----------------------
27 test running
virsh console test

Entrer le user root avec le mot de passe password. On peut tout de suite vérifier le résultat dans le fichier /var/log/cloud-init.log

Récupération de l’adresse IP

Bon on arrive à se connecter à notre vm via les outils, mais comment se connecter via ssh. En premier on récupère l’adresse MAC puis l’adresse ip :

Terminal window
MAC=$(virsh dumpxml test | awk -F\' '/mac address/ {print $2}')
echo $MAC
52:54:00:c4:46:0c
grep -B1 $MAC /var/lib/libvirt/dnsmasq/$BRIDGE.status | head -n 1 | awk '{print $2}' | sed -e s/\"//g -e s/,//
192.168.122.97
ssh centos@192.168.122.97

La suite

Pour aller plus loin dans la configuration, comme gérer les disques, je vous conseille d’aller sur le site de la documentation cloud-init et en particulier la partie modules.