A partir de la arquitectura de mi sistema de actualización de servidores, decidí implementar un nuevo script para verificar el estado de las VMware Tools, y reinstalarlas de forma desatendida cuando sea necesario.



En uno de mis anteriores artículos (Recuperar las VMware Tools luego de actualizar el kernel en un guest CentOS) comentaba que al momento de actualizar el kernel en un guest CentOS, las VMware Tools dejan de funcionar debido a que los módulos del kernel Linux provistos por VMware para dar soporte a las mismas dejan de ser cargados.

Dado que tengo algunos servidores CentOS virtualizados con VMware, y las actualizaciones de kernel ocurren con cierta frecuencia, decidí implementar este script que automatice el proceso de reinstalación de las VMware Tools en todos los servidores en los que no estén funcionando.

Este script funciona exactamente igual al script de actualización de servidores, en el sentido que utiliza autenticación por clave pública al conectarse por SSH, y sudo para ejecutar como root el script de instalación vmware-config-tools.pl en cada uno de los servidores (los cuales se toman del archivo de configuración servidores.conf).

#!/usr/bin/env bash

# Localización del archivo de configuración
CONF="servidores.conf"
LOGDIR="log"

# Comando para verificar estado
CMD_DEBIAN="LANG=C sudo service vmware-tools status"
CMD_CENTOS="LANG=C sudo initctl status vmware-tools"

# Comando para instalar/actualizar vmware-tools
CMD_UPDT="LANG=C sudo vmware-config-tools.pl -d"

# Configuración del diálogo
OPCIONES=""
INDICE=1

# Datos de los servidores
USERS="users"
HOSTS="hosts"
PORTS="ports"
OSES="oses"

# Obtener fecha y hora
FECHAHORA=$(date +%Y-%m-%d_%H-%M-%S)
echo === Verificando vmware-tools \($FECHAHORA\) ===

# CONF - username:host:port:os
for SERVER in $(cat $CONF)
do
    # Parsear linea de configuración
    USER=$(echo $SERVER | cut -d ':' -f1)
    HOST=$(echo $SERVER | cut -d ':' -f2)
    PORT=$(echo $SERVER | cut -d ':' -f3)
    OS=$(echo $SERVER | cut -d ':' -f4)

    echo -n Verificando $HOST...

    # Verificar si el servicio vmware-tools está corriendo
    case $OS in
        "debian")
            VMWARE_TOOLS_RUNNING=$(ssh -p $PORT $USER@$HOST $CMD_DEBIAN)
            if [[ $VMWARE_TOOLS_RUNNING == *"is running"* ]]
            then
                echo " vmware-tools OK."
                REINSTALL=0
            else
                echo " el servicio vmware-tools NO se encuentra en ejecución."
                REINSTALL=1
            fi;;
        "centos")
            VMWARE_TOOLS_RUNNING=$(ssh -t -p $PORT $USER@$HOST $CMD_CENTOS 2>/dev/null)
            if [[ $VMWARE_TOOLS_RUNNING == *"running"* ]]
            then
                echo " vmware-tools OK."
                REINSTALL=0
            else
                echo " el servicio vmware-tools NO se encuentra en ejecución."
                REINSTALL=1
            fi;;
    esac

    # Si es necesario reinstalar/actualizar, agregar a la lista
    if [ $REINSTALL -gt 0 ]
    then
        OPCIONES=("${OPCIONES[@]}" $INDICE "$HOST" off)
        USERS=("${USERS[@]}" $USER)
        HOSTS=("${HOSTS[@]}" $HOST)
        PORTS=("${PORTS[@]}" $PORT)
        OSES=("${OSES[@]}" $OS)
        ((INDICE++))
    fi

done

# Salir si está todo OK
if [ $INDICE -eq 1 ]
then
    exit 0
fi

# Imprimir diálogo selector de opciones
SELECCION=$(/usr/bin/dialog --separate-output --checklist "Seleccione los sistemas donde reinstalar vmware-tools" 22 76 16"${OPCIONES[@]}" 2>&1 > /dev/tty)

# Lanzar instalación paralelo
for SERV in $SELECCION
do
    echo Instalando VMware Tools en $SERV ${USERS[$SERV]}\@${HOSTS[$SERV]}\:${PORTS[$SERV]} ${OSES[$SERV]}

    # Reinstalar vmware-tools en el servidor
    case ${OSES[$SERV]} in
        "debian") (ssh -p ${PORTS[$SERV]} ${USERS[$SERV]}@${HOSTS[$SERV]} $CMD_UPDT; echo $?.FINALIZADO) > $LOGDIR/vmware-tools_$FECHAHORA-${HOSTS[$SERV]}.log 2>&1 &;;
        "centos") (ssh -t -t -p ${PORTS[$SERV]} ${USERS[$SERV]}@${HOSTS[$SERV]} "$CMD_UPDT"; echo $?.FINALIZADO) > $LOGDIR/vmware-tools_$FECHAHORA-${HOSTS[$SERV]}.log 2>&1 &;;
    esac
done

# Esperar que finalicen todas las actualizaciones
while [ 1 ]
do
    # Esperar 2 segundos
    sleep 2

    FIN=1

    # Revisar todos los archivos de log
    for SERV in $SELECCION
    do
        # Determinar si finalizó
        FINALIZADO=$(tail $LOGDIR/vmware-tools_$FECHAHORA-${HOSTS[$SERV]}.log 2>/dev/null | grep "FINALIZADO" | wc -l)
        if [ $FINALIZADO -eq 0 ]
        then
            FIN=0
            break
        fi
    done

    if [ $FIN -gt 0 ]
    then
        break
    fi
done

echo "Finalizado"

# Verificar códigos de retorno
ERRORES=0
for SERV in $SELECCION
do
    # Obtener código de retorno
    RET=$(grep ".FINALIZADO" $LOGDIR/vmware-tools_$FECHAHORA-${HOSTS[$SERV]}.log | cut -d'.' -f1)
    if [ $RET -gt 0 ]
    then
        echo "*****" ${HOSTS[$SERV]} ha finalizado con ERRORES
        ERRORES=1
    else
        echo "*" ${HOSTS[$SERV]} ha finalizado correctamente
    fi
done

if [ $ERRORES -eq 1 ]
then
    echo
    echo "***** ADVERTENCIA ****"
    echo "1 o más instalaciones han finalizado con errores"
    echo
fi

read -p "Presione [Enter] para continuar..."

# Revisar logs
for LOGFILE in $LOGDIR/vmware-tools_$FECHAHORA*
do
    less $LOGFILE
done

 

El script primero verifica el estado de las VMware Tools en cada servidor, y luego ofrece reinstalarlas en los sistemas en que no están funcionando a través de un menú.

Soporta tanto sistemas Debian como CentOS, y el formato del archivo de configuración se encuentra en el mencionado artículo (así como la explicación para habilitar la autenticación por clave pública con SSH).

En orden de que el usuario "sysadmin" en todos los servidores remotos sea capaz de ejecutar el instalador vmware-config-tools.pl como superusuario, es necesario agregar las siguientes líneas en la configuración de sudo (/etc/sudoers.d/):

User_Alias USR_ADMIN = sysadmin
Cmnd_Alias CMD_VMWARE_TOOLS_STATUS = /sbin/initctl status vmware-tools
Cmnd_Alias CMD_VMWARE_TOOLS_CONFIG = /usr/bin/vmware-config-tools.pl -d
USR_ADMIN SERVIDOR = NOPASSWD:CMD_VMWARE_TOOLS_STATUS
USR_ADMIN SERVIDOR = NOPASSWD:CMD_VMWARE_TOOLS_CONFIG

Referencias

Mejorando mi sistema de actualización de servidores

Sysadmin vago: cómo actualizar todos los servidores de tu organización ejecutando un único comando

Recuperar las VMware Tools luego de actualizar el kernel en un guest CentOS


Tal vez pueda interesarte


Compartí este artículo