Настройка Pi-Hole кластера

Опубликовано 19 дек. 2025 г.

У меня в сети живет несколько нод с pi-hole, которые раскиданы по разным устройствам (proxmox, raspberry pi и т.п.). И сразу встала необходимость, чтобы все ноды с pi-hole имели одинаковые настройки.

Pi-hole — это сетевой DNS‑фильтр и блокировщик рекламы с открытым исходным кодом. Он работает как свой DNS‑сервер, перехватывает DNS‑запросы от устройств в локальной сети и блокирует домены из списков рекламы, трекеров и вредоносных сайтов, возвращая «пустой» ответ вместо IP‑адреса рекламного ресурса.

ЧИТАТЬ ПЕРВЫМ В ТЕЛЕГРАМ   ЧИТАТЬ ПЕРВЫМ В MAX

Стратегия такая, одна нода будет master, где производятся все основное настройки, затем все эти настройки раскатываются на другие ноды (slave).

Раньше такой кейс разруливали с помощью Orbital Sync, Nebula Sync и т.п. Но одно сдохло, другое работает через хуй-пизда-копыто. Короче нужно рабочее решение.

Пишем свой велосипед

#!/usr/bin/env bash

set -euo pipefail

PRIMARY_PIH_DIR="/etc/pihole"

SECONDARY_USER="root"
SECONDARY_PIH_DIR="/etc/pihole"
SECONDARY_HOSTS=(
  "192.168.10.97"
  "192.168.10.98"
  "192.168.10.99"
)

RSYNC_EXCLUDES=(
  "--exclude=pihole-FTL.db"
  "--exclude=macvendor.db"
  "--exclude=*.log"
)

echo "[pihole-sync] $(date): start"

for host in "${SECONDARY_HOSTS[@]}"; do
  echo "[pihole-sync] ---- host ${host} ----"

  rsync -az \
    "${RSYNC_EXCLUDES[@]}" \
    "${PRIMARY_PIH_DIR}/" \
    "${SECONDARY_USER}@${host}:${SECONDARY_PIH_DIR}/"

  echo "[pihole-sync] ${host}: restart dns"
  ssh "${SECONDARY_USER}@${host}" "pihole restartdns >/dev/null 2>&1" || \
    echo "[pihole-sync] ${host}: FAILED to restart dns"

done

echo "[pihole-sync] $(date): done"

В SECONDARY_HOSTS забиваем айпишники slave инстансов, этакий массив. На этом настройка скрипта закончена. Весь лишний мусор вроде логов и статистики синхронизироваться не будет.

Сохраняем, чмодим, кидаем в крон (а лучше в systemd с таймерами):

Про таймеры подробно писал тут и тут.

crontab -e
*/5 * * * * /usr/local/sbin/pihole-sync.sh >> /var/log/pihole-sync.log 2>&1

Не забываем прокинуть ssh ключи с master на slave, чтобы скрипт не уперся рогом в логин и пароль.

Вроде мелочь, а полезная, да еще и на bash. Хороших тебе предстоящих выходных и береги себя!

Комментарии