Minientrada

Automatización de RACADM con Python

Hasta ahora te mostré como ejecutar comandos RACADM para hacer ciertas cosas sobre iDRAC. Pero convengamos que esto solo nos ahorra tener que ingresar a la interfaz gráfica para ejecutar ciertas acciones. Si bien es un gran paso, aún nos falta para lograr la automatización completa y ahí es donde viene a nuestra ayuda Python.

A lo largo de esta entrada voy a mostrarte como ejecutar un comando RACADM, sobre la cantidad de servidores que precises, con la ayuda de un script de Python.

Debo aclarar que no soy programador, solo utilizo Python como herramienta de automatización e intento aprender un poco más día a día. Si ofendo a alguien con mi código le pido disculpas. Y si lo ofendo tanto que le dan ganas de ayudarme a mejorar, bienvenido sea. :)

Contexto

  • Ejecuto el script desde una Virtual Machine (VM) con Debian 10 que corre en mi equipo.
  • En la VM instalé Python v3.x. Acá hay una receta para instalar Python v3.8 sobre Debian 10. Aunque seguramente el Linux que instalaste ya lo tiene. Verificarlo con el comando: ‘python3 -v’.
  • En la VM también instalé RACADM como lo explico en una entrada anterior.

Script bloque a bloque

Bloque 1

En este primer bloque vamos a capturar por teclado los datos necesarios para conectarnos al iDRAC: usuario, contraseña, dirección ipv4 de iDRAC y cantidad de hosts a configurar.

import subprocess
​
# Rutina - Obtener datos para conectarnos al iDRAC:
# usuario, contraseña, ipv4, cantidad de hosts a configurar
#
# Obtener usuario, si se presiona Enter el usuario será 'root'
usuario = input('Usuario de iDRAC? [presionar Enter para root]: ')
if usuario == '':
    usuario = 'root'
# Obtener contraseña, si se presiona Enter la contraseña será 'calvin'
contraseña = input('Contraseña de iDRAC? [presionar Enter para calvin]: ')
if contraseña == '':
    contraseña = 'calvin'
# Obtener dirección IPv4 de iDRAC, el dato no puede ser 'null'
# no se valida formato, dirección válida ni nada por el estilo
while True:
    ip_idrac = input('Dirección IPv4 de iDRAC del primer host? ')
    if ip_idrac == '':
        print('La dirección IP no puede ser null! Por favor ingresar un dato.')
        continue
    else:
        break
# Obtener la cantidad de hosts (de iDRACs) que se van a configurar
# se supone que las direcciones IP serán consecutivas
while True:
    cant_hosts = int(input('Cuántos hosts vamos a configurar? '))
    if cant_hosts == '':
        print('can not be null!')
        continue
    else:
        hosts = int(cant_hosts)
        break
# Fin de rutina
Bloque 2

En este bloque vamos a identificar la parte de host de la dirección IP que el usuario ingresó en el bloque anterior. Este dato lo vamos a utilizar en el bloque siguiente.

# Rutina - Identificar el último octeto de la dirección IPv4
# al finalizar la variable ultimo_octeto será igual al valor
# del último octeto de la dirección IPv4 ingresada
#
# Parte de host de la dirección IPv4
ultimo_punto = ip_idrac.rfind('.')
comienza = ultimo_punto + 1
termina = len(ip_idrac)
red = ip_idrac[0:ultimo_punto+1]
ultimo_octeto = ip_idrac[comienza:termina]
# Fin de rutina
Bloque 3

Esta es la parte principal del script. Ejecutaremos el mismo comando RACADM, indicado en la línea subprocess.call por cada host.

Podemos reutilizar este script con tan solo modificar esa línea de comando RACADM.

# Rutina - Main
#
i = 0
# Por cada uno de los hosts se ejecutará el comando RACADM que está dentro del bucle
while i < hosts:
   # Genera la dirección IP de iDRAC haciendo merge de la porción de red + la porción de host
   ip_idrac = red + str(ultimo_octeto)
   # Ejecuta el comando RACADM
   # esta sería la única línea a modificar para poder reutilizar el script
   subprocess.call(['racadm', '-r', ip_idrac, '-u', usuario, '-p', contraseña, 'getsysinfo', '--nocertwarn'])
   # Incrementamos los contadores
   ultimo_octeto = int(ultimo_octeto) + 1
   i = int(i) + 1
# Fin de rutina

Listo. Lo único que deberías hacer para probarlo es pegar los bloques en orden dentro de un archivo del tipo getinfo.py y ejecutarlo de este modo.

python3 getinfo.py

Disclaimer: IMPORTANTE utiliza esta información bajo tu responsabilidad, no me hago responsable de los resultados. No aplicar en ambiente productivo (1) sin haberlo probado antes y (2) sin tener copia de seguridad.

Anuncio publicitario
Minientrada

Dell PowerEdge server: actualización de firmware utilizando RACADM update

En una entrada anterior explicaba como actualizar el firmware de un servidor utilizando el ISO booteable. Es una opción muy interesante, el único tema es que este ISO no se actualiza todos los días. Con lo cual puede ocurrir que, desde la última versión disponible del ISO a hoy, existan nuevas versiones de firmware de uno o más componentes que vas a tener que actualizar a mano.

Planteado el problema voy a explicar como actualizar desde CLI mediante RACADM el firmware de un dispositivo, utilizando la última versión disponible.

Pero antes de nada un comentario importante. Realizar la actualización de este modo solo justifica si tenemos por delante la misión de ejecutarlo sobre 5, 10 o más servidores. En otro caso no se si amerita, aunque una vez montado todo, es sumamente cómodo hacerlo de este modo.

Pasos que vamos a ejecutar

  1. Verificar versiones actuales de firmware con el comando swinventory. Básicamente para saber que tenemos que actualizar.
  2. Descargar la versión actualizada del firmware desde Dell EMC. En este link, en el paso 1, explican como hacerlo.
  3. Crear el recurso de red que comparta el paquete de actualización: CIFS/NFS/HTTP/HTTPS/FTP
  4. Contar con RACADM instalado. En esta entrada expliqué como instalarlo.
  5. Actualizar el firmware y comprobar como quedó todo.

Procedimiento paso a paso

Paso 1

Vamos a verificar cual es la versión actual del firmware que me interesa actualizar. En este caso los Drivers for OS Deployment.

racadm -r 10.10.10.31 -u root -p calvin swinventory --nocertwarn

La salida del comando debería verse algo así.

Please wait while the software Inventory is being fetched. Depending on the network speed, it may take sometime to complete this operation.
-------------------------SOFTWARE INVENTORY------------------------
...
ComponentType = APPLICATION
ElementName = Dell OS Driver Pack, 19.04.05, A00
FQDD = DriverPack.Embedded.1:LC.Embedded.1
InstallationDate = 2019-12-07T03:01:32Z
Current Version = 19.04.05
...

Acabamos de identificar que la versión de los Drivers for OS Deployment es la 19.04.05, A00.

Paso 2

Vamos a la página de soporte de Dell EMC y descargamos la versión actualizada.

Paso 3

Tenemos que crear un repositorio local con el paquete de actualización. En mi caso levanté un simple y sencillo servidor HTTP local, pero podrías utilizar cualquiera de estas tecnologías para compartirlo: CIFS/NFS/HTTP/HTTPS/FTP

Paso 4

Requiere tener instalado RACADM, en entradas anteriores expliqué como instalarlo en Windows y en GNU/Linux.

Paso 5

Finalmente, este es el comando que vamos a utilizar para actualizar el firmware.

racadm -r 10.10.10.31 -u root -p calvin update -f Drivers-for-OS-Deployment_Application_6GCV7_WN64_19.12.05_A00.EXE -l http://10.10.10.100/

-r 10.10.10.31: dirección IP de iDRAC.

-u root: usuario de iDRAC.

-p calvin: contraseña de acceso al iDRAC.

update: el comando RACADM utilizado para actualizar.

-f Drivers-for-OS-Deployment_Application_6GCV7_WN64_19.12.05_A00.EXE: el nombre del paquete de actualización.

-l http://10.10.10.100/: la dirección IP del server HTTP local.

La salida del comando debería verse algo así.

RAC987: Firmware update job for Drivers-for-OS-Deployment_Application_6GCV7_WN64_19.12.05_A00.EXE is initiated. This firmware update job may take several minutes to complete depending on the
component or firmware being updated. To view the progress of the job, use the
"racadm jobqueue view" command. If the job is scheduled, the system will require a manual reboot.
To reboot the system  manually, use the "racadm serveraction powercycle" command. 

La actualización de este paquete en particular no requiere reinicio para aplicarse.

Vamos a ver la cola de tareas para chequear como viene todo.

racadm -r 10.10.10.31 -u root -p calvin jobqueue view --nocertwarn
[Job ID=JID_912968891999]
Job Name=Firmware Update: Drivers for OS Deployment
Status=Downloading
Start Time=[Not Applicable]
Expiration Time=[Not Applicable]
Message=[RED110: Downloading the Drivers-for-OS-Deployment_Application_6GCV7_WN64_19.12.05_A00.EXE update package.]
Percent Complete=[NA]

Todo va bien, desde la perspectiva del iDRAC se está descargando el paquete de actualización.

Minutos más tarde volvemos a ejecutar el mismo comando para ver la cola de tareas y comprobamos que se aplicó.

racadm -r 10.10.10.31 -u root -p calvin jobqueue view --nocertwarn
[Job ID=JID_912968891999]
Job Name=Firmware Update: Drivers for OS Deployment
Status=Completed
Start Time=[Not Applicable]
Expiration Time=[Not Applicable]
Message=[RED001: Job completed successfully.]
Percent Complete=[100]

Vamos a hacer un último chequeo utilizando el comando nuevamente el comando swinventory.

racadm -r 10.10.10.31 -u root -p calvin swinventory --nocertwarn
...
ComponentType = APPLICATION
ElementName = Dell OS Driver Pack, 19.12.05, A00
FQDD = DriverPack.Embedded.1:LC.Embedded.1
InstallationDate = 2020-06-04T13:56:19Z
Current Version = 19.12.05
...

Y validamos que la versión del OS Driver pack es la 19.12.05, A00.

Espero que esta técnica te sea útil y ¡feliz deployment!

Entradas relacionadas

Disclaimer: IMPORTANTE utiliza esta información bajo tu responsabilidad, no me hago responsable de los resultados. No aplicar en ambiente productivo (1) sin haberlo probado antes y (2) sin tener copia de seguridad.

Minientrada

iDRAC: modificación del puerto de acceso de VNC con RACADM

En una entrada anterior te comenté que son las Dell EMC OpenManage DRAC Tools.

La verdad es que yo utilizo bastante RACADM, principalmente para automatizar tareas de configuración rutinarias. Del estilo hay que configurar los datos de DNS primario y secundario en 30 o 40 servidores de un saque (léase todos a la vez). Escribí un post con este ejemplo, justamente, te dejo el link por si te interesa leerlo.

En esta ocasión el objetivo es modificar el VNC port desde 5900 a 10000, por ejemplo. Esto es porque existen restricciones en la red local, por política de seguridad el puerto 5900 está bloqueado en toda la LAN. De no modificarlo luego no vamos a poder abrir remotamente la consola (KVM) del servidor.

Obtener listado de puertos configurados en iDRAC vía RACADM

Vamos a verificar cual es la configuración de puertos actual. En esta instancia podés utilizar la línea de comandos de Windows o un bash de Linux, lo que te quede más cómodo.

racadm -r 10.10.10.31 -u root -p calvin getconfig -g cfgRacTuning --nocertwarn

La salida de este comando se ve así.

cfgRacTuneRemoteRacadmEnable=Enabled
cfgRacTuneWebserverEnable=Enabled
cfgRacTuneHttpPort=80
cfgRacTuneHttpsPort=443
cfgRacTuneTelnetPort=23
cfgRacTuneSshPort=22
cfgRacTuneConRedirEnable=Enabled
cfgRacTuneConRedirPort=5900
cfgRacTuneConRedirEncryptEnable=Enabled
...

Perfecto, ya tenemos lo que queremos, actualmente el valor de cfgRacTuneConRedirPort es 5900 (así es como viene por defecto).

Configurar el nuevo valor vía RACADM

Vamos a modificar ahora ese valor a 10000 para cumplir con el requerimiento. Una cosa importante a tener en cuenta, luego de ejecutar el comando el iDRAC hace una especie de soft reset para aplicar los cambios. Vale decir que si estabas conectado al iDRAC vas a perder la conexión por unos segundos, luego todo vuelve a la normalidad.

racadm  -r 10.10.10.31 -u root -p calvin config -g cfgRacTuning -o cfgRacTuneConRedirPort 10000 --nocertwarn

La salida del comando se ve así.

[Key=idrac.Embedded.1#VirtualConsole.1]
Object value modified successfully

Y si verificamos nuevamente el estado de la configuración de puertos vamos a ver que el cambio se aplicó.

racadm -r 10.10.10.31 -u root -p calvin getconfig -g cfgRacTuning --nocertwarn
cfgRacTuneRemoteRacadmEnable=Enabled
cfgRacTuneWebserverEnable=Enabled
cfgRacTuneHttpPort=80
cfgRacTuneHttpsPort=443
cfgRacTuneTelnetPort=23
cfgRacTuneSshPort=22
cfgRacTuneConRedirEnable=Enabled
cfgRacTuneConRedirPort=10000
cfgRacTuneConRedirEncryptEnable=Enabled
...

Disclaimer: IMPORTANTE utiliza esta información bajo tu responsabilidad, no me hago responsable de los resultados. No aplicar en ambiente productivo (1) sin haberlo probado antes y (2) sin tener copia de seguridad.