Automatización de Respaldo y Monitoreo de Tomcat con PowerShell

Backups PowerShell Windows

La administración de servidores Tomcat requiere tareas recurrentes para garantizar la integridad y disponibilidad de las aplicaciones desplegadas. Este artículo detalla un script en PowerShell que automatiza el proceso de respaldo de configuraciones críticas y aplicaciones, mientras monitorea el estado del proceso usando Zabbix.


Objetivos del Script

  1. Respaldar directorios clave de Tomcat:
    • webapps: Contiene las aplicaciones desplegadas.
    • conf: Incluye configuraciones críticas del servidor.
  2. Registrar el proceso de respaldo:
    • Genera un archivo de log detallado.
  3. Eliminar respaldos antiguos:
    • Archivos ZIP de más de 7 días.
  4. Integrar monitoreo con Zabbix:
    • Reporta el estado del respaldo al servidor Zabbix.

Detalle del Script

Configuración de Variables

Las variables iniciales definen rutas importantes, nombres de archivos y configuraciones de retención:

$webapps = "C:\TOMCAT\Tomcat 9.0\webapps"
$tomcat_conf = "C:\TOMCAT\Tomcat 9.0\conf"
$directorioDestino = "\\xxx.xxx.xxx.xxx\respaldos"
$fecha = Get-Date -Format "dd-MM-yyyy"
$nombre_webapps_Comprimido = "webapps_$fecha.zip"
$nombre_conf_Comprimido = "tomcat_conf_$fecha.zip"

Registro de Eventos

Se implementa una función para registrar eventos en un archivo de log:

function Agregar-Log {
    param([string]$mensaje)
    $timestamp = Get-Date -Format 'dd-MM-yyyy HH:mm:ss'
    Add-Content -Path $rutaArchivoLog -Value "$timestamp - $mensaje"
}

Compresión y Respaldo

El script utiliza la clase System.IO.Compression.ZipFile para comprimir los directorios webapps y conf:

Set-Location -Path $webapps
[System.IO.Compression.ZipFile]::CreateFromDirectory((Get-Location).Path, $ruta_webapps_Comprimido)
Agregar-Log "Directorio webapps comprimido y respaldado con éxito en $ruta_webapps_Comprimido"

Set-Location -Path $tomcat_conf
[System.IO.Compression.ZipFile]::CreateFromDirectory((Get-Location).Path, $ruta_conf_Comprimido)
Agregar-Log "Directorio conf comprimido y respaldado con éxito en $ruta_conf_Comprimido"

En caso de error, se captura la excepción para registrar el fallo en el log.

Eliminación de Respaldos Antiguos

Los respaldos que exceden el periodo de retención (7 días) se eliminan automáticamente:

$diasAntiguedad = -7
$fechaLimite = (Get-Date).AddDays($diasAntiguedad)
Get-ChildItem -Path $directorioDestino -Filter "*.zip" -File |
Where-Object { $_.LastWriteTime -lt $fechaLimite } |
ForEach-Object {
    Remove-Item -Path $_.FullName -Force
    Agregar-Log "Archivo antiguo borrado: $($_.FullName)"
}

Integración con Zabbix

Para enviar el estado del respaldo, se configura la herramienta zabbix_sender:

$zabbixSenderPath = "C:\Program Files\Zabbix Agent\zabbix_sender.exe"
$zabbixServer = "xxx.xxx.xxx.xxx"
$zabbixHost = "Nombre_Host"
$claveEstadoRespaldo = "estado_respaldo"

El estado se determina mediante una búsqueda de la palabra clave Error en el log:

$estadoRespaldo = 0  # Por defecto, estado sin errores
if (Select-String -Path $rutaArchivoLog -Pattern "Error") {
    $estadoRespaldo = 1
}

& $zabbixSenderPath -z $zabbixServer -s $zabbixHost -k $claveEstadoRespaldo -o $estadoRespaldo
Agregar-Log "Estado de respaldo enviado a Zabbix con éxito."

Salida y Finalización

El script finaliza devolviendo el estado del respaldo y registrando el evento en el log:

Agregar-Log "Proceso de respaldo completado. Estado del respaldo: $estadoRespaldo."
exit [int]$estadoRespaldo

Beneficios del Script

  • Automatización: Simplifica tareas de respaldo y limpieza, reduciendo errores humanos.
  • Monitoreo en tiempo real: La integración con Zabbix permite alertar al equipo ante fallos.
  • Escalabilidad: Adaptable a otros entornos de servidor y configuraciones.

Script Completo

# Configuración de variables
$webapps = "C:\TOMCAT\Tomcat 9.0\webapps"
$tomcat_conf = "C:\TOMCAT\Tomcat 9.0\conf"
$directorioDestino = "\\xxx.xxx.xxx.xxx\respaldos"
$fecha = Get-Date -Format "dd-MM-yyyy"
$nombre_webapps_Comprimido = "webapps_$fecha.zip"
$nombre_conf_Comprimido = "tomcat_conf_$fecha.zip"
$ruta_webapps_Comprimido = Join-Path -Path $directorioDestino -ChildPath $nombre_webapps_Comprimido
$ruta_conf_Comprimido = Join-Path -Path $directorioDestino -ChildPath $nombre_conf_Comprimido
$rutaArchivoLog = Join-Path -Path $directorioDestino -ChildPath "log_$fecha.txt"
$diasAntiguedad = -7

# Función para agregar entradas al log
function Agregar-Log {
    param(
        [string]$mensaje
    )
    $timestamp = Get-Date -Format 'dd-MM-yyyy HH:mm:ss'
    $mensajeCompleto = "$timestamp - $mensaje"
    Add-Content -Path $rutaArchivoLog -Value $mensajeCompleto
    }

# Inicializar el registro
Agregar-Log "Inicio del respaldo: $(Get-Date -Format 'dd-MM-yyyy HH:mm:ss')"

# Comprimir el contenido del directorio de origen
try {
    # Cambiar al directorio webapps y comprimir su contenido
    Set-Location -Path $webapps
    Add-Type -AssemblyName System.IO.Compression.FileSystem
    [System.IO.Compression.ZipFile]::CreateFromDirectory((Get-Location).Path, $ruta_webapps_Comprimido)
    Agregar-Log "Directorio webapps comprimido y respaldado con éxito en $ruta_webapps_Comprimido"

    # Cambiar al directorio tomcat_conf y comprimir su contenido
    Set-Location -Path $tomcat_conf
    [System.IO.Compression.ZipFile]::CreateFromDirectory((Get-Location).Path, $ruta_conf_Comprimido)
    Agregar-Log "Directorio conf comprimido y respaldado con éxito en $ruta_conf_Comprimido"
}
catch {
    Agregar-Log "Error al comprimir el respaldo: $_"
}

# Volver al directorio de origen
Set-Location -Path (Split-Path -Path $PSCommandPath -Parent)

# Finalizar el registro
Agregar-Log "Fin del respaldo: $(Get-Date -Format 'dd-MM-yyyy HH:mm:ss')"

# Obtener la fecha límite para los archivos a borrar
$fechaLimite = (Get-Date).AddDays($diasAntiguedad)

# Obtener la lista de archivos ZIP en el directorio de destino y borrar los antiguos
try {
    Get-ChildItem -Path $directorioDestino -Filter "*.zip" -File | Where-Object { $_.LastWriteTime -lt $fechaLimite } | ForEach-Object {
        Remove-Item -Path $_.FullName -Force
        Agregar-Log "Archivo antiguo borrado: $($_.FullName)"
    }
} catch {
    Agregar-Log "No se pudo acceder al directorio de destino o borrar archivos antiguos: $_"
    exit 1
}

# Configuración para Zabbix
$zabbixSenderPath = "C:\Program Files\Zabbix Agent\zabbix_sender.exe"
$zabbixServer = "xxx.xxx.xxx.xxx"
$zabbixHost = "Nombre_Host"
$claveEstadoRespaldo = "estado_respaldo"

# Determinar el estado del respaldo
$estadoRespaldo = 0  # Por defecto, estado sin errores
if (Test-Path -Path $rutaArchivoLog) {
    if (Select-String -Path $rutaArchivoLog -Pattern "Error") {
        $estadoRespaldo = 1
    }
}

# Enviar estado a Zabbix
try {
    #& $zabbixSenderPath -z $zabbixServer -s $zabbixHost -k $claveEstadoRespaldo -o $estadoRespaldo
    & "C:\Program Files\Zabbix Agent\zabbix_sender.exe" -z xxx.xxx.xxx.xxx -s pgo-appinterno -k estado_respaldo_tomcat -o $estadoRespaldo
    Agregar-Log "Estado de respaldo enviado a Zabbix con éxito."
} catch {
    Agregar-Log "Error al enviar el estado a Zabbix: $_"
}

# Finalizar el script
Agregar-Log "Proceso de respaldo completado. Estado del respaldo: $estadoRespaldo."

Write-Output $estadoRespaldo

exit [int]$estadoRespaldo

 

Consideraciones Finales

  1. Permisos: Asegúrate de que el usuario que ejecuta el script tenga permisos de lectura/escritura en los directorios especificados.
  2. Monitoreo adicional: Puedes agregar más claves en Zabbix para supervisar otros aspectos del servidor.
  3. Frecuencia de ejecución: Se recomienda programar este script con el Programador de Tareas de Windows para ejecutarse periódicamente.

Este script es una herramienta poderosa para administradores de sistemas que buscan optimizar la gestión y supervisión de servidores Tomcat. ¡Implementa este enfoque y asegura la estabilidad de tus aplicaciones críticas!

Deja una respuesta

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