Перейти к содержанию
Обсудить задачу →
Статьи и инструкции

Zabbix в Astra Linux: установка и настройка агента

Подключаем Astra к мониторингу: пакет, классический агент, PSK, активный и пассивный режимы, метрики, диагностика и приёмка.
Оригинальная концептуальная иллюстрация ноутбука с терминалом и графиками мониторинга рядом с серверной инфраструктурой

Чтобы подключить Astra Linux к Zabbix, недостаточно установить пакет и увидеть активную службу. Нужны подходящий агент, правильное направление соединения, идентичность хоста, шифрование, совместимые проверки и контроль поступления данных.

Разберём новый пилотный узел Astra Linux Special Edition 1.8 x86-64 и классический zabbix-agent из согласованных репозиториев. Основной сценарий — активные проверки через существующий сервер или proxy с TLS-PSK; пассивный вариант показан отдельно. Входное условие — действующий Zabbix Server7.0 с подготовленными группой, совместимым шаблоном, API-доступом и каналом уведомлений. Ниже настройка узла и его регистрация выполняются командами; развёртывание самого сервера — отдельная задача. Версию пакета определяют на вашем узле; наличие конкретной сборки в его репозитории не предполагается заранее. Параметры сверены с документацией Zabbix 7.0, а перед применением — со справкой установленной версии. Реальная установка, подключение и испытания на Astra при подготовке не выполнялись.

Общая схема разобрана в статьях о мониторинге серверов и о настройке Zabbix с нуля. Здесь сосредоточимся на агенте Astra.

Активные и пассивные проверки: кто устанавливает соединение

Активный агент подключается к серверу или proxy на 10051; пассивный агент принимает запрос на 10050

Активные

  1. Агент AstraИнициирует соединение
  2. Server / proxy · 10051Получает данные по PSK

Пассивные

  1. Server / proxyИнициирует опрос
  2. Агент Astra · 10050Принимает запрос по PSK
«Активный» и «пассивный» обозначают направление взаимодействия, а не качество или важность метрик. Порты типовые.
РежимИнициаторСетевой доступНастройки
АктивныйАгент AstraУзел → назначенный server/proxy, TCP 10051ServerActive, точное Hostname, активные элементы
ПассивныйНазначенный server/proxyServer/proxy → агент, TCP 10050Server, listener, интерфейс хоста и пассивные элементы

Для узла за NAT или в филиале активная схема часто проще по маршрутизации: не нужен входящий listener агента. Но исходящий доступ и совпадение настроек всё равно проверяют. Если хост обслуживается proxy, укажите именно его, а не произвольный сервер.

В примере: техническое имя astra-app01, endpoint zbx-proxy.corp.example.net:10051. Это учебные значения; подставьте свою схему. Описание типов проверок — в руководстве Zabbix agent items.

Шаг 1. Зафиксируйте выпуск ОС, пакеты и ограничения среды

Перед установкой проверьте фактический выпуск Astra, архитектуру, состояние времени и доступные пакеты. Для другой ветки ОС команды управления пакетами могут быть похожи, но источники и совместимость нельзя переносить автоматически.

cat /etc/os-release
cat /etc/astra_version
dpkg --print-architecture
uname -r
timedatectl status
dpkg-query -W zabbix-agent zabbix-agent2
apt-cache policy zabbix-agent zabbix-agent2
cat /etc/os-release
Зачем: Узнать семейство и версию ОС. Ожидаем: Поля NAME/VERSION_ID; это исходные данные для выбора пакета.
cat /etc/astra_version
Зачем: Уточнить выпуск Astra. Ожидаем: Строка выпуска либо сообщение об отсутствии файла; тогда уточните выпуск другим штатным способом.
dpkg --print-architecture
Зачем: Узнать архитектуру пакетов. Ожидаем: Для рассматриваемого пилота ожидается amd64; другой результат требует другого пакета.
uname -r
Зачем: Зафиксировать ядро для диагностики. Ожидаем: Версия запущенного ядра, не версия Zabbix.
timedatectl status
Зачем: Проверить время и синхронизацию. Ожидаем: Часовой пояс, время и состояние синхронизации; расхождения исправляют до приёмки.
dpkg-query -W zabbix-agent zabbix-agent2
Зачем: Проверить установленный пакет. Ожидаем: Название/версия либо отсутствие пакета; не воспринимайте отсутствие как разрешение на переустановку.
apt-cache policy zabbix-agent zabbix-agent2
Зачем: Узнать кандидата и источник APT. Ожидаем: Installed/Candidate и репозитории; кандидат должен быть согласован, а не просто доступен.

Если /etc/astra_version отсутствует или пакет не установлен, это диагностический результат, а не повод выполнять следующие команды вслепую. Зафиксируйте версии сервера/proxy и утверждённый источник пакета. На узле с уже работающим агентом сначала обследуйте его конфигурацию; новый пилот нельзя подменять массовой переустановкой.

  • Есть ли согласованный репозиторий для этой редакции и архитектуры.
  • Какая сборка предлагается и поддерживает ли она необходимые TLS-параметры.
  • Не ведёт ли установка к удалению важных пакетов или смене системных библиотек.
  • Какие ограничения целостности, прав и сетевого доступа действуют в среде.

Не подключайте случайный Debian/Ubuntu-репозиторий по сходству названий. Для защищённого контура источник и допустимость изменения определяют по его установленному порядку. Эта статья не утверждает сертификацию произвольной сборки.

Классический агент и Agent 2 — разные конфигурации

Далее используются zabbix_agentd, служба zabbix-agent и пример пути /etc/zabbix/zabbix_agentd.conf. Фактические пути проверяются после установки.

  • У Agent 2 другой бинарный файл, конфигурация и возможности плагинов.
  • StartAgents=0 ниже относится к классическому агенту; переносить параметр в Agent 2 нельзя.
  • Не запускайте два агента на одном порту и не привязывайте конфликтующие проверки.
  • Сетевое взаимодействие старого агента с сервером не гарантирует поддержку каждого ключа нового шаблона.

Перед выбором сверяйте матрицу совместимости для вашей серверной ветки и особенности Agent 2. Здесь ветка 7.0 используется как явно выбранная документационная база, а не как утверждение о последнем релизе или версии пакета Astra.

Шаг 2. Проверьте план установки и установите пакет

Команды предназначены для нового согласованного пилота. Сначала проверьте APT-источники и подписи обычным порядком, обновите индексы и просмотрите план. Ошибки доверия не обходят через отключение проверки подписи.

sudo apt-get update
apt-cache policy zabbix-agent
sudo apt-get --simulate install zabbix-agent

# Только после проверки версии, источника и плана
sudo apt-get install zabbix-agent
dpkg-query -W -f='${Package} ${Version} ${Architecture}\n' zabbix-agent
dpkg -L zabbix-agent
command -v zabbix_agentd
zabbix_agentd -V
zabbix_agentd -h
sudo apt-get update
Зачем: Обновить индексы согласованных репозиториев. Ожидаем: Индексы обновлены без ошибок подписи; это ещё не установка и не обновление всех пакетов.
apt-cache policy zabbix-agent
Зачем: Узнать кандидата и источник APT. Ожидаем: Installed/Candidate и репозитории; кандидат должен быть согласован, а не просто доступен.
sudo apt-get --simulate install zabbix-agent
Зачем: Просмотреть будущие действия без установки. Ожидаем: Список устанавливаемых/изменяемых/удаляемых пакетов; лишние изменения требуют остановки.
sudo apt-get install zabbix-agent
Зачем: Установить выбранный пакет и необходимые зависимости. Ожидаем: APT завершился успешно; пакет может автоматически запустить службу.
dpkg-query -W -f='${Package} ${Version} ${Architecture}\n' zabbix-agent
Зачем: Проверить установленный пакет. Ожидаем: Название/версия либо отсутствие пакета; не воспринимайте отсутствие как разрешение на переустановку.
dpkg -L zabbix-agent
Зачем: Найти файлы установленного пакета. Ожидаем: Список bin/config/unit; по нему сверяют реальные пути.
command -v zabbix_agentd
Зачем: Найти исполняемый файл в PATH. Ожидаем: Путь к zabbix_agentd; пустой результат требует проверки установки и PATH.
zabbix_agentd -V
Зачем: Зафиксировать версию и возможности сборки. Ожидаем: Версия/параметры сборки; проверьте поддержку TLS.
zabbix_agentd -h
Зачем: Посмотреть опции именно установленной версии. Ожидаем: Справка; наличие -T нужно подтвердить перед использованием.

Если кандидат отсутствует, версия не согласована или план затрагивает лишние компоненты, не продолжайте установку. Выбор другого источника — отдельное решение. Не выполняйте попутно полное обновление ОС.

Пакет может автоматически запустить службу. До установки проверьте сетевые ограничения, а для первоначальной настройки нового пилота остановите только этот агент:

sudo systemctl stop zabbix-agent
systemctl cat zabbix-agent
systemctl show zabbix-agent -p ExecStart -p User -p Group
sudo systemctl stop zabbix-agent
Зачем: Остановить только новый пилотный агент для настройки. Ожидаем: Служба остановлена; действующий мониторинг без согласования не прерывают.
systemctl cat zabbix-agent
Зачем: Узнать unit и применённые overrides. Ожидаем: Текст запуска, включая -c; конфигурацию выбирают по нему.
systemctl show zabbix-agent -p ExecStart -p User -p Group
Зачем: Проверить параметры запуска и пользователя unit. Ожидаем: ExecStart/User/Group; пустой User не заменяет проверку пользователя рабочего процесса.

Проверьте реальный параметр -c и конфигурационный путь. На узле с действующим мониторингом остановку заранее согласуют; приведённая команда не означает разрешения прервать чужие рабочие проверки.

Шаг 3. Сохраните конфигурацию до изменения

Дальнейшие административные команды выполняются в отдельной root-сессии. Ниже используется типовой путь, найденный на предыдущем шаге; при отличии замените его.

sudo -i
umask 077
BACKUP_DIR="/root/zabbix-agent-before-$(date +%Y%m%d-%H%M%S)"
install -d -m 700 "$BACKUP_DIR"
cp -a /etc/zabbix "$BACKUP_DIR/"
systemctl cat zabbix-agent > "$BACKUP_DIR/unit.txt"
dpkg-query -W zabbix-agent > "$BACKUP_DIR/package.txt"
sudo -i
Зачем: Открыть отдельную root-сессию для настройки узла. Ожидаем: Приглашение root; последующие административные команды относятся к этой сессии.
umask 077
Зачем: Ограничить права новых файлов текущей сессии. Ожидаем: Новые обычные файлы создаются без доступа группы/остальных, если команда не задаёт иной режим.
BACKUP_DIR="/root/zabbix-agent-before-$(date +%Y%m%d-%H%M%S)"
Зачем: Задать уникальный путь для копии настроек. Ожидаем: Переменная с датой и временем; присваивание само не создаёт каталог.
install -d -m 700 "$BACKUP_DIR"
Зачем: Создать закрытый каталог резервной копии. Ожидаем: Каталог доступен владельцу; при ошибке прав дальше не продолжают.
cp -a /etc/zabbix "$BACKUP_DIR/"
Зачем: Сохранить конфигурацию с атрибутами. Ожидаем: Копия /etc/zabbix внутри BACKUP_DIR; рабочие файлы не удаляются.
systemctl cat zabbix-agent > "$BACKUP_DIR/unit.txt"
Зачем: Узнать unit и применённые overrides. Ожидаем: Текст запуска, включая -c; конфигурацию выбирают по нему.
dpkg-query -W zabbix-agent > "$BACKUP_DIR/package.txt"
Зачем: Проверить установленный пакет. Ожидаем: Название/версия либо отсутствие пакета; не воспринимайте отсутствие как разрешение на переустановку.

Сохраните путь к копии в журнале работ. Не очищайте каталог настроек: там могут быть пакетные параметры логирования, Include и служебные настройки. Меняйте выбранные значения в фактическом основном конфиге либо в поддерживаемом подключаемом файле, проверив отсутствие повторов.

Шаг 4. Сгенерируйте отдельный PSK для узла

Проверьте пользователя и группу агента. Ниже предполагается существующий сервисный пользователь zabbix. Если пакет использует другую модель, адаптируйте владельцев и права; не запускайте агент от root ради чтения ключа.

getent passwd zabbix
getent group zabbix
install -d -o root -g zabbix -m 750 /etc/zabbix/keys

# Генерировать только новый ключ; существующий не перезаписывать
if [ ! -e /etc/zabbix/keys/astra-app01.psk ]; then
    openssl rand -hex 32 > /etc/zabbix/keys/astra-app01.psk
    chown root:zabbix /etc/zabbix/keys/astra-app01.psk
    chmod 640 /etc/zabbix/keys/astra-app01.psk
else
    printf 'Ключ уже существует: проверьте его назначение.\n'
fi

sudo -u zabbix test -r /etc/zabbix/keys/astra-app01.psk
stat -c '%a %U:%G %n' /etc/zabbix/keys/astra-app01.psk
getent passwd zabbix
Зачем: Проверить сервисную учётную запись. Ожидаем: Строка пользователя zabbix; отсутствие требует разбора пакетной модели.
getent group zabbix
Зачем: Проверить сервисную группу. Ожидаем: Существующая группа; её наличие не означает полных прав процесса.
install -d -o root -g zabbix -m 750 /etc/zabbix/keys
Зачем: Создать каталог ключей с выбранными владельцем и группой. Ожидаем: root:zabbix и режим 750; чтение файлов настраивается отдельно.
if [ ! -e /etc/zabbix/keys/astra-app01.psk ]; then
Зачем: Защитить существующий PSK от случайной перезаписи. Ожидаем: При отсутствии файла выполняется генерация; при наличии — только сообщение.
openssl rand -hex 32 > /etc/zabbix/keys/astra-app01.psk
Зачем: Сгенерировать случайный PSK и записать в файл. Ожидаем: 64 шестнадцатеричных символа и перевод строки; значение не выводится в общий журнал.
chown root:zabbix /etc/zabbix/keys/astra-app01.psk
Зачем: Назначить владельца и группу ключа. Ожидаем: Владелец root, группа zabbix.
chmod 640 /etc/zabbix/keys/astra-app01.psk
Зачем: Разрешить чтение ключа группе агента без доступа остальных. Ожидаем: Режим 640; дополнительные механизмы Astra проверяются отдельно.
printf 'Ключ уже существует: проверьте его назначение.\n'
Зачем: Вывести служебное сообщение без секрета. Ожидаем: Сообщение, что ключ уже существует; новый PSK не создан.
sudo -u zabbix test -r /etc/zabbix/keys/astra-app01.psk
Зачем: Проверить доступ сервисного пользователя к ключу. Ожидаем: Код 0 — файл читается; ненулевой код — исправить права/ограничения, не выдавать полный доступ.
stat -c '%a %U:%G %n' /etc/zabbix/keys/astra-app01.psk
Зачем: Показать права и владельцев файла без его содержимого. Ожидаем: Режим, владелец:группа и путь; сам PSK не раскрывается.

Это случайный 256-битный ключ, а не придуманный пароль. Имя astra-app01-psk ниже — идентификатор, не сам секрет. Передайте значение через разрешённый защищённый канал администратору Zabbix; не выводите его в общий терминальный лог, скриншот или заявку.

Используйте уникальную пару identity/value для узла. Одинаковая identity с разными секретами вызывает ошибки. Порядок и формат описаны в Using pre-shared keys. Проверка Unix-прав не заменяет проверку дополнительных ограничений ОС.

Шаг 5. Настройте активные проверки с TLS-PSK

В найденном конфигурационном файле установите значения ниже. Это набор изменяемых параметров, не замена всего файла: пути логов, PID и пакетные Include сохраняют. Удалите конфликтующие активные определения тех же параметров.

Hostname=astra-app01
ServerActive=zbx-proxy.corp.example.net:10051
StartAgents=0
Server=127.0.0.1
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=astra-app01-psk
TLSPSKFile=/etc/zabbix/keys/astra-app01.psk
Hostname=astra-app01
Зачем: Задать идентичность для активных проверок. Ожидаем: Имя точно совпадает с техническим Host name на сервере.
ServerActive=zbx-proxy.corp.example.net:10051
Зачем: Выбрать получателя активных заданий и данных. Ожидаем: Агент обращается к указанному server/proxy, а не к адресу веб-интерфейса.
StartAgents=0
Зачем: Отключить пассивный listener классического агента. Ожидаем: После запуска агент не слушает TCP10050.
Server=127.0.0.1
Зачем: Сохранить ограниченный список пассивных источников. Ожидаем: Это не получатель активных данных; при StartAgents=0 входящий режим отключён.
TLSConnect=psk
Зачем: Задать PSK для исходящих соединений. Ожидаем: Агент не должен передавать активные данные без выбранного шифрования.
TLSAccept=psk
Зачем: Ограничить режим входящих соединений. Ожидаем: Для пассивного варианта принимается PSK; при отключённом listener входящих соединений нет.
TLSPSKIdentity=astra-app01-psk
Зачем: Задать открытый идентификатор ключа. Ожидаем: Он совпадает с API-настройкой; это не секрет.
TLSPSKFile=/etc/zabbix/keys/astra-app01.psk
Зачем: Указать файл секрета. Ожидаем: Файл должен существовать и читаться сервисным процессом.
  • Hostname: точное техническое имя хоста в Zabbix.
  • ServerActive: назначенный получатель активных проверок.
  • StartAgents=0: у классического агента отключает пассивные обработчики и TCP-listener.
  • Server=127.0.0.1: не задаёт направление активной отправки; в этой схеме пассивный режим отключён.
  • TLSConnect: шифрование исходящего подключения; TLSAccept относится к входящему.

Описание — в параметрах zabbix_agentd. Для установленной сборки проверьте поддержку и TLS в её справке. Не добавляйте опцию из другого поколения агента, если она им не распознаётся.

Записать параметры командой, сохранив пакетные настройки

Где: root-сессия узла Astra после резервной копии. Восемь значений в начале скрипта замените на согласованные. Требуется Python3. При другом фактическом пути измените cfg.

python3 - <<'PY'
from pathlib import Path
import glob, os, re, tempfile
cfg = Path('/etc/zabbix/zabbix_agentd.conf')
values = dict(Hostname='astra-app01',
    ServerActive='zbx-proxy.corp.example.net:10051', StartAgents='0',
    Server='127.0.0.1', TLSConnect='psk', TLSAccept='psk',
    TLSPSKIdentity='astra-app01-psk',
    TLSPSKFile='/etc/zabbix/keys/astra-app01.psk')
if cfg.is_symlink():
    raise SystemExit('Конфиг является symlink: разберите схему отдельно')
seen = set()
def scan(path, main=False):
    path = path.resolve()
    if path in seen: return
    seen.add(path)
    text = path.read_text(encoding='utf-8')
    for line in text.splitlines():
        m = re.match(r'^\s*([^#=\s]+)\s*=\s*(.*?)\s*$', line)
        if not m: continue
        key, value = m.groups()
        if not main and key in values:
            raise SystemExit(f'Параметр {key} найден в Include {path}; сначала устраните конфликт')
        if key == 'Include':
            pattern = value if value.startswith('/') else str(path.parent / value)
            for name in glob.glob(pattern): scan(Path(name))
scan(cfg, main=True)
original = cfg.read_text(encoding='utf-8')
lines = []
for line in original.splitlines():
    m = re.match(r'^\s*([^#=\s]+)\s*=', line)
    lines.append('# before AVG pilot: ' + line if m and m[1] in values else line)
text = '\n'.join(lines) + '\n\n# AVG active-only pilot\n'
text += ''.join(f'{key}={value}\n' for key,value in values.items())
st = cfg.stat()
with tempfile.NamedTemporaryFile('w', dir=cfg.parent, delete=False, encoding='utf-8') as out:
    temp = Path(out.name)
    out.write(text)
    os.fchmod(out.fileno(), st.st_mode & 0o777)
    os.fchown(out.fileno(), st.st_uid, st.st_gid)
os.replace(temp, cfg)
print('Записаны 8 параметров; LogFile, PID и остальные параметры сохранены')
PY

Что делает: проверяет основной файл и Include на конфликтующие определения, комментирует прежние восемь значений только в основном файле и записывает новые через временный файл. Сохраняет владельца, права и остальные настройки. Ожидаем: сообщение о записи; службу скрипт не перезапускает. При конфликте Include он останавливается до изменения. Затем выполните -T и локальные проверки следующего шага.

Шаг 6. Создайте хост из терминала через API Zabbix 7.0

Предварительно: действующий Zabbix Server7.0, совместимый активный Linux-шаблон, группа хостов, при необходимости proxy и уже настроенный канал уведомлений. Для host.create нужен API-пользователь типа Admin/Super admin с разрешением метода и правами на целевую группу; обычной роли User недостаточно. Временный токен выдаёт администратор, ограничив полномочия задачей. Токен вводится скрыто; не помещайте его в shell history. Создание нового API-пользователя и канала доставки относится к настройке сервера, а не агента.

Где: доверенная административная машина с Python3 и доступом по HTTPS к API. Если выполняете на Astra в root-сессии, PSK читается с этого узла. Имя хоста, identity и получатель должны совпадать с конфигом. Для иного размещения безопасно подготовьте файл PSK на административной машине; не открывайте доступ к API из лишних сегментов.

cat > /root/zbx-host.py <<'PY'
import getpass, json, re, sys, urllib.request, urllib.parse
from pathlib import Path
mode = sys.argv[1] if len(sys.argv)>1 else 'inspect'
if mode not in ('create','inspect'): raise SystemExit('Режим: create или inspect')
url = input('Полный HTTPS URL api_jsonrpc.php: ').strip()
p = urllib.parse.urlsplit(url)
if p.scheme!='https' or not p.hostname or p.username or p.password:
    raise SystemExit('Нужен HTTPS URL без логина/пароля в адресе')
token = getpass.getpass('Временный API token: ')
class NoRedirect(urllib.request.HTTPRedirectHandler):
    def redirect_request(self, *args, **kwargs): return None
opener = urllib.request.build_opener(NoRedirect())
def api(method, params, auth=True):
    headers={'Content-Type':'application/json-rpc'}
    if auth: headers['Authorization']='Bearer '+token
    req=urllib.request.Request(url, data=json.dumps(dict(jsonrpc='2.0',
        method=method,params=params,id=1)).encode(),headers=headers,method='POST')
    try:
        with opener.open(req,timeout=20) as r: answer=json.load(r)
    except Exception:
        raise SystemExit('API transport/HTTP/TLS error; проверьте endpoint и журнал сервера')
    if 'error' in answer:
        raise SystemExit('API error: '+str(answer['error'].get('message'))+
            '; запрос не повторять вслепую, сначала проверить состояние')
    return answer['result']
version=api('apiinfo.version',{},False)
if not version.startswith('7.0.'):
    raise SystemExit('Этот пример рассчитан на API7.0; адаптируйте по документации своей ветки')
name=input('Точное Hostname [astra-app01]: ').strip() or 'astra-app01'
hosts=api('host.get',dict(output=['hostid','host','status'],filter={'host':[name]}))
if mode=='create':
    if hosts: raise SystemExit('Хост уже существует; используйте inspect, не создавайте дубль')
    groups=api('hostgroup.get',dict(output=['groupid','name']))
    print('Группы:',json.dumps(groups,ensure_ascii=False))
    group=input('groupid из списка: ').strip()
    if group not in {x['groupid'] for x in groups}: raise SystemExit('Неизвестный groupid')
    query=input('Часть имени активного Linux-шаблона [Linux]: ').strip() or 'Linux'
    templates=api('template.get',dict(output=['templateid','host'],search={'host':query}))
    print('Шаблоны:',json.dumps(templates,ensure_ascii=False))
    template=input('templateid совместимого ACTIVE-шаблона: ').strip()
    if template not in {x['templateid'] for x in templates}: raise SystemExit('Неизвестный templateid')
    source=input('Получатель server или proxy: ').strip()
    params=dict(host=name,groups=[{'groupid':group}],templates=[{'templateid':template}],
        status=0,tls_connect=2,tls_accept=2,tls_psk_identity=name+'-psk',monitored_by=0)
    if source=='proxy':
        proxies=api('proxy.get',dict(output=['proxyid','name']))
        print('Proxy:',json.dumps(proxies,ensure_ascii=False))
        proxy=input('proxyid назначенного получателя: ').strip()
        if proxy not in {x['proxyid'] for x in proxies}: raise SystemExit('Неизвестный proxyid')
        params.update(monitored_by=1,proxyid=proxy)
    elif source!='server': raise SystemExit('Укажите server или proxy')
    path=input('Путь PSK [/etc/zabbix/keys/astra-app01.psk]: ').strip() or '/etc/zabbix/keys/astra-app01.psk'
    secret=Path(path).read_text().strip()
    if not re.fullmatch(r'[0-9a-fA-F]{64}',secret): raise SystemExit('Ожидается PSK32байта hex')
    print('Создать:',name,'groupid='+group,'templateid='+template,'получатель='+source)
    print('Identity:',params['tls_psk_identity'],'— сверить с агентом; PSK не выводится')
    if input('Для создания введите CREATE: ')!='CREATE': raise SystemExit('Отменено')
    params['tls_psk']=secret
    result=api('host.create',params)
    print('Создан hostid:',result['hostids'][0])
else:
    if len(hosts)!=1: raise SystemExit('Нужен один существующий хост')
    items=api('item.get',dict(hostids=[hosts[0]['hostid']],
        output=['itemid','name','key_','type','status','state','error','lastclock','lastvalue'],
        sortfield='name',limit=100))
    print(json.dumps(items,ensure_ascii=False,indent=2))
PY
chmod 600 /root/zbx-host.py

Зачем cat: сохранить программу в локальный файл. Маркер PY завершает ввод; это не команда API. Зачем chmod: разрешить доступ только владельцу. Секрет в программе не хранится. Само сохранение ничего в Zabbix не создаёт.

python3 /root/zbx-host.py create

Ожидаем: версия API проверена, получены реальные ID группы/шаблона/proxy; после CREATE создан один хост и выведен hostid. Программа останавливается, если хост уже есть. Она не обновляет существующий хост и не открывает passive-interface. Проверяйте состав выбранного шаблона: поиск по имени не доказывает, что все элементы активные. Не меняйте техническое имя без соответствующего изменения Hostname и TLSPSKIdentity агента.

Что делают API-вызовы: apiinfo.version проверяет ветку; host.get ищет хост; hostgroup.get/template.get/proxy.get возвращают реальные ID; host.create создаёт хост, назначает шаблон/получателя и PSK; item.get читает элементы и последние значения. Если ответ потерян после create, не отправляйте запрос повторно: inspect сначала проверяет фактическое состояние. Пример рассчитан на7.0; для другой ветки схема API проверяется отдельно.

Поля сверены с host.create, Host object и API authentication.

Шаг 7. Проверьте DNS, маршрут и сетевую политику

Для основного сценария требуется исходящий TCP к назначенному server/proxy на 10051. При StartAgents=0 входящий 10050 открывать для этой схемы не требуется.

getent ahosts zbx-proxy.corp.example.net
# Подставить реальный IP proxy
ip route get 10.30.40.20
# Если согласованная утилита nc установлена
nc -vz -w 3 zbx-proxy.corp.example.net 10051
getent ahosts zbx-proxy.corp.example.net
Зачем: Проверить разрешение имени получателя. Ожидаем: Ожидаемые адреса; наличие записи не доказывает доступность TCP.
ip route get 10.30.40.20
Зачем: Проверить выбор маршрута к фактическому IP. Ожидаем: Интерфейс, шлюз и исходный адрес; сверить с вашей сетью.
nc -vz -w 3 zbx-proxy.corp.example.net 10051
Зачем: Проверить установление TCP-соединения. Ожидаем: Соединение с10051 либо причина отказа; PSK и метрики не проверяются.

Успешный TCP не проверяет PSK, Hostname и передачу метрик. PSK-шифрованный Zabbix-протокол не надо проверять как HTTPS запросом curl. Проблема ping также не означает автоматически отказ TCP.

  • Ограничьте адрес назначения и сегмент управления по принятой схеме.
  • Учитывайте IPv6, выбранный исходный IP, VPN и обратный маршрут.
  • Если используется proxy, проверьте также его связь с сервером.
  • Не открывайте 10050/10051 всему интернету ради «зелёного индикатора».

Дополнительные механизмы безопасности Astra не отключают глобально. При отказе чтения ключа или каталога сначала выясняют конкретные права, контекст процесса и запись аудита.

Шаг 8. Проверьте конфиг и локальные ключи

Сначала используйте справку фактического бинарного файла. Опцию -T выполняйте только если она поддерживается установленной версией.

zabbix_agentd -h
# Для версии с поддержкой -T
zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -T

sudo -u zabbix zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t agent.ping
sudo -u zabbix zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t agent.version
sudo -u zabbix zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t system.uptime
sudo -u zabbix zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t 'vfs.fs.size[/,pfree]'
zabbix_agentd -h
Зачем: Посмотреть опции именно установленной версии. Ожидаем: Справка; наличие -T нужно подтвердить перед использованием.
zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -T
Зачем: Проверить конфигурацию поддерживаемой опцией -T. Ожидаем: Успешная валидация либо диагностическая ошибка; служба этим не запускается.
sudo -u zabbix zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t agent.ping
Зачем: Проверить один локальный ключ в контексте пользователя агента. Ожидаем: agent.ping —1; agent.version — версия; uptime — секунды; pfree — процент свободного места. Это ожидаемые типы, не наши стендовые результаты.
sudo -u zabbix zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t agent.version
Зачем: Проверить один локальный ключ в контексте пользователя агента. Ожидаем: agent.ping —1; agent.version — версия; uptime — секунды; pfree — процент свободного места. Это ожидаемые типы, не наши стендовые результаты.
sudo -u zabbix zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t system.uptime
Зачем: Проверить один локальный ключ в контексте пользователя агента. Ожидаем: agent.ping —1; agent.version — версия; uptime — секунды; pfree — процент свободного места. Это ожидаемые типы, не наши стендовые результаты.
sudo -u zabbix zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t 'vfs.fs.size[/,pfree]'
Зачем: Проверить один локальный ключ в контексте пользователя агента. Ожидаем: agent.ping —1; agent.version — версия; uptime — секунды; pfree — процент свободного места. Это ожидаемые типы, не наши стендовые результаты.

Ожидайте корректное значение соответствующего типа; это критерий проверки, не результат выполненного нами теста. -t проверяет ключ локально и не доказывает сетевую передачу. Даже запуск от сервисного пользователя может отличаться от окружения службы и дополнительных ограничений ОС. Ограничения описаны в справке zabbix_agentd.

Шаг 9. Запустите службу и проследите появление данных

Только после настройки обеих сторон запускайте новый пилотный агент:

systemctl enable --now zabbix-agent
systemctl status zabbix-agent --no-pager -l
journalctl -u zabbix-agent --since '10 minutes ago' --no-pager -n 100
ss -lntp
ps -eo pid,user,group,args | grep '[z]abbix_agentd'
exit
systemctl enable --now zabbix-agent
Зачем: Включить автозапуск и запустить службу. Ожидаем: Служба включена/запущена; сами метрики ещё надо проверить.
systemctl status zabbix-agent --no-pager -l
Зачем: Проверить состояние и недавние сообщения службы. Ожидаем: Active (running) либо причина отказа; статус не равен доставке метрик.
journalctl -u zabbix-agent --since '10 minutes ago' --no-pager -n 100
Зачем: Выбрать события unit за указанный интервал. Ожидаем: События запуска/ошибки; при файловом LogType данные ищут также в LogFile.
ss -lntp
Зачем: Посмотреть слушающие TCP-сокеты и процессы. Ожидаем: В active-only10050 отсутствует; это ожидаемо, а не неисправность.
ps -eo pid,user,group,args | grep '[z]abbix_agentd'
Зачем: Проверить реального пользователя процессов агента. Ожидаем: PID, пользователь, группа, аргументы; сверить с моделью привилегий.
exit
Зачем: Завершить выделенную root-сессию. Ожидаем: Возврат к исходному пользователю.

У active-only классического агента отсутствие listener 10050 ожидаемо. При файловом LogType ищите рабочий журнал по фактическому LogFile: systemd journal может содержать только события запуска.

Проверьте новые временные метки командой inspect ниже; при необходимости дополнительно откройте Monitoring → Latest data. Дождитесь нескольких циклов и проверьте ошибки элементов. Иконка доступности и статус Active/Running сами по себе не подтверждают поступление всех нужных данных.

python3 /root/zbx-host.py inspect

Где: та же доверенная административная машина. Зачем: получить до100 элементов хоста через item.get. Ожидаем: lastclock меняется между проверками, lastvalue имеет ожидаемый тип, state/error не скрывают отказ. Ноль lastclock означает отсутствие принятого значения, а не «нулевую нагрузку». Результат выводится в Unix-времени. Для более100 элементов используйте фильтры/постраничный аудит; пример не заявляет полный аудит больших шаблонов.

Какие проверки включить первыми

ОбъектЧто наблюдатьКак использовать
Агент и данныеВозраст последнего значения, ошибки сбораОбнаружить исчезновение наблюдения
CPU и памятьНагрузка, использование, swap по роли узлаСопоставлять с рабочими задачами и инцидентами
Файловые системыМесто, inode, реальные точки монтированияПредупредить заполнение и исчезновение тома
Сеть и службыОшибки интерфейса, доступность нужного сервисаОтделить сбой приложения от общего отказа ОС

Не включайте одинаковые пороги на все серверы. Для базы важны диск, задержки и журналы; для файлового сервера — тома и место; для узла приложений — процессы и зависимые сервисы. Агент ОС не проверит бизнес-операцию 1С автоматически.

История мониторинга помогает расследованию: когда началось ухудшение, росли ли задержки и память, пропадала ли сеть, совпало ли событие с обновлением или задачей. Для ответа «кто входил и что делал» дополнительно нужны журналы доступа и аудита, синхронизированное время и согласованные права на эти данные.

Отдельный вариант: пассивные проверки с PSK

Используйте его только если сервер/proxy должен сам опрашивать агент. Укажите фактический адрес poller и разрешите 10050 лишь от него. Не заменяйте source allowlist всей сетью.

# Изменения к согласованной конфигурации классического агента
Server=10.30.40.20
ListenIP=10.30.50.10
ListenPort=10050
StartAgents=3
TLSAccept=psk
Server=10.30.40.20
Зачем: Ограничить источники пассивного опроса. Ожидаем: Разрешён только назначенный poller; адрес примера заменить.
ListenIP=10.30.50.10
Зачем: Привязать пассивный listener к адресу узла. Ожидаем: Адрес должен принадлежать этому серверу, иначе запуск завершится ошибкой.
ListenPort=10050
Зачем: Выбрать порт пассивного агента. Ожидаем: После запуска слушается заданный порт, если режим включён.
StartAgents=3
Зачем: Включить три пассивных обработчика пилота. Ожидаем: Это учебное значение, не норматив ёмкости для всех серверов.
TLSAccept=psk
Зачем: Ограничить режим входящих соединений. Ожидаем: Для пассивного варианта принимается PSK; при отключённом listener входящих соединений нет.

Три обработчика здесь — учебный параметр пилота, не универсальный норматив. Сохраняются нужные TLSPSKIdentity/TLSPSKFile. Если одновременно оставляете активные проверки, ServerActive и TLSConnect должны соответствовать второй схеме. Для pure passive активные проверки отключают согласованно.

В интерфейсе задайте реальный Agent interface, правильный poller, пассивный шаблон и Connections to host → PSK. После контролируемого перезапуска проверьте из разрешённого узла:

# На назначенном server/proxy; файл секрета подготовлен защищённо
zabbix_get -s 10.30.50.10 -p 10050 -k agent.ping   --tls-connect psk --tls-psk-identity astra-app01-psk   --tls-psk-file /secure/path/astra-app01.psk
zabbix_get -s 10.30.50.10 -p 10050 -k agent.ping --tls-connect psk --tls-psk-identity astra-app01-psk --tls-psk-file /secure/path/astra-app01.psk
Зачем: Запросить один ключ с назначенного poller по PSK. Ожидаем: Для agent.ping ожидается1; active-only схему такой запрос не проверяет.

Это проверка пассивного запроса, описанная в zabbix_get. Она неприменима к active-only listener, который отключён. Успех одного ключа не проверяет весь шаблон.

Если метрик нет: разберите точку отказа

Нет соединения

DNS, endpoint, маршрут, firewall, listener принимающей стороны и выбранный proxy.

Соединение есть, данных нет

PSK/identity, Hostname, назначение хоста, тип элементов, включённый статус.

Часть ключей unsupported

Версия, синтаксис ключа, права, зависимости, обнаружение и ошибки preprocessing.

  • Host not found: сравнить техническое Host name, Hostname агента и сервер/proxy, к которому агент обратился.
  • TLS/PSK error: identity и секрет на обеих сторонах, чтение файла, поддержка TLS. Не переходить на plaintext для постоянного исправления.
  • Connection refused: на целевом адресе может не быть нужного listener; проверить также промежуточные устройства.
  • Timeout: маршрут, фильтрация, нагрузка и время выполнения; не увеличивать все timeout без причины.
  • Локально работает, служба не читает: фактический пользователь, окружение, пути и ограничения ОС.

Не устраняйте ошибку запуском всего агента от root, выдачей sudo ALL или разрешением произвольного system.run. Дополнительные ключи и UserParameter проектируют отдельно с ограниченными командами и доступами.

Приёмка: от значения до реакции дежурного

Проверки приёмки: пакет, локальный ключ, защищённое соединение, новые данные и уведомление
  1. 1. Пакет и службаВерсия,источник,конфиг и права
  2. 2. Локальный ключКорректное значение
  3. 3. Защищённое соединениеServer/proxy,Hostname,PSK
  4. 4. Актуальные метрикиНовые значения и нужные объекты
  5. 5. Уведомление и реакцияПолучатель подтвердил доставку
Успешная установка — только первый этап. Полезный мониторинг требует актуальных данных и работающего процесса реакции.
  1. Зафиксированы выпуск Astra, версия пакета и источник.
  2. Агент работает от согласованной учётной записи; ключ доступен только необходимым субъектам.
  3. Настроены нужный endpoint, режим, Hostname и шифрование.
  4. На стороне Zabbix появляются новые данные без скрытых unsupported.
  5. Проверены обнаружение нужных томов и отсутствие лишних дублей.
  6. Безопасно проверено тестовое событие и его восстановление в согласованном окне.
  7. Подтверждены получатель уведомления, время доставки и порядок реакции.
  8. Определены хранение истории, мониторинг самого Zabbix и повторная проверка.

Не переполняйте диск и не останавливайте production-приложение ради демонстрации тревоги. Используйте отдельный тестовый объект или согласованный временный порог. Поступление метрики и фактическое получение уведомления — разные проверки.

Проверить отсутствие данных командой на пилотном узле

До запуска: в согласованной группе должен существовать включённый nodata-триггер по активным данным, а action и канал уведомлений — соответствовать тестовому хосту. Узнайте его порог и выберите ожидание больше порога с запасом на обработку. Если такого правила нет, этот опыт не создаст его автоматически. Не используйте suppression/maintenance, подавляющие проверяемое действие.

sudo python3 - <<'PY'
import subprocess, time
seconds = int(input('Согласованное ожидание nodata в секундах (60..900): '))
if not 60 <= seconds <= 900:
    raise SystemExit('Нужен согласованный интервал в пределах60..900')
try:
    subprocess.run(['systemctl','stop','zabbix-agent'],check=True)
    print('Остановлен только агент; ожидайте событие и уведомление')
    time.sleep(seconds)
finally:
    subprocess.run(['systemctl','start','zabbix-agent'],check=True)
    print('Агент запущен; проверить свежие значения и восстановление события')
PY

Что делает: Python останавливает только агент, выдерживает введённое время и в finally запускает его снова, включая обычное прерывание программы. Приложения и ОС не останавливаются. Ожидаем: отсутствие новых данных, срабатывание существующего правила, фактическое уведомление получателю; после запуска — новые данные и восстановление события. Ни один из этих результатов не следует объявлять достигнутым без наблюдения. При потере питания или принудительном kill finally не гарантирован — проверьте службу отдельно командой systemctl status.

Если уведомления нет, разберите правило, условие action, расписание и канал доставки на сервере. Установка агента сама по себе их не создаёт. После опыта снимите временные тестовые пороги и отзовите временный API-токен.

Обновление и возврат настроек

Храните версию пакета, источник, файл конфигурации, шаблон и дату изменения как комплект. Перед обновлением просмотрите план APT и проверьте пилот: сервер, proxy, агенты и шаблоны имеют разные правила совместимости.

  • Для возврата сохраните предыдущие конфиги и порядок восстановления службы.
  • Секреты не добавляйте в открытый Git и общий паспорт.
  • После ротации PSK проверьте обе стороны и поступление новых значений.
  • При выводе узла отзовите секрет и доступы, оформите судьбу его истории.
  • После изменения времени, VPN или системной защиты повторите проверку сбора.

Возврат настроек не обязан требовать удаления пакета. Удаление вместе с purge может затронуть нужную конфигурацию; не используйте его как первый способ диагностики.

Вернуть сохранённый основной конфиг

Где: root-сессия того же пилотного узла. Укажите каталог, который создала команда BACKUP_DIR, и проверьте путь. Пример предназначен для типового основного файла, изменённого скриптом выше.

read -r -p 'Полный путь сохранённого BACKUP_DIR: ' BACKUP_DIR
test -f "$BACKUP_DIR/zabbix/zabbix_agentd.conf" || exit 1
cp -a -- "$BACKUP_DIR/zabbix/zabbix_agentd.conf" /etc/zabbix/zabbix_agentd.conf
# Если установленная версия поддерживает -T
zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -T && systemctl restart zabbix-agent
systemctl status zabbix-agent --no-pager -l

Зачем read/test: получить путь и остановиться, если исходного файла нет. Зачем cp: вернуть именно сохранённый основной файл с атрибутами. Зачем -T: проверить его до перезапуска. При ошибке && не выполнит restart. Если -T не поддерживается, используйте проверку локальных ключей и согласованный порядок перезапуска своей версии. Зачем restart/status: применить согласованный возврат и проверить службу. API-хост, шаблон и права на сервере возвращают отдельным планом: восстановление локального файла не отменяет серверные изменения.

Паспорт агента и протокол приёмки

Паспорт узла

ОС, пакет, источник, режим, endpoint, Hostname, identity и шаблон. Без секрета PSK.

Скачать паспорт · TXT

Протокол проверки

Локальные ключи, TLS, новые метрики, тестовое событие, уведомление и возврат.

Скачать протокол · TXT

Внедрение и сопровождение мониторинга

ИТ-аутсорсинг

  • Обследование узлов и зависимостей.
  • Настройка агентов, шаблонов и уведомлений.
  • Расследование по истории и журналам.

Определим, кто реагирует на событие и как проверяется результат.

Обсудить мониторинг

Облачные ресурсы

  • Размещение Zabbix и proxy по схеме.
  • Подбор хранения истории и копий.
  • Контроль доступа и ресурсов.

Ёмкость и стоимость рассчитываем по объёму метрик и срокам хранения.

Подобрать ресурсы

Частые вопросы

Можно поставить любой Debian-пакет в Astra?

Не следует выбирать источник только по родству ОС. Нужны согласованная сборка, архитектура, зависимости и правила вашего контура.

Какую точную версию агента ставит статья?

Кандидат определяется apt-cache policy в ваших утверждённых репозиториях. Статья не выдаёт неизвестную локальную сборку за проверенную.

Нужно открыть 10050 для активного агента?

В основном примере классического агента StartAgents=0 отключает пассивный listener. Нужен исходящий путь к выбранному server/proxy на10051.

Server и ServerActive — одно и то же?

Нет. Первый ограничивает входящих poller в пассивном режиме, второй задаёт получателя активных проверок.

Можно перенести StartAgents=0 в Agent2?

Нет. Это параметр классического агента. Agent2 настраивают по его собственной документации.

Локальный agent.ping вернул значение. Мониторинг работает?

Подтверждён только локальный ключ. Нужны передача, новые временные метки в Zabbix и проверка нужных элементов.

Агент собирает журнал всех действий пользователей?

Нет. Для расследования действий нужны отдельно настроенные источники аудита и доступа. Метрики помогают сопоставить время и влияние событий.

Есть ли реальные результаты установки на Astra?

Нет. Это порядок внедрения и критерии проверки. Реальный пакет, служба, PSK,TLS,метрики и уведомления при подготовке не испытывались.