# Создание сценария автоматизации
В данном разделе рассмотрим общие принципы создания и построения сценариев автоматизации.
Перед созданием вашего первого сценария рекомендуется ознакомиться с терминологией и общими понятия о функционале Автоматизации:
Глоссарий терминов раздела Автоматизация
Основные положения функционала Автоматизации
# Добавление сценария
- Перейдите через основное меню в раздел Действия - Автоматизация - откроется экран управления сценариями.
- Для добавления в систему нового сценария нажмите кнопку ➕ Создать сценарий в правом верхнем углу экрана.
- Заполните основные параметры создаваемого сценария:
- Владелец сценария - Рабочая группа, которой будет принадлежать сценарий.
- Название - логически понятное название сценария.
- Тип - CMDBAutoDiscovery.
- Описание (опционально).
- Импорт сценария (опционально).
- Нажмите кнопку Создать - сценарий будет создан и откроется конструктор сценария.
- Каждый сценарий начинает работу с События запуска - блока
OnLogEvent
,
автоматически добавляемого при создании каждого сценария.
- Удалить или изменить блок
OnLogEvent
нельзя. - В исходящем пине (переменной)
Value
блокаOnLogEvent
содержится значение первичного события, переданного в коллектор через:
- Удалить или изменить блок
# Фильтрация событий
Следующим действием необходимо произвести фильтрацию поступающих событий в сценарий Автоматизации.
Для этого добавьте блок локальной функции в сценарий:
В диспетчере объектов нажмите ➕ в категории Локальные функции - будет объявлена функция
CodeFunction
.В меню действий над функцией
CodeFunction
выберите Добавить в сценарий </>.Двойным кликом по добавленному блоку локальной функции откройте Инспектор объектов.
Измените Название локальной функции, например
FilterEvents
.Добавьте Входящий пин
InValue
с типомMonq.Cl.CollectorLogEvent
.Системный тип
Monq.Cl.CollectorLogEvent
описывает структуру первичного события monq.Настройте Исходящие пины следующим образом:
ok
, типExec
failed
, типExec
Подробнее о типах пинов можно узнать по ссылке.
Перейдите в режим редактирования текущей локальной функции
FilterEvents
- нажмите на вкладку Редактор находясь в Инспекторе объектов.Приведите код функции к следующему виду:
private async ValueTask<FuncResult> FilterEvents(Monq.Cl.CollectorLogEvent InValue) { if (InValue._stream.id == 248) { return new FuncResult("ok"); } return new FuncResult("failed"); }
В данном примере производится проверка поля первичного события
_stream.id
(идентификатор "Потока данных") c предзаданным пользователем значением = 248.
Если первичное событие пришло через Поток данных, имеющий идентификаторid = 248
дальнейшее прохождение сценария будет выполнено по Исходящему пинуok
, иначе по Исходящему пинуfailed
. В нашем сценарии, события пришедшие по другим Потокам данных будут завершены на пинеfailed
и дальнейшая обработка сценария также будет завершена.Соедините соответствующие пины протягиванием связи между ними:
Блок
OnLogEvent
пинOut
➞ БлокFilterEvents
пинIn
- связь очередности выполнения функций в сценарии.Блок
OnLogEvent
пинValue
➞ БлокFilterEvents
пинInValue
- связь передачи значения переменной.
# Обработка события
Рассмотрим пример создания Конфигурационной единицы (КЕ) по входящим событиям из Zabbix (объект host
первичного события Zabbix).
# Пример первичного события из системы мониторинга Zabbix
{
"id": "50133",
"clock": 1646785676,
"acknowledged": 0,
"name": "Disk space usage",
"value": 1,
"severity": 4,
"trigger": {
"id": "20170",
"revealedDescription": "Disk space usage",
"description": "Disk space usage",
"revealedComments": "",
"comments": "",
"expression": "{25124}>90",
"lastChangeTime": 0,
"priority": 4,
"state": 0,
"status": 0,
"url": "",
"value": 1
},
"group": {
"id": "24",
"name": "d12-apps"
},
"host": {
"id": "10452",
"hostValue": "d12 Host",
"name": "d12 Host"
},
"itemsIds": [
37676
],
"tags": [],
"zabbixVersion": 5.4
}
# Объявление структур
Для начала необходимо разложить структуру первичного события на свойства. Для этого понадобится глобальная функция BreakStruct
.
Добавьте в сценарий глобальную функцию
BreakStruct
используя правую кнопку мыши.Соедините входящий пин
Object
функцииBreakStruct
с исходящим пиномValue
события запускаOnLogEvent
. Автоматически будет произведена "раскладка" структуры первичного события на соответствующие свойства в виде исходящих пинов функцииBreakStruct
.Нас интересует исходящий пин
source
с типомDynamic
, который содержит исходное событие с данными из Zabbix. А именно объектhost
, по данным которого мы будем создавать Конфигурационные единицы:"host": { "id": "10452", "hostValue": "d12 Host", "name": "d12 Host" }
Для работы со значениями, содержащимися в фрагменте, необходимо описать структуру данного объекта:
Создайте новую структуру в Диспетчере объектов - нажмите ➕ в категории Структуры - будет добавлена локальная структура
Struct
.Нажмите левой кнопкой мыши по вновь созданной структуре - откроется Инспектор объектов данной структуры.
Задайте Название структуры, например
ZabbixHostObject
Добавьте свойства структуры согласно JSON:
id
, типString
hostValue
, типString
name
, типString
Объявление структуры на данном этапе завершено.
# Доступ к полям события
Далее, чтобы получить доступ к объекту host
и его свойствам понадобится глобальная функция BreakDynamic
Добавьте в сценарий глобальную функцию
BreakDynamic
используя правую кнопку мыши.Соедините входящий пин
Object
функцииBreakDynamic
с исходящим пиномsource
предыдущей глобальной функцииBreakStruct
.Откройте Инспектор объектов функции
BreakDynamic
и добавьте исходящий пинhosts
с типомZabbixHostObject
(ранее объявленная структура).Далее необходимо опять "разложить" структуру объекта
host
, добавьте еще одну новую глобальную функциюBreakStruct
и соедините пины:- Исходящий пин
host
функцииBreakDynamic
➞ Входящий пинObject
функцииBreakStruct
- Исходящий пин
На данном этапе мы получили доступ к переменным события из Zabbix:
source.host.id
,source.host.name
,source.host.hostValue
в виде исходящих пинов функцииBreakStruct
.Следующим шагом необходимо подготовить запрос на создание Конфигурационной единицы, используя публичный API.
# Создание конфигурационной единицы
Будет рассмотрен пример создания КЕ с типом по умолчанию и назначением владельца - текущей Рабочей группы (владелец сценария).
Для создания КЕ используется запрос следующего минимального содержания:
{
# Идентификатор КЕ:
"id": 0,
# Имя КЕ
"name": "",
# Описание КЕ
"description": "",
# ID РГ-владельца КЕ:
"ownerWorkGroup": {
"id": 0
}
}
По представленному выше телу запроса необходимо создать 2 структуры:
createCIQuery
- структура описывающая весь JSONownerWorkGroup
- структура описывающая объекта"ownerWorkGroup": {"id": 0 }
Создайте новую структуру в Диспетчере объектов - нажмите ➕ в категории Структуры - будет добавлена локальная структура
Struct
.Нажмите левой кнопкой мыши по вновь созданной структуре - откроется Инспектор объектов данной структуры.
Задайте Название структуры, например
ownerWorkGroup
Добавьте свойства структуры согласно JSON:
id
, типInteger64
Повторите пункт 2-3 для создания еще одной структуры.
Задайте Название структуры, например
createCIQuery
Добавьте свойства структуры согласно JSON:
id
, типString
name
, типString
description
, типString
ownerWorkGroup
, типownerWorkGroup
- созданная структура.
# Подготовка тела запроса
Далее необходимо сформировать запрос на создание КЕ, где:
- Название КЕ =
source.host.name
- Описание КЕ =
source.host.id
- Владелец КЕ = Владелец сценария
Для присвоения значения свойствам созданных структур воспользуйтесь глобальной функцией SetMembersInStruct
.
# Присвойте значение идентификатора Рабочей группы-владельца сценария переменной id
в структуре ownerWorkGroup
Добавьте в сценарий глобальную функцию
SetMembersInStruct
.Создайте новую локальную переменную в Диспетчере объектов.
В Инспекторе объектов укажите название созданной переменной, например
ownerWorkGroupVar
.
Тип переменной укажитеownerWorkGroup
- ранее созданная структура.Добавьте переменную
ownerWorkGroupVar
в сценарий из Диспетчера объектов используя пункт контекстного меню Добавить в сценарий Get.Соедините пин переменной
ownerWorkGroupVar
с входящим пиномObject
блокаSetMembersInStruct
и откройте Инспектор объектов данного блока.Отметьте входящий пин
Id
в диспетчере объектов - он будет добавлен как входящий пин текущего блока.Добавьте в сценарий системную переменную
OwnerWorkGroupId
и соедините ее с входящим пиномId
блокаSetMembersInStruct
.Для того, чтобы данная функция была выполнена при запуске сценария соедините исходящий пин
ok
локальной функцииFilterEvents
с входящим пиномIn
функцииSetMembersInStruct
.
# Определите значения "Название КЕ" и "Описание КЕ" в структуре createCIQuery
Добавьте в сценарий еще одну глобальную функцию
SetMembersInStruct
Создайте новую локальную переменную в Диспетчере объектов
В Инспекторе объектов укажите название созданной переменной, например
CreateCIQueryVar
.
Тип переменной =CreateCIQuery
- ранее созданная структура.Добавьте переменную
CreateCIQueryVar
в сценарий из Диспетчера объектов.Соедините пин переменной
CreateCIQueryVar
с входящим пиномObject
блокаSetMembersInStruct
и откройте Инспектор объектов данного блока.Выберите пины, которые необходимо определить, они появятся как входящие пины блока функции
SetMembersInStruct
.Произведите следующую установку связей:
- Входящий пин
name
функцииSetMembersInStruct
➞ Исходящий пинname
функцииBreakStruct
(передаем значениеsource.host.name
в тело запроса на создание КЕ). - Входящий пин
description
функцииSetMembersInStruct
➞ Исходящий пинid
функцииBreakStruct
(передаем значениеsource.host.id
в тело запроса на создание КЕ). - Входящий пин
ownerWorkGroup
функцииSetMembersInStruct
➞ Исходящий пинResult
функцииSetMembersInStruct
(передаем значение идентификатора Рабочей группы владельца сценария в тело запроса на создание КЕ). - Входящий пин
In
функцииSetMembersInStruct
➞ Исходящий пинOut
функцииSetMembersInStruct
(указываем очередность выполнения функций в сценарии).
- Входящий пин
Установите значение входящего пина
id
функцииSetMemberInStruct
равной0
, для автоматической генерации идентификатора Конфигурационной единицы.
На данном этапе, ваш сценарий должен выглядеть следующим образом:
Далее необходимо отправить HTTP POST запрос в публичный API с подготовленными параметрами. Для этого необходима глобальная функция MonqHTTPRequest
.
Добавьте в сценарий глобальную функцию
MonqHTTPRequest
используя контекстное меню.Для авторизации в публичном API используется специальный токен
BearerToken
. Чтобы авторизовать запрос понадобится системная переменнаяRobotToken
. Добавьте ее из Диспетчера объектов.Также для HTTP запроса необходимо указать идентификатор пространства. Текущее значение хранится в системной переменной
UserspaceId
, также добавьте ее в сценарий.Произведите следующую установку связей:
- Входящий пин
UserspaceId
функцииMonqHTTPRequest
➞ Исходящий пин переменнойUserspaceId
(передаем значение идентификатора пространства в заголовке запроса на создание КЕ). - Входящий пин
BearerToken
функцииMonqHTTPRequest
➞ Исходящий пин переменнойRobotToken
(передаем значение токена авторизации в заголовке запроса на создание КЕ). - Входящий пин
Body
функцииMonqHTTPRequest
➞ Исходящий пинResult
функцииSetMembersInStruct
(передаем тело HTTP запроса на создание КЕ). - Входящий пин
In
функцииMonqHTTPRequest
➞ Исходящий пинOut
функцииSetMembersInStruct
(указываем очередность выполнения функций в сценарии).
- Входящий пин
Определите значение входящих пинов
Url
иType
функцииMonqHTTPRequest
, указав соответствующие значения:Url
=https://<monq-global-domain>/api/public/sm/v2/rsm/config-items?makeNameUnique=false
Type
=POST
Замените
<monq-global-domain>
на доменное имя вашего пространства monqНажмите кнопку Скомпилировать в верхней панели конструктора сценария.
Активируйте сценарий переключателем Активен/Неактивен в верхней панели конструктора сценария.
Готовый сценарий выглядит следующим образом:
Теперь при получении события из системы мониторинга Zabbix о проблеме или событии восстановления будет создаваться конфигурационная единица.
На этом возможности функционала Автоматизации не ограничены. Данный сценарий можно расширить различными условиями и проверками, а также выполнением других запросов публичного API.
Если у вас возникли трудности, вы можете импортировать в свою систему готовый сценарий используя функционал Импорт/Экспорт:
- Скопируйте код готового сценария в буфер обмена:
zabbix-host.txt (opens new window) - Перейдите в раздел управления сценариями Автоматизации.
- Создайте новый сценарий, задайте Владельца и Название сценария.
- Вставьте скопированный код в строку импорта.
- Нажмите Создать.
- Измените параметр
_stream.id
в локальной функцииFilterEvents
на идентификатор Потока данных, события которого необходимо обрабатывать сценарием автоматизации.