Administración de sistemas, scripts

Migración contendores Lxc 3.0 entre servidores con backend btrfs

Print Friendly, PDF & Email

Migración Lxc 3.0 entre servidores con backend btrfs

Este Script migra contenedores lxc de versión 2.x ó inferior, con backend ext4, a otro servidor con lxc 3.0 y backend btrfs.

Si buscáis una versión más simple que no toque la configuración mirad este post https://blog.hackingcodeschool.net/migrar-contenedores-lxc/

#!/bin/bash

# Author: Kao
# Version: 1.0
# Fecha: 19 septiembre 2018

# Este script migra cualquier cantidad de contenedores desde un fichero proporcionado de un servidor a otro
# Deja el contendor en origen apagado y con la terminación .old para no generar errores
# Actualiza la configuración a la versión 3 de lxc
# Monta el contendor en destino con btrfs
# Configura la red dentro del contenedor

# Ejemplo uso: bash esteScript.sh ficheroLxcMigrar servidorDestino
# bash scriptmigra migrabetaparticipa prod1.podemos.info

# Recogida de variables
file=$1 #fichero máquinas
server=$2 #tipo ip o dominio

# Muestra ayuda de uso del script
if [ "$1" == "--h" ]; then
  
  echo "Usage: basename $0 "
  echo "Recibo un fichero de texto como primer parámetro"
  echo "El fichero debe contener una lista de nombres de máquinas, una por fila para migrar a otro servidor"
  echo "Paro las máquinas y realizo la migración"
  echo "El servidor de destino ha de tener la llave pública de origen en su fichero '/etc/ssh/authorized_keys' "
  echo "./scriptmigra fichero servidor"

  exit 0
fi

# Empieza la acción

for maq in $(cat<$file);
   do

      # En local vamos al directorio y paramos la máquina que se va a migrar para evitar posibles errores
      cd /var/lib/lxc
      echo "Deteniendo $maq, espere unos segundos"
      lxc-stop -n  $maq;

      ##En remoto creamos el directorio para nuestra maquinita y su subvolumen con btrfs
      #ssh -p 3222 -i /root/.ssh/id_rsa root@$server  "mkdir /var/lib/lxc/$maq";
      #ssh -p 3222 -i /root/.ssh/id_rsa root@$server  "btrfs subvolume create /var/lib/lxc/$maq/rootfs";
      #echo "Volumen creado"

      #Realizamos la copia con rsync
      echo "Comenzando la copia con rsync, esto puede tardar un poco..."
      rsync -azp -e 'ssh -p 3222 -i /root/.ssh/id_rsa' $maq root@$server:/var/lib/lxc/ -H -h --stats --numeric-ids
      echo $maq migrada
      #En local le configuramos el autostat en 0 y le ponemos .old al nombre
      sed -i  's/lxc.start.auto = 1/lxc.start.auto = 0/g' /var/lib/lxc/$maq/config
      sed -i  's#lxc.rootfs = /var/lib/lxc/$maq/rootfs#lxc.rootfs = /var/lib/lxc/$maq.old/rootfs#g' /var/lib/lxc/$maq/config
      sed -i  's/lxc.utsname = $maq/lxc.utsname = $maq.old/g' /var/lib/lxc/$maq/config
      mv /var/lib/lxc/$maq /var/lib/lxc/$maq.old


      #En remoto:

      #Configuramos el sistema de ficheros para que use btrfs
      ssh -p 3222 -i /root/.ssh/id_rsa root@$server "mv /var/lib/lxc/$maq/rootfs /var/lib/lxc/$maq/rootfs.old"
      ssh -p 3222 -i /root/.ssh/id_rsa root@$server "btrfs subvolume create /var/lib/lxc/$maq/rootfs"
      ssh -p 3222 -i /root/.ssh/id_rsa root@$server "mv /var/lib/lxc/$maq/rootfs.old/* /var/lib/lxc/$maq/rootfs/"


      # Actualizamos la configuración a la version 3 de lxc y corregimos algunos errores según nuestro template
      ssh -p 3222 -i /root/.ssh/id_rsa root@$server "lxc-update-config -c /var/lib/lxc/$maq/config"

      # Le ponemos el backend creado, el autostart en 1 y le arreglamos algunos valores necesarios para la nueva versión
      ssh -p 3222 -i /root/.ssh/id_rsa root@$server "sed -i 's#lxc.rootfs = /var/lib/lxc/$maq/rootfs#lxc.rootfs = btrfs:/var/lib/lxc/$maq/rootfs#g' /var/lib/lxc/$maq/config";
      ssh -p 3222 -i /root/.ssh/id_rsa root@$server "sed -i 's/lxc.start.auto = 0/lxc.start.auto = 1/g' /var/lib/lxc/$maq/config";
      ssh -p 3222 -i /root/.ssh/id_rsa root@$server "sed -i 's/ubuntu.common.conf/common.conf/g' /var/lib/lxc/$maq/config";
      ssh -p 3222 -i /root/.ssh/id_rsa root@$server "sed -i 's/lxc.net.ipv4/lxc.net.0.ipv4.address/1g' /var/lib/lxc/$maq/config";
      #según la versión se usa net o network así que nos aseguramos
      ssh -p 3222 -i /root/.ssh/id_rsa root@$server "sed -i 's/lxc.network.ipv4/lxc.net.0.ipv4.address/1g' /var/lib/lxc/$maq/config";

      #Algunas configuraciones especiales para retrocompatibilidad con Ubuntu 14
      ssh -p 3222 -i /root/.ssh/id_rsa root@$server  bash -c "'cat >> /var/lib/lxc/$maq/config <<EOF
# For Ubuntu 14.04
lxc.mount.entry = /sys/kernel/debug sys/kernel/debug none bind,optional 0 0
lxc.mount.entry = /sys/kernel/security sys/kernel/security none bind,optional 0 0
lxc.mount.entry = /sys/fs/pstore sys/fs/pstore none bind,optional 0 0
lxc.mount.entry = mqueue dev/mqueue mqueue rw,relatime,create=dir,optional 0 0
lxc.arch = linux64
EOF'"

      #Modificamos la configuración de la red de dentro del contedor a manual para que los servicios arranquen de forma instantánea
      ssh -p 3222 -i /root/.ssh/id_rsa root@$server  bash -c "'cat > /var/lib/lxc/$maq/rootfs/etc/network/interfaces <<EOF
      auto lo
      iface lo inet loopback
      auto eth0
      iface eth0 inet manual
EOF'"

    #ssh -p 3222 -i /root/.ssh/id_rsa root@$server "lxc-start -n $maq -d && exit"
done

Tagged ,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.