From 583d429fb06d8b3057e2cf4e7b5b78d898254b2c Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Mon, 19 Sep 2016 12:13:28 +0200 Subject: [PATCH] =?UTF-8?q?Script=20r=C3=A9paration=20conteneur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.MD | 3 + demo_restore_crash.sh | 187 ++++++++++++++++++++++++++++++++++++++++++ demo_upgrade.sh | 2 - 3 files changed, 190 insertions(+), 2 deletions(-) create mode 100755 demo_restore_crash.sh diff --git a/README.MD b/README.MD index 23df42c..89f4a6c 100644 --- a/README.MD +++ b/README.MD @@ -31,5 +31,8 @@ Il va alterner toutes les 30 minutes (par défaut) les 2 conteneurs et rétablir Ce script est placé en cron par demo_lxc_build. demo_upgrade vérifie chaque nuit les mises à jour sur les conteneurs, et les applique le cas échéant. Si nécessaire, il se charge également de refaire le snapshot. +## demo_restore_crash +Tente de réparer les conteneurs qui ne démarre pas à partir des snapshots ou des archives de snapshots précédents. + Pour effectuer des modifications pérennes sur les conteneurs, il est possible d'ajouter des scripts dans le dossier upgrade.d. Ces scripts seront exécutés après l'upgrade des packages dans chaque conteneur. En cas d'échec d'exécution, le script sera mis de côté en attendant sa correction. Sinon, il sera archivé. diff --git a/demo_restore_crash.sh b/demo_restore_crash.sh new file mode 100755 index 0000000..b769cb3 --- /dev/null +++ b/demo_restore_crash.sh @@ -0,0 +1,187 @@ +#!/bin/bash + +# Tente de réparer les conteneurs LXC à partir des snapshots et des sauvegardes. + +# Récupère le dossier du script +if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$(echo $PWD/$(dirname "$0" | cut -d '.' -f2) | sed 's@/$@@')"; fi + +PLAGE_IP=$(cat "$script_dir/demo_lxc_build.sh" | grep PLAGE_IP= | cut -d '=' -f2) +IP_LXC1=$(cat "$script_dir/demo_lxc_build.sh" | grep IP_LXC1= | cut -d '=' -f2) +IP_LXC2=$(cat "$script_dir/demo_lxc_build.sh" | grep IP_LXC2= | cut -d '=' -f2) +LXC_NAME1=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME1= | cut -d '=' -f2) +LXC_NAME2=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME2= | cut -d '=' -f2) + +STOP_CONTAINER () { + MACHINE=$1 + if [ $(sudo lxc-info --name $MACHINE | grep -c "STOPPED") -eq 0 ]; then + echo "Arrêt du conteneur $MACHINE" + sudo lxc-stop -n $MACHINE + fi +} + +CHECK_CONTAINER () { + MACHINE=$1 + echo "Test du conteneur $MACHINE" + sudo lxc-start -n $MACHINE -d > /dev/null 2>&1 # Démarre le conteneur + sudo lxc-wait -n $MACHINE -s 'RUNNING' -t 20 # Attend pendant 20s maximum que le conteneur démarre +# sudo lxc-ls -f + if [ $(sudo lxc-info --name $MACHINE | grep -c "RUNNING") -ne 1 ]; then + return 1 # Renvoi 1 si le démarrage du conteneur a échoué + else + STOP_CONTAINER $MACHINE + return 0 # Renvoi 0 si le démarrage du conteneur a réussi + fi +} + +RESTORE_SNAPSHOT () { + MACHINE=$1 + echo -e "\e[1m> Restauration du snapshot du conteneur $MACHINE\e[0m" + sudo lxc-snapshot -r snap0 -n $MACHINE + CHECK_CONTAINER $MACHINE + STATUS=$? + if [ $STATUS -eq 1 ]; then + echo -e "\e[91m> Conteneur $MACHINE en défaut.\e[0m" + return 1 + else + echo -e "\e[92m> Conteneur $MACHINE en état de marche.\e[0m" + return 0 + fi +} + +RESTORE_ARCHIVE_SNAPSHOT () { + MACHINE=$1 + if ! test -e "/var/lib/lxcsnaps/$MACHINE/snap1.tar.gz"; then + echo "Aucune archive de snapshot pour le conteneur $MACHINE" + return 1 + fi + echo -e "\e[1m> Restauration du snapshot archivé pour le conteneur $MACHINE\e[0m" + echo "Suppression du snapshot" + sudo lxc-snapshot -n $MACHINE -d snap0 + echo "Décompression de l'archive" + sudo tar -x --acls --xattrs -f /var/lib/lxcsnaps/$MACHINE/snap0.tar.gz -C / + RESTORE_SNAPSHOT $MACHINE + return $? +} + +CLONE_CONTAINER () { + MACHINE_SOURCE=$1 + MACHINE_CIBLE=$2 + IP_SOURCE=$3 + IP_CIBLE=$4 + echo "Suppression du conteneur $MACHINE_CIBLE" + sudo lxc-snapshot -n $MACHINE_CIBLE -d snap0 + sudo rm -f /var/lib/lxcsnaps/$MACHINE_CIBLE/snap0.tar.gz + sudo lxc-destroy -n $MACHINE_CIBLE -f + + echo "\e[1m> Clone le conteneur $MACHINE_SOURCE sur $MACHINE_CIBLE\e[0m" + sudo sudo lxc-clone -o $MACHINE_SOURCE -n $MACHINE_CIBLE + + echo "Modification de l'ip du clone," + sudo sed -i "s@address $IP_SOURCE@address $IP_CIBLE@" /var/lib/lxc/$MACHINE_CIBLE/rootfs/etc/network/interfaces + echo "du nom du veth" + sudo sed -i "s@^lxc.network.veth.pair = MACHINE_SOURCE@lxc.network.veth.pair = $MACHINE_CIBLE@" /var/lib/lxc/$MACHINE_CIBLE/config + echo "Et enfin renseigne /etc/hosts sur le clone" + sudo sed -i "s@^127.0.0.1 $MACHINE_SOURCE@127.0.0.1 $MACHINE_CIBLE@" /var/lib/lxc/$MACHINE_CIBLE/rootfs/etc/hosts + + CHECK_CONTAINER $MACHINE_CIBLE + STATUS=$? + if [ $STATUS -eq 1 ]; then + echo -e "\e[91m> Conteneur $MACHINE_CIBLE en défaut.\e[0m" + else + echo -e "\e[92m> Conteneur $MACHINE_CIBLE en état de marche.\e[0m" + echo "Création d'un nouveau snapshot pour le conteneur $MACHINE_CIBLE" + sudo lxc-snapshot -n $MACHINE_CIBLE + fi + return $STATUS +} + +echo "Désactive le cron switch." +sudo sed -i "s/.*demo_switch.sh/#&/" /etc/cron.d/demo_switch # Le cron est commenté durant l'opération de maintenance. + +echo "Suppression des lock et arrêt forcé des conteneurs." +sudo rm -f /var/lib/lxc/$LXC_NAME1.lock_fileS +sudo rm -f /var/lib/lxc/$LXC_NAME2.lock_fileS +sudo rm -f /var/lib/lxc/$LXC_NAME1.lock_fileU +sudo rm -f /var/lib/lxc/$LXC_NAME2.lock_fileU + +STOP_CONTAINER $LXC_NAME1 +STOP_CONTAINER $LXC_NAME2 + +echo "Initialisation du réseau pour le conteneur." +if ! sudo ifquery lxc_demo --state > /dev/null; then + sudo ifup lxc_demo --interfaces=/etc/network/interfaces.d/lxc_demo +fi + +# Activation des règles iptables +echo "Configure le parefeu" +if ! sudo iptables -D FORWARD -i lxc_demo -o eth0 -j ACCEPT 2> /dev/null; then + sudo iptables -A FORWARD -i lxc_demo -o eth0 -j ACCEPT +fi +if ! sudo iptables -C FORWARD -i eth0 -o lxc_demo -j ACCEPT 2> /dev/null; then + sudo iptables -A FORWARD -i eth0 -o lxc_demo -j ACCEPT +fi +if ! sudo iptables -t nat -C POSTROUTING -s $PLAGE_IP.0/24 -j MASQUERADE 2> /dev/null; then + sudo iptables -t nat -A POSTROUTING -s $PLAGE_IP.0/24 -j MASQUERADE +fi + +# Vérifie l'état des conteneurs. +CHECK_CONTAINER $LXC_NAME1 +LXC1_STATUS=$? +CHECK_CONTAINER $LXC_NAME2 +LXC2_STATUS=$? + +if [ $LXC1_STATUS -eq 1 ]; then + echo -e "\e[91m> Conteneur $LXC_NAME1 en défaut.\e[0m" +else + echo -e "\e[92m> Conteneur $LXC_NAME1 en état de marche.\e[0m" +fi +if [ $LXC2_STATUS -eq 1 ]; then + echo -e "\e[91m> Conteneur $LXC_NAME2 en défaut.\e[0m" +else + echo -e "\e[92m> Conteneur $LXC_NAME2 en état de marche.\e[0m" +fi + +# Restauration des snapshots +if [ $LXC1_STATUS -eq 1 ]; then + RESTORE_SNAPSHOT $LXC_NAME1 + LXC1_STATUS=$? +fi +if [ $LXC2_STATUS -eq 1 ]; then + RESTORE_SNAPSHOT $LXC_NAME2 + LXC2_STATUS=$? +fi + +# Restauration des archives des snapshots +if [ $LXC1_STATUS -eq 1 ]; then + RESTORE_ARCHIVE_SNAPSHOT $LXC_NAME1 + LXC1_STATUS=$? +fi +if [ $LXC2_STATUS -eq 1 ]; then + RESTORE_ARCHIVE_SNAPSHOT $LXC_NAME2 + LXC2_STATUS=$? +fi + +# Si des erreurs persistent, tente de cloner depuis un conteneur sain +if [ $LXC1_STATUS -eq 1 ] && [ $LXC2_STATUS -eq 0 ] ; then + CLONE_CONTAINER $LXC_NAME2 $LXC_NAME1 $IP_LXC2 $IP_LXC1 + LXC1_STATUS=$? +fi +if [ $LXC2_STATUS -eq 1 ] && [ $LXC1_STATUS -eq 0 ]; then + CLONE_CONTAINER $LXC_NAME1 $LXC_NAME2 $IP_LXC1 $IP_LXC2 + LXC2_STATUS=$? +fi + +# Résultats finaux +if [ $LXC1_STATUS -eq 1 ] || [ $LXC2_STATUS -eq 1 ]; then + if [ $LXC1_STATUS -eq 1 ]; then + echo -e "\e[91m\n> Le conteneur $LXC_NAME1 n'a pas pu être réparé...\e[0m" + fi + if [ $LXC2_STATUS -eq 1 ]; then + echo -e "\e[91m\n> Le conteneur $LXC_NAME2 n'a pas pu être réparé...\e[0m" + fi +else + echo -e "\e[92m\n> Les 2 conteneurs sont sains et fonctionnels.\e[0m" +fi + +echo "Réactive le cron switch." +sudo sed -i "s/#*\*/\*/" /etc/cron.d/demo_switch # Le cron est décommenté diff --git a/demo_upgrade.sh b/demo_upgrade.sh index 342f75c..31c8fc1 100755 --- a/demo_upgrade.sh +++ b/demo_upgrade.sh @@ -6,8 +6,6 @@ # Récupère le dossier du script if [ "${0:0:1}" == "/" ]; then script_dir="$(dirname "$0")"; else script_dir="$(echo $PWD/$(dirname "$0" | cut -d '.' -f2) | sed 's@/$@@')"; fi -echo "$(date) U. boot upgrade" >> "$script_dir/debug.log" - LXC_NAME1=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME1= | cut -d '=' -f2) LXC_NAME2=$(cat "$script_dir/demo_lxc_build.sh" | grep LXC_NAME2= | cut -d '=' -f2) IP_LXC1=$(cat "$script_dir/demo_lxc_build.sh" | grep IP_LXC1= | cut -d '=' -f2)