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
- Respaldar directorios clave de Tomcat:
webapps
: Contiene las aplicaciones desplegadas.conf
: Incluye configuraciones críticas del servidor.
- Registrar el proceso de respaldo:
- Genera un archivo de log detallado.
- Eliminar respaldos antiguos:
- Archivos ZIP de más de 7 días.
- 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
- Permisos: Asegúrate de que el usuario que ejecuta el script tenga permisos de lectura/escritura en los directorios especificados.
- Monitoreo adicional: Puedes agregar más claves en Zabbix para supervisar otros aspectos del servidor.
- 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!