Reconfiguración de interfaces en entornos virutales con máquinas virtuales Linux

En entornos virtuales es habitual clonar servidores. En Linux el sistema udev, al detectar un nuevo hardware con una MAC diferente, le asigna un número de interfaz secuencial. Da igual si se le ha borrado alguna interfaz previa, la nueva que se configure seguirá la numeración. Con este comportamiento, es posible que haya cosas que no funcionen, por ejemplo si tenemos un script que haga referencia al nombre de interfaz eth0. Si queremos recuperar la numeración deberemos modificar el fichero de reglas de udev y luego además revisar los scripts de configuración de las interfaces ya que probablemente las MACs no coincidan.
He creado un nuevo script, que se puede poner en el .bashrc del usuario root por ejemplo. Dicho script detectará si existe la interfaz eth0, en caso de no existir realizará la reconfiguración de udev, limpiará configuraciones de red previas y finalmente creará los nuevos ficheros de configuración. Para crear estos ficheros tendrá en cuenta si queremos utilizar un direccionamiento estático o dinámico (DHCP). 
Utilizando este script, siempre que clonemos la máquina y accedamos con el usuario root nos preguntará la configuración de red que queremos.
Ejemplo de uso (desde una consola ya que baja las interfaces):
Verificamos que el nombre de la interfaz eth0 no existe:

Configuración de red tras el clonado

Lanzamos el script, donde veremos que baja las inerfaces de red y pide si queremos borrar configuraciones previas:

Llamada al script netconfig.sh

Pide que tipo de configuración queremos en todas las interfaces:

Reconfiguración de las interfaces

Una vez terminada la ejecución del script vemos que la interfaz eth0 ya aparece y mantiene la MAC de la interfaz que veiamos en la primer imágen:

Configuración de red final

El script:

#!/bin/bash
function static {
hostname=`hostname`
read -r -p “Hostname: [${hostname}] ” hostname
if [ -z “$hostname” ]; then hostname=`hostname`; fi
read -r -p “IP address: ” ip
read -r -p “Netmask: ” mask
grep dhcp /etc/sysconfig/network-scripts/ifcfg-eth* 2>/dev/null >/dev/null
if [ $? -eq 0 ] ; then
echo “there is a network configured with dhcp which should configure your gateway”
else
read -r -p “Gateway: ” gate
if [ $? -eq 0 ] ; then
sed -i -e ‘s#^\(GATEWAY=\).*$#\1′”${gate}”‘#’ /etc/sysconfig/network
else
echo “GATEWAY=\”${gate}\”” >>/etc/sysconfig/network
fi
fi
#echo “HOSTNAME: ${hostname}\tIP: ${ip}\tNETMASK: ${mask}”
mac=`ifconfig ${iface} | grep eth | awk ‘{ print $5}’`
if [ -f /etc/sysconfig/network-scripts/ifcfg-${iface} ]; then
rm -r /etc/sysconfig/network-scripts/ifcfg-${iface}
fi
echo “DEVICE=\”${iface}\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “BOOTPROTO=\”static\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “NM_CONTROLLED=\”yes\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “ONBOOT=\”yes\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “TYPE=\”Ethernet\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “IPADDR=\”${ip}\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “NETMASK=\”${mask}\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “HWADDR=\”${mac}\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “DNS1=\”X.X.X.X\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “DNS2=\”Y.Y.Y.Y\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “DOMAIN=\”enterprise.com\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
sed -i -e ‘s#^\(HOSTNAME=\).*$#\1′”${hostname}”‘#’ /etc/sysconfig/network
grep GATEWAY /etc/sysconfig/network 2>/dev/null >/dev/null
}

function dhcp {
echo “Configuring DHCP for ${iface}”
hostname=`hostname`
read -r -p “Hostname: [${hostname}] ” hostname
if [ -z “$hostname” ]; then hostname=`hostname`; fi
mac=`ifconfig ${iface} | grep eth | awk ‘{ print $5}’`
if [ -f /etc/sysconfig/network-scripts/ifcfg-${iface} ]; then
rm -r /etc/sysconfig/network-scripts/ifcfg-${iface}
fi
echo “DEVICE=\”${iface}\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “BOOTPROTO=\”dhcp\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “HWADDR=\”${mac}\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “NM_CONTROLLED=\”yes\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “ONBOOT=\”yes\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
echo “TYPE=\”Ethernet\”” >> /etc/sysconfig/network-scripts/ifcfg-${iface}
sed -i -e ‘s#^\(HOSTNAME=\).*$#\1′”${hostname}”‘#’ /etc/sysconfig/network
}


ifconfig eth0 2>/dev/null >/dev/null
if [ $? -ne 0 ] ; then
echo “eth0 not found. Interface configuration…”
echo “Recreating interfaces”
# Rename eth1 with eth0    
echo “Stopping network”
service network stop

#Clearing devices and renaming
echo “UDEV Config…”
rm -f /etc/udev/rules.d/70-persistent-net.rules
#ls -l  /etc/udev/rules.d/70-persistent-net.rules
udevadm trigger
sleep 2
#ls -l  /etc/udev/rules.d/70-persistent-net.rules
ifdevs=`udevadm info –export-db | grep “INTERFACE=eth” | cut -d “=” -f2`
#echo “Interfaces ${ifdevs}”
count=0
for ifdev in ${ifdevs}; do
sed -i -e “s/${ifdev}/eth${count}/g” /etc/udev/rules.d/70-persistent-net.rules
# echo “sed -i -e ‘s/${ifdev}/eth${count}/g’ /etc/udev/rules.d/70-persistent-net.rules”
count=$((count+1))
# echo “count: ${count}”
done
udevadm trigger –attr-match=subsystem=net
#echo “udev Net rules”
#grep eth /etc/udev/rules.d/70-persistent-net.rules
    echo “—————————————————“
    
#Clearing configuration    
echo “Remove previous configuration”
for cfgfile in `ls /etc/sysconfig/network-scripts/ifcfg-eth*`; do
read -r -p “Remove previous configuration file ${cfgfile}? [y/N] ” response
case $response in
[yY])
rm -f ${cfgfile}
;;
*)
echo “Not removing ${cfgfile}”
;;
esac
done
    
#Setup ehternet devices
sleep 2
ifaces=`ifconfig -a | grep eth | awk ‘{ print $1}’`
#echo ${ifaces}
for iface in ${ifaces}; do
read -r -p “Do you want to configure a static IP for ${iface}? [y/N] ” response
case $response in
[yY])
static
;;
*)
read -r -p “Do you want to configure DHCP for ${iface}? [y/N] ” respdhcp
case $respdhcp in
[yY])
dhcp
;;
*)
echo “Not configuring ${iface}.”
#rm -r /etc/sysconfig/network-scripts/ifcfg-${iface}
;;
esac
;;
esac
done
#Start networking
echo “Starting networking”
service network start
fi
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s