Automatická aktualizácia Zabbixu a Graylogu pomocou Bash skriptov

Pri Docker kontajneroch nie je samotná aktualizácia zložitá, ale pred každým update je dobré myslieť aj na zálohu a základnú kontrolu služieb.

Úvod

V tomto článku si ukážeme dva jednoduché Bash skripty, ktoré používam na aktualizáciu Zabbixu a Graylogu. Skripty pred samotnou aktualizáciou vytvoria zálohu databázy a až následne aktualizujú príslušné Docker kontajnery.

1. Prečo používať vlastný update skript

Vlastný aktualizačný skript nám môže celý proces výrazne zjednodušiť:

  • pred aktualizáciou sa automaticky vytvorí záloha,
  • skript overí, či záloha skutočne vznikla,
  • aktualizujú sa iba požadované kontajnery,
  • nemusíme si pamätať jednotlivé Docker príkazy,
  • celý update spustíme jedným príkazom.

2. Aktualizácia Zabbixu

Pre Zabbix vytvoríme skript:

nano /usr/local/bin/update-zabbix.sh

Do súboru vložíme

#!/bin/bash
set -e

BACKUP_DIR="/home/ivan/zabbix/backups"
BACKUP_FILE="$BACKUP_DIR/zabbix-before-update-$(date +%F-%H%M).sql"
KEEP_BACKUPS=3

mkdir -p "$BACKUP_DIR"

echo "=== Zabbix DB backup ==="
echo "Backup: $BACKUP_FILE"

docker exec zabbix-mariadb sh -c \
'mariadb-dump -uroot -p"$MYSQL_ROOT_PASSWORD" --single-transaction --routines --triggers zabbix' \
> "$BACKUP_FILE"

if [ ! -s "$BACKUP_FILE" ]; then
    echo "CHYBA: backup je prazdny. Update sa nespusti."
    rm -f "$BACKUP_FILE"
    exit 1
fi

if ! tail -n 20 "$BACKUP_FILE" | grep -q "Dump completed"; then
    echo "CHYBA: backup nevyzera byt korektne dokonceny. Update sa nespusti."
    rm -f "$BACKUP_FILE"
    exit 1
fi

echo "Backup OK:"
ls -lh "$BACKUP_FILE"

echo
echo "=== Zabbix update ==="

docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e WATCHTOWER_NOTIFICATION_URL=/notify/notification-url.txt \
  -e WATCHTOWER_NOTIFICATION_REPORT=true \
  -e WATCHTOWER_NOTIFICATION_TEMPLATE_FILE=/notify/update-template.txt \
  -e WATCHTOWER_NOTIFICATIONS_HOSTNAME=zabbix-10.10.8.5 \
  -v /etc/watchtower-notify/notification-url.txt:/notify/notification-url.txt:ro \
  -v /etc/watchtower-notify/update-template.txt:/notify/update-template.txt:ro \
  nickfedor/watchtower:latest \
  --run-once \
  zabbix-server zabbix-web

echo
echo "=== Cistenie starych backupov ==="

mapfile -t OLD_BACKUPS < <(
    find "$BACKUP_DIR" \
        -maxdepth 1 \
        -type f \
        -name 'zabbix-before-update-*.sql' \
        -printf '%T@ %p\n' \
    | sort -rn \
    | tail -n +"$((KEEP_BACKUPS + 1))" \
    | cut -d' ' -f2-
)

if [ "${#OLD_BACKUPS[@]}" -gt 0 ]; then
    printf 'Mazem: %s\n' "${OLD_BACKUPS[@]}"
    rm -f -- "${OLD_BACKUPS[@]}"
else
    echo "Nie su ziadne stare backupy na zmazanie."
fi

echo
echo "=== Aktualne backupy ==="
ls -lh "$BACKUP_DIR"

echo
echo "=== Hotovo ==="
echo "Novy backup:"
echo "$BACKUP_FILE"

Následne skriptu nastavíme právo na spustenie:

sudo chmod +x /usr/local/bin/update-zabbix.sh

Syntax môžeme pred prvým spustením overiť:

sudo bash -n /usr/local/bin/update-zabbix.sh

Ak sa nezobrazí žiadna chyba, skript môžeme spustiť:

sudo /usr/local/bin/update-zabbix.sh

Skript najskôr vytvorí zálohu databázy MariaDB. Ak je backup prázdny alebo sa dump nedokončí korektne, aktualizácia sa nespustí.

Až po úspešnej kontrole zálohy sa pomocou Watchtower aktualizujú kontajnery:

  • zabbix-server
  • zabbix-web

3. Aktualizácia Graylogu

Podobný princíp môžeme použiť aj pre Graylog.

Vytvoríme skript:

sudo nano /usr/local/bin/update-graylog.sh

Do súboru vložíme:

#!/bin/bash
set -e

GRAYLOG_DIR="/home/ivan/graylog"
BACKUP_DIR="$GRAYLOG_DIR/backups"
BACKUP_FILE="$BACKUP_DIR/graylog-mongodb-before-update-$(date +%F-%H%M).archive"
KEEP_BACKUPS=3

mkdir -p "$BACKUP_DIR"

echo "=== Graylog MongoDB backup ==="
echo "Backup: $BACKUP_FILE"

docker exec graylog-mongodb \
  mongodump \
  --archive=/tmp/graylog-backup.archive \
  --gzip

docker cp \
  graylog-mongodb:/tmp/graylog-backup.archive \
  "$BACKUP_FILE"

docker exec graylog-mongodb \
  rm -f /tmp/graylog-backup.archive

if [ ! -s "$BACKUP_FILE" ]; then
    echo "CHYBA: backup je prazdny. Update sa nespusti."
    rm -f "$BACKUP_FILE"
    exit 1
fi

echo "Backup OK:"
ls -lh "$BACKUP_FILE"

echo
echo "=== Graylog update ==="

cd "$GRAYLOG_DIR"

docker-compose pull graylog datanode
docker-compose up -d graylog datanode

echo
echo "=== Stav Graylog kontajnerov ==="

docker ps \
  --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}' \
  | grep -E 'graylog|datanode'

echo
echo "=== Cistenie starych backupov ==="

mapfile -t OLD_BACKUPS < <(
    find "$BACKUP_DIR" \
        -maxdepth 1 \
        -type f \
        -name 'graylog-mongodb-before-update-*.archive' \
        -printf '%T@ %p\n' \
    | sort -rn \
    | tail -n +"$((KEEP_BACKUPS + 1))" \
    | cut -d' ' -f2-
)

if [ "${#OLD_BACKUPS[@]}" -gt 0 ]; then
    printf 'Mazem: %s\n' "${OLD_BACKUPS[@]}"
    rm -f -- "${OLD_BACKUPS[@]}"
else
    echo "Nie su ziadne stare backupy na zmazanie."
fi

echo
echo "=== Aktualne backupy ==="
ls -lh "$BACKUP_DIR"

echo
echo "=== Hotovo ==="
echo "Novy backup:"
echo "$BACKUP_FILE"

Aj tomuto skriptu nastavíme právo na spustenie:

sudo chmod +x /usr/local/bin/update-graylog.sh

A overíme syntax:

sudo bash -n /usr/local/bin/update-graylog.sh

Ak nevypíše nič, tak syntax je správny a môžemespustiť skript.

Aktualizáciu následne spustíme:

sudo /usr/local/bin/update-graylog.sh

Skript najskôr pomocou mongodump vytvorí zálohu MongoDB.

Po úspešnom vytvorení backupu aktualizuje iba služby:

  • graylog
  • datanode

MongoDB kontajner sa pri tejto aktualizácii nemení.

4. Kontrola po aktualizácii

Po aktualizácii je dobré vždy overiť stav kontajnerov.

Pre Graylog môžeme použiť:

sudo docker ps --format 'table {{.Names}}\t{{.Status}}' | grep graylog

Ak chceme skontrolovať log:

sudo docker logs graylog --tail 100

Pri správnom štarte by mal Graylog po chvíli prejsť do stavu:

healthy

Rovnaký princíp môžeme použiť aj pri ostatných Docker službách.

Záver

Takýmto spôsobom máme aktualizáciu Zabbixu aj Graylogu zjednodušenú na jeden príkaz a zároveň máme pred každou aktualizáciou vytvorenú aktuálnu zálohu databázy.

Pri Zabbixe sa pred update vytvorí SQL dump MariaDB a pri Graylogu záloha MongoDB. Ak záloha nevznikne správne, aktualizácia sa nespustí.

Je to jednoduché riešenie, ale pri pravidelnej údržbe Docker servera dokáže ušetriť množstvo času a zároveň znižuje riziko, že na zálohu pred aktualizáciou zabudneme.

naspäť