Aller au contenu principal

Paramétrer vos vm avec Packer

· 5 minutes de lecture
Stéphane ROBERT
Consultant DevOps

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.

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 :

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 :

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.

Vous devriez voir cette interface :

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 :

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 :

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 :

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 :

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

Destruction des vms

Il suffit de taper les commandes suivantes :

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.

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.

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

><fs> quit

Augmentation de la la taille de l'image kvm

On va aussi augmenter sa taille à 10G:

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
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 :

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 :

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 :

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 :

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.

attention

En cas d'erreur n'oubliez pas de détruire votre vm puis de recopier l'image centos de base avec la commande qemu-img create !!!!