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