Синхронизация Zabbix с узлами Inventory
- Zabbix 6.0 - 6.4
- Inventory желательно последней версии
- php не ниже 7.4
Заполняем файл config.priv.php: вписываем URL и учетные данные от инвентори и заббикса см. файл config.sample.php
Сухой прогон с выводом запланированных изменений для внесения в заббикс
php ./sync.php
Боевой прогон
php ./sync.php real
находится в файле rules.priv.php (есть пример rules.sample.php) сам файл должен содержать команду return и возвращать вложенный массив данных следующей структуры:
- Наборы правил
- Правила, содержащие
- условия
- тип условия => параметры
- действия
- тип действия => параметры
- условия
- Правила, содержащие
Алгоритм работы конвейера обходящего этот массив следующий:
- Обходятся все узлы Inventory, каждому узлу инвентори находится соответствующий узел в Zabbix
(Работа ведется только с узлами типа Оборудование и Операционные системы.) Для любого узла в инвентори соответствующий узел в Zabbix ищется сначала по макросам (INVENTORY_IRL, INVENTORY_CLASS, INVENTORY_ID),
если таким образом узел не находится, то для ОС ищется соответствие по FQDN, для оборудования по IP- затем каждый узел Inventory обходит все наборы правил
- в каждом наборе правил выполняется первое, для которого выполняются все условия (условия проверяются только для узла Inventory)
- для всех таких правил будут просуммированы все действия, которые нужно сделать над соответствующим узлом Zabbix, после чего конвейер перейдет к следующему набору правил (действия выполняются только над узлом Zabbix)
- после обхода всех наборов правил над узлом Zabbix будут выполнены все накопленные действия из выполненных правил
- в каждом наборе правил выполняется первое, для которого выполняются все условия (условия проверяются только для узла Inventory)
- затем каждый узел Inventory обходит все наборы правил
В каждом правиле первым пунктом идет набор условий, для срабатывания правила должны выполняться все из них (AND)
- Правила задаются массивом вида ключ=>значение;
- Любое значение может быть единичным или множественным (единичное все равно конвертируется во множественное с одним вариантом)
- Для множественных значений проверяется совпадение хотя бы одного (OR)
- В качестве значения иногда можно указать (см. типы условий)
- "*" - наличие любого непустого значения
- false - отсутствие какого либо значения
['type1'=>['value1','value2'],'type2'=>'value2'];
Пустой набор условий считается выполняющимся всегда (можно ставить в конце набора правил как действие по умолчанию)
- type - узел должен соответствовать нужному типу: возможны варианты
- techs - Оборудование
- comps - Операционные системы
['type'=>['techs'],...]; // только для узлов типа "Оборудование"
- fqdn - FQDN узла совпадает с указанными (применимо только для операционных систем)
['fqdn'=>['exclusion1.domain.local','exclusion2.test.lab'],...]; // только для узлов с конкретным FQDN
- domainName - Короткое имя домена совпадает с указанными (применимо только для операционных систем)
['domainName'=>['WORKGROUP'],...]; // только для узлов из WORKGROUP (не в домене)
- OS - Операционная система попадает под регулярное выражение (то написание, как она сама себя идентифицирует), очевидно применимо только для операционных систем
['OS'=>['VMware Photon'],...]; // только для узлов с такой операционкой (VMware vCenter)
- service - Узел обеспечивает работу конкретного (или любого сервиса). Точное написание
['service'=>['Kaspersky Security Center'],...]; // только для узлов на которых крутится KES
['service'=>'*']; // только для узлов на которых крутится какой либо сервис
['service'=>false]; // только для узлов на которых нет сервисов
- ip - проверка соответствия IP или его наличия
['ip'=>['192.168.0.1','10.0.0.1'],...]; // только для узлов с заданными IP
['ip'=>['*']]; // только для узлов у которых в инвентори есть IP
- techType - Оборудование конкретной категории (только для оборудования). Проверяется точное написание, не regexp
- vendor - Оборудование имеет конкретного производителя (только для оборудования). Проверяется точное написание, не regexp
- model - Модель оборудования попадает под regexp выражение (только для оборудования)
//все коммутаторы D-Link DES или DGS у которых в инвентори проставлен IP
['type'=>'techs', 'techType'=>['Коммутатор'], 'vendor'=>['D-Link'], 'model'=>['/^(DES|DGS)/'], 'ip'=>'*'];
- site - площадка на которой расположен узел (верхний узел в дереве помещений). Проверяется точное полное написание помещения
['site'=>['Московский филиал','Санкт-Петербургский филиал']]; //только узлы на указанных площадках
- ageOver - превышение количества секунд с последнего обновления узла (удобно для автоматически обновляемых узлов)
['type'=>'comps','ageOver'=>15*24*3600]; //компьютеры которые не обновлялись более 15 суток
- state - Состояние оборудования (точное написание)
['state'=>['Ремонт','Списано'],...]; //для оборудования в ремонте или списанного
- archived - узел перенесен в архив
['type'=>'comps','archived'=>false]; //компьютеры не перенесенные в архив
- sandbox - узел размещен в песочнице
['type'=>'comps','sandbox'=>['Bitrix clone']]; //компьютеры из песочницы bitrix clone
['type'=>'comps','sandbox'=>['*']]; //компьютеры из (любой) песочницы
['type'=>'comps','sandbox'=>[false]]; //компьютеры вне каких либо песочниц
- extlink - узел имеет ссылку на внешние сервисы
['type'=>'comps','extlink'=>['VMWare.UUID']]; //компьютеры имеет ссылку на себя в VMWare
['type'=>'comps','extlink'=>['*']]; //компьютер имеет любую ссылку на внеш. системы
['type'=>'comps','extlink'=>[false]]; //компьютер не имеет каких либо ссылок на внешние системы
При выполнении всех условий правила, над соответствующим узлом в Zabbix будут произведены все действия из этого правила Действия описываются аналогично условиям как действие=>[параметры]
- actions - разрешить действия над узлом. возможные действия:
- update - если соответствующий узел Zabbix будет найден, то его можно обновлять (разрешение создавать не дает)
- create - если соответствующий узел Zabbix не будет найден, то его можно создать (разрешение обновлять не дает)
- remove-actions - запретить действия (имеет приоритет над разрешением выше)
Все остальные правила выполняются только для узлов для которых есть как минимум одно из действий выше
- templates - Назначить узлу шаблоны
- ofTemplates - Из набора шаблонов: при комбинации с предыдущим задает полный набор шаблонов который может быть у узла. После обхода всех правил убирает у узла те шаблоны, которые входят в набор, но не задаются явно через templates; Как templates так и ofTemplates сначала суммируются по всем правилам, а потом уже делается вычитание массивов ofTemplates - templates
[//VCenter servers
['type' => 'comps', 'OS' => ['VMware Photon'],], //для ОС типа VMware Photon
[
'actions'=>['update','create'], //добавить в Zabbix и обновлять
'templates'=>['VMware'], //Установить шаблоны VMware
//убрать шаблоны других операционок (если ранее уже была добавлена как Linux напр.)
'ofTemplates'=>['Linux by Zabbix agent','Windows by Zabbix agent','VMware'],
]
];
[//Старые ОС
[//запрещаем создание в заббиксе узлов, которые не обновлялись в инвентори больше 15 дней
['type'=>'comps','ageOver'=>15*24*3600], //Для компьютеров с датой обновления дальше 15 суток
['remove-actions'=>['create']], //запретить создание нового узла в заббикс
],
];
- groups - назначить узлу группы
- ofGroups - из набора групп (аналогично шаблонам, для автоматического выкидывания из других групп при перемещении)
[
['site'=>'Калужский филиал'], //узлы калужской площадки
[
'groups'=>'Калуга', //помещать в группу Калуга
'ofGroups'=>['Калуга','Москва','Питер','Красноярск']//и выкидывать из групп остальных площадок (если переехали)
]
];
- tags - установить теги узла, если у тега есть значение !unset - он будет удален, можно задавать множественные значения. При указании тега, все текущие значения узла заменяются новыми (нельзя просто добавить тэг)
[
['type'=>'techs', 'techType'=>['Коммутатор','Маршрутизатор']],
[
'tags'=>[
'сервис'=>'Сеть', //установить тег сервис со значением Сеть
'Коммутаторы' =>'!unset', //убрать старые теги
'Маршрутизаторы' =>'!unset', //
]
],
];
- macros - задать значения макросов узла
[
[], //для всех узлов
['macros'=>['inventory_url'=>'https://inventory.domain.local/web']] //привязываем узел к инвентаризации
];
- name - задать имя узла
- host - задать адрес узла
[//сервер Zabbix
['type'=>'comps','fqdn'=>'zabbix.domain.local'], //для самого себя
['name'=>'Сервер Zabbix','host'=>'127.0.0.1'] //Особенное имя и локальный адрес
];
- interfaces - добавить интерфейсы (интерфейс типа zabbix agent создается автоматически, но может и не использоваться если нет шаблонов с метриками использующими такой тип)
[//ставим Маршрутизаторы Cisco ASA добавляем интерфейс SNMP v2 (нужен для шаблона)
['type'=>'techs', 'techType'=>['Маршрутизатор'], 'model'=>['ASA 5515-K9']],
['interfaces'=>[['type'=>'SNMP','details'=>['version'=>2,'bulk'=>1,'community'=>'{$SNMP_COMMUNITY}']]],],
];
- PSK - задать PSK шифрование для узла, для интерфейса типа zabbix-agent (работает только при операции создания, отследить изменение значений нельзя, т.к. это write-only параметры. Интерфейс zabbix-agent создается для всех узлов по умолчанию)
Задается как Identity=>Ключ. Если указать несколько - будет использована только первая пара
[//Windows Server cypher
['type' => 'comps', 'OS' => ['Windows server']], //для серверных Windows
['PSK'=>['server'=>'WINDOWSSERVERSEKRETKEY']] //свое шифрование
];
- proxy - узел мониторится через конкретный Zabbix Proxy (Указывается Host ID узла Zabbix Proxy)
[
['site'=>'Калужский филиал'], //узлы из Калуги
['proxy'=>91511] //Мониторим через Калужский прокси
];
- status - признак активности в zabbix: 0 - узел активен 1 - узел снят с мониторинга
[//выключаем архивированные ОС
['type'=>'comps','archived'=>true],
['status'=>1],
];
- error - Пометить узел как ошибочный, никаких действий над ним делаться не будет
[//пропускаем ОС которые нормально не настроены в DNS!
['type' => 'comps', 'domainName' => ['WORKGROUP'],], //все компьютеры из "рабочей группы"
['errors'=>['domain not set!']] //пропускаем, т.к. у них нет FQDN
];
При задании параметров узла Zabbix через действия в правилах можно использовать макросы, которые будут развернуты в соответствующие значения параметров узла Inventory
- ${inventory:serviceman} - Фамилия ответственного за узел
- ${inventory:supportTeam} - Фамилии группы тех.поддержки узла через запятую
[//ставим ответственных/поддержку за узел
['type'=>['comps','techs']], //на все ОС и Оборудование
['tags'=>[ //выставляем теги ответственного и поддержки узла
'node-service'=>'${inventory:serviceman}',
'node-support'=>'${inventory:supportTeam}',
]],
];
- ${inventory:fqdn} - FQDN узла
- ${inventory:ip} - IP адрес узла
- ${inventory:num} - ИНВ номер узла (маркировка ИТ отдела)
[// именование и адресация узлов
[//компьютеры именуем по FQDN и обращаемся также
['type'=>'comps'],['name'=>'${inventory:fqdn}', 'host'=>'${inventory:fqdn}',],
],
[//оборудование по инвентарному номеру, а обращаемся по IP
['type'=>'techs'],['name'=>'${inventory:num}', 'host'=>'${inventory:ip}',],
],
];
- ${inventory:class} - Класс объекта в Inventory
- ${inventory:id} - ID объекта в Inventory (уникальный в пределах класса)
[
[], //всем узлам
['macros'=>[ //прописываем с чем в Inventory они синхронизированы
'inventory_class'=>'${inventory:class}',
'inventory_id'=>'${inventory:id}'
]]
];
- ${vmware:uuid} - UUID машины в Vcenter (ссылка проставляется скриптами powercli)
- ${vmware:vcenter} - имя узла Vcenter (ссылка проставляется скриптами powercli)
[
['type'=>'comps','extlink'=>['VMWare.UUID']], //компьютеры со ссылкой на себя в Vcenter
['macros'=>[ //прописываем с чем в Inventory они синхронизированы
'VMWARE.URL'=>'https://${vmware:vcenter}',
'VMWARE.VM.UUID'=>'${vmware:uuid}'
]]
];