[comment]: # translation:outdated

[comment]: # ({new-d30dc182})
# 2 Пользовательские макросы

[comment]: # ({/new-d30dc182})

[comment]: # ({new-4f638906})
#### Обзор

В дополнение к макросам
[поддерживающимся](/ru/manual/appendix/macros/supported_by_location) из
коробки в Zabbix также для большей гибкости поддерживаются
пользовательские макросы.

Пользовательские макросы можно можно определить на глобальном, уровне
шаблона и уровне узла сети. Такие макросы имеют специальный синтаксис:

    {$МАКРОС}

Zabbix раскрывает макросы в соответствии со следующей очередностью:

1.  макрос, назначенный узлу сети (проверяется в первую очередь)
2.  макрос, назначенный на первый уровень шаблонов у узла сети (т.е.
    шаблоны присоединенные напрямую к узлу сети), которые отсортированы
    по ID шаблона
3.  макрос, назначенный на второй уровень шаблонов у узла сети, которые
    отсортированы по ID шаблона
4.  макрос назначенный на третий уровень шаблонов у узла сети, которые
    отсортированы по ID шаблона и так далее
5.  глобальные макросы (проверяются в последнюю очередь)

Иными словами, если макрос не существует непосредственно у узла сети,
тогда Zabbix попытается найти его в шаблонах, присоединенных к этому
узлу сети, с учетом увеличивающейся глубины шаблонов. Если макрос все
еще не найден, то будет использован макрос глобального уровня, если он
существует конечно.

В случае, если Zabbix не удалось найти макрос, макрос не будет раскрыт.

Пользовательские макросы можно использовать в:

-   именах элементов данных
-   в параметрах ключей элементов данных
-   в интервалах обновления и гибких интервалах элементов данных
-   именах и описаниях триггеров
-   в параметрах и константах выражений триггеров (смотрите
    [примеры](#примеры))
-   многих других местах (смотрите [Макросы поддерживаемые по
    назначению](/ru/manual/appendix/macros/supported_by_location))

[comment]: # ({/new-4f638906})

[comment]: # ({new-e3755145})
##### Общие случаи использования глобальных макросов и макросов уровня узлов сети

-   используйте глобальные макросов в нескольких местах; затем измените
    значения макроса и изменения конфигурации применятся во всех местах
    за "одно нажатие"
-   получение преимуществ шаблонов со специфичными для узлов сети
    атрибутами: пароли, номера портов, имена файлов, регулярные
    выражения, и т.д.

[comment]: # ({/new-e3755145})

[comment]: # ({new-f4946b75})
#### Настройка

Для добавления пользовательских макросов, перейдите в соответствующие
разделы в веб-интерфейсе:

-   для глобальных макросов, посетите *Администрирование → Общие →
    Макросы*
-   для макросов на уровне узлов сети и шаблонов, откройте свойства узла
    сети или шаблона и найдите вкладку *Макросы*

::: notetip
Если пользовательский макрос используется в элементах
данных или триггерах шаблона, то предлагается добавить этот макрос к
шаблону, даже если он задан на глобальном уровне. Таким образом при
экспорте шаблона в XML и импорте его в другую систему элементы данных и
триггеры продолжат работать, как это и ожидалось.
:::

В именах макросов допускаются следующие символы: **A-Z** , **0-9** ,
**\_** , **.**

[comment]: # ({/new-f4946b75})

[comment]: # ({new-4c860844})
#### Примеры

[comment]: # ({/new-4c860844})

[comment]: # ({new-b9cf8f56})
##### Пример 1

Использование макроса в ключе элемента данных "Состояние демона SSH":

`net.tcp.service[ssh,{$SSH_PORT}]`

Этот элемент данных можно присоединить к нескольким узлам сети, при
условии, что значение **{$SSH\_PORT}** указано на этих узлах сети.

[comment]: # ({/new-b9cf8f56})

[comment]: # ({new-2a8b0009})
##### Пример 2

Использование макроса уровня узла сети в триггере "Загрузка CPU слишком
высокая":

`{ca_001:system.cpu.load[,avg1].last()}>{$MAX_CPULOAD}`

Такой триггер можно создать у шаблона, он не будет изменен у отдельных
узлов сети.

::: notetip
Если вы хотите использовать количество значений в
качестве параметра функции (например, **max(\#3)**), добавьте символ
решетки \# непосредственно в значение макроса, например вот так:
SOME\_PERIOD ⇒ \#3
:::

[comment]: # ({/new-2a8b0009})

[comment]: # ({new-c59027f2})
##### Пример 3

Использование двух макросов в триггере "Загрузка CPU слишком высокая":

`{ca_001:system.cpu.load[,avg1].min({$CPULOAD_PERIOD})}>{$MAX_CPULOAD}`

Заметьте, что макрос можно использовать в качестве параметра в функциях
триггеров, в этом примере в функции **min()**.

::: noteimportant
Пользовательские макросы будут раскрыты в
триггерах, если макросы используются в параметрах или как константы. Они
НЕ будут раскрыты, если используются как ссылка на функции, имена узлов
сети, ключи элементов данных или операторы.
:::

[comment]: # ({/new-c59027f2})

[comment]: # ({new-bd218e2e})
##### Пример 4

Синхронизация условия недоступности агентов с интервалом обновления
элемента данных:

-   задайте макрос {$INTERVAL} и используйте его в интервале обновления
    элемента данных;
-   используйте {$INTERVAL} параметром в триггере на недоступность
    агента:

`{ca_001:agent.ping.nodata({$INTERVAL})}=1`

[comment]: # ({/new-bd218e2e})

[comment]: # ({new-ee0008fc})
##### Пример 5

Централизация конфигурации рабочего времени:

-   создайте глобальный макрос {$WORKING\_HOURS} равный
    `1-5,09:00-18:00`;
-   используйте его в *Администрирование* → *Общие* → *Рабочее время*;
-   используйте его в *Пользователь* → *Оповещения* → *Когда активно*;
-   используйте его для настройки более частого опроса элементов данных
    в течении рабочего времени:

![](../../../../assets/en/manual/config/macros/usermacro_example5.png)

-   используйте его в условии действия *Период времени*;
-   отредактируйте рабочее время в *Администрирование* → *Общие* →
    *Макросы*, если требуется.

[comment]: # ({/new-ee0008fc})

[comment]: # ({new-e2688eb3})
#### Контекст пользовательских макросов

В пользовательских макросах можно использовать опциональный контекст,
позволяющий переопределять значение по умолчанию на значение с учётом
конкретной ситуации.

Пользовательские макросы с контекстом имеют схожий синтаксис:

    {$МАКРОС:контекст} 

Контекстом макроса является простое текстовое значение. Общим случаем
использования контекстов в макросах будет использование [значения
низкоуровневого
макроса](/ru/manual/discovery/low_level_discovery#использование_макросов_lld_в_контекстах_пользовательских_макросов)
в качестве контекста пользовательских макросов. Например, можно
определить прототип триггера для обнаружения примонтированных файловых
систем с использованием разных порогов малого свободного места в
зависимости от точек монтирования или типов файловых систем.

В контекстах макроса поддерживаются только макросы низкоуровневого
обнаружения. Любые другие макросы игнорируются и обрабатываются как
текстовые значения.

Технически, контекст макроса задается с использованием правил, похожих
на параметры [ключей элементов
данных](/ru/manual/config/items/item/key), за исключением того, что
контекст макроса при наличии `,` символа не обрабатывается как несколько
параметров:

-   Контекст макроса необходимо заключать в `​"` кавычки, если контекст
    содержит `}` символ или начинается с `​"` символа. Кавычки внутри
    заключенном в кавычки контексте необходимо экранировать при помощи
    `\` символа. Сам символ `\` не экранируется, что означает, что
    невозможно задать заключенный в кавычки контекст оканчивающийся на
    `\` символ - макрос `{$MACRO:​"a:\b\c\​"}` ошибочный
-   Пробелы в начале контекста игнорируются, пробелы в конце не
    игнорируются. Например, `{$MACRO:A}` тоже самое что и `{$MACRO: A}`,
    но не `{$MACRO:A }`.
-   Все пробелы до кавычек в начале и после кавычек игнорируются, но все
    пробелы внутри кавычек не игнорируются. Макросы `{$MACRO:​"A​"}`,
    `{$MACRO: ​"A​"}`, `{$MACRO:​"A​" }` и `{$MACRO: ​"A​" }` одинаковы,
    но макрос `{$MACRO:​"A​"}` и `{$MACRO:​" A ​"}` не одинаковы.

Следующие макросы одинаковы, так как имеют один и тот же контекст:
`{$MACRO:A}`, `{$MACRO: A}` и `{$MACRO:​"A​"}`. Такое поведение отлично
от ключей элементов данных, где `key[a]`, `key[ a]` и `key[​"a​"]`
одинаковы семантически, но различны для критерия уникальности.

Когда макросы с контекстами обрабатываются, Zabbix ищет макрос со своим
контекстом вычисляется. Если макрос с этим контекстом не задан на узле
сети или присоединенных шаблонах, и не задан как глобальный макрос с
контекстом, тогда выполняется поиск макроса без контекста.

Смотрите [пример
использования](/ru/manual/discovery/low_level_discovery#использование_макросов_lld_в_контекстах_пользовательских_макросов)
контекста макроса в прототипе триггера о свободном месте на диске и
примите во внимание пункт об ограничениях.

[comment]: # ({/new-e2688eb3})
