
Чтобы подключить 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.
Активные и пассивные проверки: кто устанавливает соединение
Активные
- Агент AstraИнициирует соединение
- Server / proxy · 10051Получает данные по PSK
Пассивные
- Server / proxyИнициирует опрос
- Агент Astra · 10050Принимает запрос по PSK
| Режим | Инициатор | Сетевой доступ | Настройки |
|---|---|---|---|
| Активный | Агент Astra | Узел → назначенный server/proxy, TCP 10051 | ServerActive, точное Hostname, активные элементы |
| Пассивный | Назначенный server/proxy | Server/proxy → агент, TCP 10050 | Server, 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-agent2cat /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 -hsudo 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 Groupsudo 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.pskgetent 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.pskHostname=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 10051getent 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'
exitsystemctl 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=pskServer=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.pskzabbix_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, назначение хоста, тип элементов, включённый статус.
Версия, синтаксис ключа, права, зависимости, обнаружение и ошибки 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. Пакет и службаВерсия,источник,конфиг и права
- 2. Локальный ключКорректное значение
- 3. Защищённое соединениеServer/proxy,Hostname,PSK
- 4. Актуальные метрикиНовые значения и нужные объекты
- 5. Уведомление и реакцияПолучатель подтвердил доставку
- Зафиксированы выпуск Astra, версия пакета и источник.
- Агент работает от согласованной учётной записи; ключ доступен только необходимым субъектам.
- Настроены нужный endpoint, режим, Hostname и шифрование.
- На стороне Zabbix появляются новые данные без скрытых unsupported.
- Проверены обнаружение нужных томов и отсутствие лишних дублей.
- Безопасно проверено тестовое событие и его восстановление в согласованном окне.
- Подтверждены получатель уведомления, время доставки и порядок реакции.
- Определены хранение истории, мониторинг самого 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,метрики и уведомления при подготовке не испытывались.
