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.
mkdir images; cd imageswget 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-viewersudo usermod -aG kvm $USERsudo usermod -aG libvirt $USERsudo chmod +r /boot/vmlinuz-*
Rebooter votre machine et contrôler que tout fonctionne avec cette commande :
kvm-ok
INFO: /dev/kvm existsKVM 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 virbr03: 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 defaultvirsh 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 yesvirsh pool-destroy defaultvirsh pool-undefine defaultmkdir -p /media/work/kvmvirsh pool-define-as --name default --type dir --target /media/work/kvmvirsh pool-start defaultvirsh 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 testvirsh undefine testvirsh 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 imagesopenssl passwd -1 password$1$//qcHmeK$0JZCiy8fNPNVeOqXAVGzy1guestfish -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 vmhostname: testfqdn: test.example.commanage_etc_hosts: true Création d'un userusers: - 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/mdpssh_pwauth: truedisable_root: false Mis à jour des packagespackage_update: true Installation des packagespackages: - qemu-guest-agent - epel-release
et un fichier meta_data :
vi meta-data
instance-id: testlocal-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 $MAC52:54:00:c4:46:0cgrep -B1 $MAC /var/lib/libvirt/dnsmasq/$BRIDGE.status | head -n 1 | awk '{print $2}' | sed -e s/\"//g -e s/,//192.168.122.97ssh 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 ↗.