3.1. Openstack Training Labs

Installation sur un serveur Scaleway C2L 8 CPUs, 32 Go RAM

1. Openstack Training Labs

Le script python st.py lance osbash qui automatise en bash l'installation d'Openstack. Le dossier source contient plusieurs fichiers et dossiers :

  • autostart : Les scripts shell osbash/wbatch (*.sh) dans ce dossier sont automatiquement exécutés et puis retirés au démarrage.
  • config : Contient les fichiers de configuration pour tous les scripts. C'est l'endroit de configuration.
  • img : Emplacement par défaut des images.
  • lib : Librairies utilisées par les scripts.
  • log: Contient tous les logs osbash/wbatch exécutés. log/stacktrain.log
  • scripts: Tous les scripts qui seront exécutés dans les VMs.
  • wbatch : Fichiers batch Windows générés par osbash.

1.1. Description du modèle

Ce déploiement est fonctionnel en plus ou moins une heure sous Ubuntu 18.04 avec VirtualBox 5.2.18 en version Spike.

Il utilise hyperviseur type 2 (VirtualBox) ou type 1 (Qemu/KVM) et des scripts Python et Bash pour simuler un déploiement automatisé proche de la réalité.

Le script st.py déploie la solution en deux temps :

  1. Une image de base est construite
  2. Un noeud de contrôle et un noeud de calcul sont installés et configurés pour un usage immédiat.

Dans ce document, l'auteur s'est référé au travail de Diarmuid O'Briain (netLabs!UG OpenStack user group) : OpenStack Laboratory Guide v5.0.1.

Le déploiement se déroule par une connexion SSH qui exécute à chaque étape un script généré sur base de modèles. Les fichiers de logs nous renseigneront sur ces étapes.

1.2. Topologie / architecture

Topologie 1 Compute/1 Controller
Figure 35 : Topologie 1 Compute/1 Controller

Cette topologie comporte deux noeuds (Compute1 et Controller) qui se connectent à trois réseaux :

Nom du réseau Plage d'adresse Usage
Management 10.0.0.0/24 C'est le réseau qui assure la communication interne entre les noeuds
Provider 203.0.113.0/24 C'est le réseau qui offre un accès Internet aux VMs créées
LAN (Public) dépendant C'est le réseau qui offre un accès Internet aux noeuds

Un troisième noeud Compute2 viendra s'ajouter à la topologie de départ dans un prochain exercice.

1.3. Dimensionnement

On réservera 2048 Mo de RAM pour l'hôte physique sur un total de 32 Go de RAM.

Le contrôleur devrait disposer de 6144 Mo de RAM et de 2 CPUs dans cette configuration. Lui accorder 8 Go de RAM ne serait pas un luxe.

Un minimum de 1 CPU et de 1536 Mo de RAM est nécessaire pour le noeud de calcul, mais il n'y a pas de limite haute évidemment. On conseille de réserver aux noeuds de calcul 8 Go de RAM, 4 CPUs et 128 Go de disque (qui sera approvisionné de manière légère et mis en snapshot initial).

Fichier VM_MEM VM_CPU SECOND_DISK_SIZE
config.controller 6144 2 N/A
config.compute1 8192 4 128000

Il reste encore 16384 Mo de RAM pour ajouter un ou deux noeuds supplémentaires.

1.4. Noeud Controller

Le noeud de contrôle (Controller) exécute les services OpenStack suivants :

  • Keystone, le service d'identification
  • Glance, le service d'images
  • La gestion des services :
    • Nova, le service de calcul
    • Neutron, le service réseau
    • Horizon, le service de panneau de contrôle
  • des services :
    • Base de données SQL (MySQL)
    • Messages Queuing (RabbitMQ)
    • Synchronisation temporelle (NTP)

On peut y installer d'autres services comme :

  • Cinder, le service de stockage de type "block"
  • Swift, le service de stockage de type "objet"
  • Heat, le service d'orchestration
  • Ceilometer, des services de télémétrie

1.5. Noeud Compute (calcul)

Ce type de noeud héberge un hyperviseur Qemu/KVM pour exécuter les machines virtuelles.

... un mot sur le réseau avec Neutron ...

1.6. Mots de passe des services

Function Name Database Pass Domain Pass User Pass
MySQL root secrete
RabbitMQ rabbitPass
Ceilometer ceilometer ceilometer_db_secret ceilometer_user_secret
Cinder cinder cinder_db_secret cinder_user_secret
Glance glance glance_db_secret glance_user_secret
Heat heat heat_db_secret heat_dom_pw heat_user_secret
Keystone keystone keystone_db_secret
Neutron neutron neutron_db_secret neutron_user_secret
Nova nova nova_db_secret nova_user_secret

1.7. Comptes utilisateurs par projet

Project name Username Password User role name
admin admin admin_user_secret admin
demo demo demo_user_pass User
CirrOS VM test cirros cubswin:)

2. Configuration et installation de stacktrain

Une connexion SSH est nécessaire pour administrer notre solution. L'option -i indique le chemin de la d'authentification de l'utilisateur stack qui se connecte au serveur yourhost

Pour obtenir une console graphique nécessaire à l'usage de KVM dans notre cas, il faut installer localement un serveur X11 (Xming pour Windows) et lancer une connexion SSH avec l'option -MY de transfert de sessions graphiques. L'option -M Place le client SSH en mode maître pour le partage de connexion et l'option -Y active le transfert X11 de confiance. Les redirections X11 de confiance ne sont alors pas soumises aux contrôles d'extension X11 SECURITY.

Les noeuds "controller" et "compute1" sont des machines virtuelles que le gestionnaire de VMs lancent. Pour l'instant les scripts lancent les VMs avec une console graphique, mais les installations sont silencieuses et journalisées.

ssh -MY -i yourbox-id_rsa.pem stack@yourhost

3.1. Instructions de virtualisation activées sur l'hôte de virtualisation

Pour prendre en charge les invités HVM (Hardware-assisted Virtual Machine), les extensions de virtualisation doivent être activées dans le (BIOS) :

  • Enable Virtualisation Technology - x86 architectures (VT-x)
  • Enable Intel VT
  • Vanderpool Technology

Aussi, il est nécessaire d'activer :

  • Intel Virtualisation Technology for Directed I/O (VT-d)

Pour confirmer que la virtualisation matérielle est activée, on exécute une recherche sur les mots clés "VMX" (Intel) ou "SVM" (AMD) :

Cette commande identifie les motifs vmx ou svm dans le fichier du noyau /proc/cpuinfo et rend le nombre d'occurences trouvées

sudo egrep -c 'vmx|svm' /proc/cpuinfo
8

Ou encore :

sudo lscpu | grep 'Virtualization'
Virtualization:      VT-x

Sur un hôte KVM :

sudo virt-host-validate

3.2. Installation de Virtualbox

sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y install virtualbox

3.3. Installation Libvirt/KVM

sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y install qemu-kvm libvirt-bin virtinst virt-viewer libguestfs-tools virt-manager uuid-runtime python-pip pkg-config libvirt-dev genisoimage netcat python-dev libyaml-dev libosinfo-bin virt-top
sudo usermod -aG libvirt `id -un`

3.4. Résolution de noms

Quel que soit l'hyperviseur choisi la résolution des noms sur l'hôte de virtualisation doit être assurée :

cat << EOF | sudo tee --append /etc/hosts
# ------------------
# Virtualised nodes
# ------------------
# controller
10.0.0.11       controller
# compute1
10.0.0.31       compute1
# compute1
10.0.0.32       compute2
EOF

3.5. Configuration du code stacktrain

Entrer dans une session comme utilisateur stack :

sudo su - stack

Le script rudimentaire suivant installe les scripts de "training-labs" selon la version et configure l'environnement de déploiement.

#!/bin/bash
#st_setup.sh

package=$1
case ${package} in
  pike)
  archive="labs-stable-pike.tgz" ;;
  queens)
  archive="labs-stable-queens.tgz" ;;
  rocky)
  archive="labs-stable-rocky.tgz" ;;
  stein)
  archive="labs-master.tgz" ;;
  *)
  head -n15 $0 && exit ;;
esac

echo "---- Get the training-labs scripts ----"
wget http://tarballs.openstack.org/training-labs/dist/${archive}
tar xvfz ${archive}

echo "---- Configure directory path as env variables ----"
cat << EOF >> ~/.bashrc
OS_LAB=$HOME
OS_ST=$HOME/labs
OS_BASH=$HOME/labs/osbash
EOF
export OS_LAB=$HOME
export OS_ST=$HOME/labs
export OS_BASH=$HOME/labs/osbash

echo "---- Configure the controller and the compute1 components ----"
mv $OS_ST/config/config.controller $OS_ST/config/config.controller.bak
cat << EOF >> $OS_ST/config/config.controller
VM_SSH_PORT=2230
VM_WWW_PORT=8888
NET_IF_0=dhcp
NET_IF_1="static 10.0.0.11 1"
NET_IF_2="manual 203.0.113.0"
VM_MEM=6144
VM_CPUS=2
EOF
mv $OS_ST/config/config.compute1 $OS_ST/config/config.compute1.bak
cat << EOF >> $OS_ST/config/config.compute1
VM_SSH_PORT=2232
NET_IF_0=dhcp
NET_IF_1="static 10.0.0.31 1"
NET_IF_2="manual 203.0.113.0"
SECOND_DISK_SIZE=128000
VM_MEM=8192
VM_CPUS=4
EOF
cat << EOF | sudo tee --append /etc/hosts
10.0.0.11 controller
10.0.0.31 compute1
EOF
if [ ${package} == "pike" ] ; then
echo "---- Enable Heat service installation ----"
cp $OS_ST/config/scripts.ubuntu_cluster $OS_ST/config/scripts.ubuntu_cluster.bak
sed -i '/heat_controller/s/#//' $OS_ST/config/scripts.ubuntu_cluster
fi

if [ $(virsh --version > /dev/null ; echo $?) == '0' ] ; then
echo "---- install last prereq ----"
sudo apt update
sudo apt -qq install iptables-converter
echo "---- Default Storage Pool creation ----"
sudo virsh pool-destroy default
sudo virsh pool-undefine default
mkdir -p /home/stack/labs/pool
sudo virsh pool-define-as default dir - - - - "/home/stack/labs/pool"
sudo virsh pool-start default
sudo virsh pool-autostart default
echo "---- Populate env vars ----"
cat << EOF >> ~/.bashrc
VIRSH_DEFAULT_CONNECT_URI='qemu:///system'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
EOF
export PATH=$PATH:/sbin:/usr/sbin/
echo "---- install last prereq ----"
sudo apt update
sudo apt -qq install iptables-converter
echo "---- Default Storage Pool creation ----"
sudo virsh pool-destroy default
sudo virsh pool-undefine default
mkdir -p /home/stack/labs/pool
sudo virsh pool-define-as default dir - - - - "/home/stack/labs/pool"
sudo virsh pool-start default
sudo virsh pool-autostart default
echo "---- Populate env vars ----"
cat << EOF >> ~/.bashrc
VIRSH_DEFAULT_CONNECT_URI='qemu:///system'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
EOF
export PATH=$PATH:/sbin:/usr/sbin/
fi
  • controller : 6Go RAM, 2 CPUs, 10.0.0.11/24 et 203.0.113.0/24
  • compute1 : 8Go RAM, 4 CPUs 10.0.0.31/24 et 203.0.113.0/24
  • release :
    • pike
    • rocky
    • queens
    • stein
versions KVM Virtualbox
pike testé testé
rocky
queens
stein échec echec

La version "spike" a été testée sous Virtualbox :

bash st_setup.sh spike

La version "pike" a été testée sous KVM :

bash st_setup.sh pike

3.6. Déploiement de stacktrain avec Virtualbox

sudo su - stack
cd labs
./st.py --verbose-console -b --verbose cluster

3.7. Fin de l'installation avec Virtualbox

Le déploiement se termine par ce message :

11:01:29 21750 INFO    Cluster build took 2688 seconds
Your cluster nodes:
11:01:29 21750 INFO    VM name: compute1
11:01:29 21750 INFO        SSH login: ssh -p 2232 osbash@127.0.0.1
11:01:29 21750 INFO                   (password: osbash)
11:01:29 21750 INFO    VM name: controller
11:01:29 21750 INFO        SSH login: ssh -p 2230 osbash@127.0.0.1
11:01:29 21750 INFO                   (password: osbash)
11:01:29 21750 INFO        Dashboard: Assuming horizon is on controller VM.
11:01:29 21750 INFO                   http://127.0.0.1:8888/horizon/
11:01:29 21750 INFO                   User  : demo (password: demo_user_pass)
11:01:29 21750 INFO                   User  : admin (password: admin_user_secret)
11:01:29 21750 INFO    Network: mgmt
11:01:29 21750 INFO             Network address: 10.0.0.0
11:01:29 21750 INFO    Network: provider
11:01:29 21750 INFO             Network address: 203.0.113.0

Ce déploiement a duré 44 minutes 48 secondes.

3.8. Déploiement de stacktrain avec KVM

cd labs
./st.py --verbose-console -b --verbose --provider kvm cluster

3.9. Fin de l'installation avec KVM

Le déploiement se termine par ce message :

22:03:59 26102 INFO    Cluster build took 3143 seconds
Your cluster nodes:
22:03:59 26102 INFO    VM name: compute1
22:03:59 26102 INFO        SSH login: ssh osbash@192.168.122.103
22:03:59 26102 INFO                   (password: osbash)
22:03:59 26102 INFO    VM name: controller
22:03:59 26102 INFO        SSH login: ssh osbash@192.168.122.117
22:03:59 26102 INFO                   (password: osbash)
22:03:59 26102 INFO        Dashboard: Assuming horizon is on controller VM.
22:03:59 26102 INFO                   http://192.168.122.117/horizon/
22:03:59 26102 INFO                   User  : demo (password: demo_user_pass)
22:03:59 26102 INFO                   User  : admin (password: admin_user_secret)
22:03:59 26102 INFO    Network: mgmt
22:03:59 26102 INFO             Network address: 10.0.0.0
22:03:59 26102 INFO    Network: provider
22:03:59 26102 INFO             Network address: 203.0.113.0

Ce déploiement a duré 52 minutes 23 secondes.

3.10. Fichiers de logs

Les fichiers de logs situés dans $OS_LAB/labs/logs rappellent les différentes étapes du déploiement.

  • 000_00_base_fixups.auto
    • 001_01_apt_init.auto
    • 002_02_apt_upgrade.auto
    • 003_03_pre-download.auto
    • 004_04_apt_pre-download.auto
    • 005_05_enable_osbash_ssh_keys.auto
    • 006_06_zero_empty.auto
    • 007_07_shutdown.auto
  • 008_00_init_controller_node.auto
    • 009_01_etc_hosts.auto
    • 010_02_enable_osbash_ssh_keys.auto
    • 011_03_copy_openrc.auto
    • 012_04_apt_install_mysql.auto
    • 013_05_install_rabbitmq.auto
    • 014_06_install_memcached.auto
    • 015_07_setup_keystone.auto
    • 016_08_get_auth_token.auto
    • 017_09_setup_glance.auto
    • 018_10_setup_nova_controller.auto
    • 019_11_setup_neutron_controller.auto
    • 020_12_setup_self-service_controller.auto
    • 021_13_setup_neutron_controller_part_2.auto
    • 022_14_setup_horizon.auto
    • 023_15_setup_cinder_controller.auto
    • 024_16_setup_heat_controller.auto
  • 025_00_init_compute1_node.auto
    • 026_01_etc_hosts.auto
    • 027_02_enable_osbash_ssh_keys.auto
    • 028_03_copy_openrc.auto
    • 029_04_setup_nova_compute.auto
    • 030_05_setup_neutron_compute.auto
    • 031_06_setup_self-service_compute.auto
    • 032_07_setup_neutron_compute_part_2.auto
    • 033_08_setup_cinder_volumes.auto
  • 034_00_config_public_network.auto
  • 035_01_config_private_network.auto

On trouvera d'autres fichiers au même endroit comme ceux-ci :

  • ssh.log
  • stacktrain.log
  • status
  • vboxmanage.log
  • vm_base.cfg
  • vm_compute1.cfg
  • vm_controller.cfg

3.11. Ajout de règles de pare-feu et du NAT/PAT

Afin de donner accès au réseau "Provider" à l'Internet et à ses indispensables services, il est à notre charge de simuler cette connectivité comme si on s'organisait avec les personnes en charge de l'infrastructure du réseau pour établir cette connectivité avec des commutateurs et des routeurs physiques.

Pour notre part, il s'agit d'autoriser (via le script suivant) le routage IP du réseau "provider" représenté par le nom de l'interface virtuelle qui le supporte vers l'Internet représenté par le nom de l'interface physique qui connecte l'hôte de virtualisation, ici "eth0". Le nom de l'interface virtuelle dépend de la solution de virtualisation choisie.

Le script met en place un pare-feu qui n'autorise que le trafic de réponses légitimes de le traverser.

Aussi, il active la traduction d'adresse IPv4 (NAT, Network Adress Translation) avec une méthode de "MASQUERADING" qui signifie "masquer". En effet, cette méthode consiste à remplacer l'adresse IP source de l'émetteur dont le réseau est inconnu du reste de l'Internet par l'adresse d'une interface qui dispose d'une connectivité (de routage vers) Internet. On dit que l'adresse et son réseau est caché car derrière une seule adresse, un grand nombre peuvent se cacher. Pour en terminer sur cette succincte présentation du NAT, on se demandera comment une telle traduction de multiples adresses à partir d'une seule est possible ? Le routage NAT utilise le port source comme critère de traduction en plus de l'adresse IPv4 source, on parle alors de "Source NAT" et de "PAT (Port Adress Translation)", ce qui permet de multiplexer le trafic à partir d'une seule adresse de traduction.

cat <<'EOM' > $OS_LAB/nat_tables.sh
#!/bin/bash
###########################################
#  program: nat_tables.sh                 #
#  Author: Diarmuid O'Briain              #
#  Copyright ©2017 C2S Consulting         #
#  License: www.gnu.org/licenses/gpl.txt  #
###########################################
# NAT masquerade rules for hypervisor, hosting OpenStack testbed #
# Select interface, typically 'wlp4s0' for WIFI and 'enp0s3' for wired Ethernet
INTERFACE=eth0     # Unhash for wired Ethernet interface
#INTERFACE=enp3s0     # Unhash for wired Ethernet interface
#INTERFACE=wlp4s0    # Unhash for wireless WIFI interface
# Select instance private network
#NETWORK=virbr2
NETWORK=vboxnet1
# Flush iptables
iptables -F
iptables -F -t nat
# Enable IP forwarding
# For KVM/QEMU
# For VirtualBox
echo
echo "echo \"1\" > /proc/sys/net/ipv4/ip_forward"
echo "1" > /proc/sys/net/ipv4/ip_forward
echo
# Load GNU/Linux kernel modules
modprobe ip_tables
modprobe ip_conntrack
# Add IPTABLES rules
iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE
iptables -A FORWARD -i $INTERFACE -o $NETWORK -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $NETWORK -o $INTERFACE -j ACCEPT
# Print iptables
iptables -t nat -v -L POSTROUTING
echo
iptables -v -L FORWARD
# END
EOM

À exécuter avec des privilèges :

chmod +x $OS_LAB/nat_tables.sh
sudo $OS_LAB/nat_tables.sh
echo "1" > /proc/sys/net/ipv4/ip_forward

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  all  --  any    eth0    anywhere             anywhere

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  eth0   vboxnet1  anywhere             anywhere             state RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  vboxnet1 eth0    anywhere             anywhere

3. Gestion des noeuds Virtualbox

Manipulation des noeuds avec VirtualBox en ligne de commande.

4.1. Lister les noeuds Virtualbox

vboxmanage list vms
vboxmanage list runningvms

4.2. Démarrer un noeud Virtualbox

vboxmanage startvm "controller" --type headless
vboxmanage startvm "compute1" --type headless

4.3. Éteindre un noeud Virtualbox

vboxmanage controlvm "controller" poweroff
vboxmanage controlvm "compute1" poweroff

4.4. Sauvegarder l'état et stopper un noeud Virtualbox

vboxmnage controlvm "compute1" savestate

4.5. Gérer les instantanés (snapshots) Virtualbox

vboxmanage snapshot "controller" list

4.6. Prendre un instantané Virtualbox

vboxmanage snapshot "controller" take "snap01-controller" --description "Initial controller snapshot"

4.7. Restaurer un instantané Virtualbox

vboxmanage controlvm "controller" poweroff
vboxmanage snapshot "controller" restore snap01-controller

4.8. Supprimer un instantané Virtualbox

vboxmanage snapshot "controller" delete snap01-controller

4. Gestion des noeuds QEMU/KVM

Manipulation des noeuds avec libvirt en ligne de commande virsh.

5.1. Lister les noeuds QEMU/KVM

stack@stacktrain05:~/labs$ sudo virsh list --all
 Id    Name                           State
----------------------------------------------------
 6     controller                     running
 7     compute1                       running

5.2. Prise d'information sur le noeud controller

stack@stacktrain05:~/labs$ sudo virsh dominfo controller
Id:             6
Name:           controller
UUID:           7f21ec82-7aba-4627-9612-f42c4b5d4500
OS Type:        hvm
State:          running
CPU(s):         2
CPU time:       926.2s
Max memory:     6291456 KiB
Used memory:    6291456 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: apparmor
Security DOI:   0
Security label: libvirt-7f21ec82-7aba-4627-9612-f42c4b5d4500 (enforcing)
stack@stacktrain05:~/labs$ sudo virsh snapshot-list controller
 Name                 Creation Time             State
------------------------------------------------------------
 controller_-_cluster_installed 2019-03-06 22:02:37 +0000 shutoff

5.3. Prise d'information sur compute1

stack@stacktrain05:~/labs$ sudo virsh dominfo compute1
Id:             7
Name:           compute1
UUID:           0118dad7-90ca-405a-bbf2-c2c09c61046c
OS Type:        hvm
State:          running
CPU(s):         4
CPU time:       379.7s
Max memory:     8388608 KiB
Used memory:    8388608 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: apparmor
Security DOI:   0
Security label: libvirt-0118dad7-90ca-405a-bbf2-c2c09c61046c (enforcing)
stack@stacktrain05:~/labs$ sudo virsh snapshot-list compute1
 Name                 Creation Time             State
------------------------------------------------------------
 compute-_cluster_installed 2019-03-06 22:02:37 +0000 shutoff

5.4. Réseau KVM

default

stack@stacktrain05:~/labs$ sudo virsh net-dumpxml default
<network>
  <name>default</name>
  <uuid>8a1cc0eb-5ad8-438e-aa82-70a03e15de0b</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:12:a2:f3'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

labs-mgmt

stack@stacktrain05:~/labs$ sudo virsh net-dumpxml labs-mgmt
<network connections='2'>
  <name>labs-mgmt</name>
  <uuid>c3ce06a7-519b-4126-931f-537c35c2172c</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr1' stp='on' delay='0'/>
  <mac address='52:54:00:2b:d5:f8'/>
  <ip address='10.0.0.1' netmask='255.255.255.0'>
  </ip>
</network>

labs-provider

stack@stacktrain05:~/labs$ sudo virsh net-dumpxml labs-provider
<network connections='2'>
  <name>labs-provider</name>
  <uuid>325aba62-c62e-44d2-874b-c904ea1f5fcb</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr2' stp='on' delay='0'/>
  <mac address='52:54:00:9e:59:fa'/>
  <ip address='203.0.113.1' netmask='255.255.255.0'>
  </ip>
</network>

5.2. Démarrer un noeud QEMU/KVM

sudo virsh start controller

5.3. Éteindre un noeud QEMU/KVM

sudo virsh shutdown controller

5.4. Sauvegarder l'état et stopper un noeud QEMU/KVM

sudo virsh save compute1 compute1.dump

5.5. Gérer les instantanés (snapshots) QEMU/KVM

sudo virsh snapshot-list controller
 Name                 Creation Time             State
------------------------------------------------------------
 controller_-_cluster_installed 2019-03-06 22:02:37 +0000 shutoff

4.6. Prendre un instantané QEMU/KVM

sudo virsh

4.7. Restaurer un instantané QEMU/KVM

sudo virsh

4.8. Supprimer un instantané QEMU/KVM

sudo virsh

5. Script d'arrêt / démarrage du cluster

Script start-stop-cluster.sh

cat <<'EOM' > ~/start-stop-cluster.sh
#!/bin/bash
###########################################
#  program: start-stop-cluster.sh         #
#  Author: Diarmuid O'Briain              #
#  Copyright ©2017 C2S Consulting         #
#  License: www.gnu.org/licenses/gpl.txt  #
###########################################
PROVIDER=''
  if [[ `echo "$0" | grep './'` ]]; then
      command=`echo "$0"|awk -F '/' '{print $2}'`
  else
      command=$0
fi
# Help function
function usage {
    echo -e "usage: $command <PROVIDER> <START | STOP>  help, -h, -help, --help\n"
    echo -e "PROVIDER:: kvm | vbox\n"
    echo -e "kvm = Kernel based Virtual Machine/Quick Emulator (KVM/QEMU)\n"
    echo -e "vbox = Oracle VirtualBox\n"
    echo -e "Start or Stop the Virtual Machines in the cluster\n"
    exit
}
# Arguments from the command line
if [[ $# -lt 1 ]]; then   # Deal with too few arguments
    echo -e "\nNot enough arguments\n"
    usage
elif [[ $# -gt 2 ]]; then   # Deal with too many arguments
    echo -e "\nToo many arguments\n"
    usage
elif [[ $1 =~ (-h|-help|--help|help) ]]; then   # Deal with request for help
    usage
elif [[ $1 =~ (kvm|vbox) ]] && [[ $2 =~ (start|stop) ]]; then   # Deal with legit option
    PROVIDER=$1
ACTION=$2
    echo -e "\nSelected provider is: $PROVIDER and the cluster will $ACTION\n"
else
    echo -e "\nNot an acceptable option\n"
    usage
fi
# Action nodes
if [[ $PROVIDER =~ 'kvm' ]] && [[ $ACTION =~ 'start' ]]; then
    echo -e "Powering up KVM/QEMU nodes\n"
    if ! [[ $(virsh net-list | egrep 'labs-mgmt|labs-provider'; echo $?) ]];then
        virsh -c 'qemu:///system' net-start 'labs-mgmt'
        virsh -c 'qemu:///system' net-start 'labs-provider'
    fi
    sleep 5
    virsh -c 'qemu:///system' start 'controller'
    virsh -c 'qemu:///system' start 'compute1'
elif [[ $PROVIDER =~ 'kvm' ]] && [[ $ACTION =~ 'stop' ]]; then
    echo -e "Powering down KVM/QEMU nodes\n"
    virsh -c 'qemu:///system' shutdown 'controller'
    virsh -c 'qemu:///system' shutdown 'compute1'
    sleep 5
elif [[ $PROVIDER =~ 'vbox' ]] && [[ $ACTION =~ 'start' ]]; then
    echo -e "Powering up VirtualBox nodes\n"
    vboxmanage startvm 'controller' --type headless
    vboxmanage startvm 'compute1' --type headless
    echo
elif [[ $PROVIDER =~ 'vbox' ]] && [[ $ACTION =~ 'stop' ]]; then
    echo -e "Powering off VirtualBox nodes\n"
    vboxmanage controlvm 'controller' poweroff
    vboxmanage controlvm 'compute1' poweroff
    echo
fi
# Show cluster
echo -e "Cluster state\n"
if [[ $PROVIDER =~ 'kvm' ]] && [[ $ACTION =~ 'stop' ]]; then
    while true; do
       listout=$(virsh -c 'qemu:///system' list)
       if ! [[ $(echo $listout |egrep 'controller|compute1') ]]; then
         break
       fi
       echo -n '. ';sleep 2
    done
    echo
    virsh -c 'qemu:///system' net-list
    virsh -c 'qemu:///system' list
elif [[ $PROVIDER =~ 'kvm' ]] && [[ $ACTION =~ 'start' ]]; then
    virsh -c 'qemu:///system' net-list
    virsh -c 'qemu:///system' list
elif [[ $PROVIDER =~ 'vbox' ]] && [[ $ACTION =~ 'start' ]]; then
    echo 'Running VMs'
    vboxmanage list runningvms | egrep 'controller|compute1'
else
    echo 'VMs in a shutdown state'
    vboxmanage list vms | egrep 'controller|compute1'
    echo
fi
# END
EOM
chmod +x ~/start-stop-cluster.sh
~/start-stop-cluster.sh

Not enough arguments

usage: opt <PROVIDER> <START | STOP>  help, -h, -help, --help

PROVIDER:: kvm | vbox

kvm = Kernel based Virtual Machine/Quick Emulator (KVM/QEMU)

vbox = Oracle VirtualBox

Start or Stop the Virtual Machines in the cluster
~/start-stop-cluster.sh vbox start
~/start-stop-cluster.sh vbox stop

6. Script de nettoyage

Ce script remet le lab dans son état initial.

cat <<'EOM' > $OS_LAB/clean_nodes.sh
#!/bin/bash
###########################################
#  program: clean_nodes.sh                #
#  Author: Diarmuid O'Briain              #
#  Copyright ©2017 C2S Consulting         #
#  License: www.gnu.org/licenses/gpl.txt  #
###########################################
PROVIDER=''
  if [[ `echo "$0" | grep './'` ]]; then
      command=`echo "$0"|awk -F '/' '{print $2}'`
  else
      command=$0
fi
  # Help function
  function usage {
   echo -e "usage: $command <PROVIDER> help, -h, -help, --help\n"
   echo -e"PROVIDER:: kvm | vbox\n"
   echo -e"kvm = Kernel based Virtual Machine/Quick Emulator (KVM/QEMU)\n"
   echo -e"vbox = Oracle VirtualBox\n"
   echo -e"Note: For KVM/QEMU this command must be ran as sudo\n"
   exit
}
# Arguments from the command line
if [[ $# -lt 1 ]]; then # Deal with too few arguments
   echo -e "\nNot enough arguments\n"
   usage
elif [[ $# -gt 1 ]]; then   # Deal with too many arguments
    echo -e "\nToo many arguments\n"
    usage
elif [[ $1 =~ (-h|-help|--help|help) ]]; then   # Deal with request for help
    usage
elif [[ $1 =~ (kvm|vbox) ]]; then   # Deal with legit option
    PROVIDER=$1
    echo -e "\nSelected provider is: $PROVIDER\n"
else
    echo -e "\nNot an acceptable option\n"
    usage
fi
echo -e "\nRestoring nodes to clean state\n"
# Powering off nodes
if [[ $PROVIDER =~ 'kvm' ]]; then
    echo -e "Powering off KVM/QEMU nodes\n"
    virsh -c 'qemu:///system' shutdown 'controller'
    virsh -c 'qemu:///system' shutdown 'compute1'
else
    echo -e "Powering off VirtualBox nodes\n"
    vboxmanage controlvm 'controller' poweroff
    vboxmanage controlvm 'compute1' poweroff
fi
# Wait for nodes to power down
echo -e "\nWaiting for nodes to power down completely\n"
if [[ $PROVIDER =~ 'kvm' ]]; then
    while [[ 1 ]]; do
       CONTROLLER_STATE=`virsh -c 'qemu:///system' list --all | grep -e 'controller\s*shut off' | awk '{print $3, $4}'` COMPUTE_STATE=`virsh -c 'qemu:///system' list --all | grep -e 'compute1\s*shut off' | awk '{print $3, $4}'` printf "."; sleep 2
    if [[ $CONTROLLER_STATE =~ 'shut off' && $COMPUTE_STATE =~ 'shut off' ]]; then echo -e "\n\nController node and Compute1 node are in a shut down state"
        break
    fi
  done
else
              while [[ 1 ]]; do
                 CONTROLLER_STATE=`vboxmanage showvminfo 'controller' | \
                 grep '^State' | awk '{print $2}'`
                 COMPUTE_STATE=`vboxmanage showvminfo 'controller' | \
                 grep '^State' | awk '{print $2}'`
                 printf "."
                 if [[ $CONTROLLER_STATE =~ 'powered' && $COMPUTE_STATE =~ 'powered' ]]; then
                      echo -e "\n\nController node and Compute1 node are in a shut down state"
                      break
                 fi
             done
fi
          # Return nodes to last working snapshots
          if [[ $PROVIDER =~ 'kvm' ]]; then
              echo -e "\nReverting KVM/QEMU nodes to earlier snapshots\n"
              virsh -c 'qemu:///system' snapshot-revert --domain 'controller' \
              --snapshotname 'controller_-_cluster_installed' --running
              virsh -c 'qemu:///system' snapshot-revert --domain 'compute1' \
              --snapshotname 'compute-_cluster_installed' --running
          else
              echo -e "\nReverting VirtualBox nodes to earlier snapshot\n"
              vboxmanage snapshot 'controller' restore 'controller_-_cluster_installed'
              echo
              vboxmanage snapshot 'compute1' restore 'compute-_cluster_installed'
              echo
              vboxmanage startvm 'controller' --type headless
              echo
              vboxmanage startvm 'compute1' --type headless
              echo
          fi
          # Show clean nodes
          echo -e "Clean running nodes\n"
          if [[ $PROVIDER =~ 'kvm' ]]; then
              virsh -c 'qemu:///system' list
          else
              vboxmanage list runningvms
              echo
fi
# END
EOM
chmod +x $OS_LAB/clean_nodes.sh
$OS_LAB/clean_nodes.sh

Alternative KVM

virsh shutdown controller
virsh shutdown compute1
virsh snapshot-revert --domain 'controller' --snapshotname 'controller_-_cluster_installed' --running
virsh snapshot-revert --domain 'compute1' --snapshotname 'compute-_cluster_installed' --running