Перейти к основному содержимому
Версия: 6.2

Настройки SME-RE

SME-RE принимает запросы по двум маршрутам:

МаршрутКто вызываетАутентификация
/sme_remote_exec/*Команда script в поиске, тип script планировщика задачBasic: sme.core.remote_script.user и пароль из keystore
/sme_scripts/v1/*Активные действия на скриптах из каталога (плагин sm-actions-api)Bearer-токен из хранилища токенов SME-RE

Настройки первого маршрута описаны в разделах Общие настройки подключения к SME-RE, Информация для запуска скрипта в поиске и Информация для запуска скрипта в планировщике задач. Настройки второго — в разделе Запуск активных действий через маршрут /sme_scripts/v1.

Проверка настройки SME-RE​

Проверка наличия утилиты SME-RE​

Утилита SME-RE автоматически устанавливается при каждом развертывании или обновлении системы. Она присутствует на всех узлах OpenSearch, для которых в файле opensearch.yml установлено значение node.attr.node_with_sme: true.

Обратите внимание!

Убедитесь, что конфигурационный файл /app/opensearch/utils/sme-re/application.properties существует и содержит корректные настройки. Если файл отсутствует, утилита SME-RE не сможет подключиться к OpenSearch. Также проверьте, что в opensearch.yml параметру node.attr.node_with_sme присвоено значение true. Если установлено значение false, на этот узел не будут отправляться задания на выполнение скриптов из поиска.

Проверка конфигурации​

Проверьте текущие настройки, выполнив команду в консоли разработчика (Навигационное меню - Параметры системы - Консоль разработчика):

GET _cluster/settings

В ответе найдите следующий блок:

...
"sme": {
"core": {
"remote_script": {
"base_path": "/app/opensearch/utils/scripts/",
"enable_ssl": "true",
"port": "18080",
"base_interpreter_name": "bash",
"url": "https://127.0.0.1",
"interpreters": [
"python3::/app/opensearch/utils/python/bin/python3",
"bash::bash"
]
},
"enable_field_caps": "false",
"enable_limits": "true"
},
"overwrite": {
"scroll_timeout": "30000"
}
},
...

Если раздел sme.core отсутствует, добавьте его и при необходимости скорректируйте значения параметров.

В консоли разработчика выполните команду:

PUT _cluster/settings
{
"persistent": {
"sme": {
"core": {
"remote_script": {
"base_path": "/app/opensearch/utils/scripts/",
"enable_ssl": true,
"port": "18080",
"base_interpreter_name": "bash",
"url": "https://127.0.0.1",
"interpreters": [
"python3::/app/opensearch/utils/python/bin/python3",
"bash::bash"
]
}
}
}
}
}
Обратите внимание!

Скрипт из команды script в поиске выполняется на случайном узле OpenSearch, для которого установлено значение node.attr.node_with_sme: true. Поэтому такие скрипты должны быть размещены на всех узлах с этим параметром.

К активным действиям это не относится: плагин сам передает код скрипта на SME-RE, поэтому размещать его на узлах не нужно.

Чтобы проверить список узлов и их параметры, выполните команду в консоли разработчика (Навигационное меню - Параметры системы - Консоль разработчика):

GET _cat/nodeattrs

В выдаче команды найдите параметр node_with_sme.

Параметры запуска SME-RE​

Параметры запуска SME-RE указываются в конфигурационном файле application.properties, который находится в одной директории с утилитой SME-RE.

Общие параметры​

ПараметрОписаниеЗначение по умолчанию
server.portПорт, на котором SME-RE будет принимать входящие соединения18080
spring.servlet.multipart.max-request-sizeМаксимальный размер файлов для загрузки в байтах100000000
server.tomcat.max-http-form-post-sizeМаксимальный размер для запросов multipart/form-data в байтах104857600
sme.FileRotatePeriodВремя ротации файлов с данными запроса в секундах10000
sme.baseDataДиректория хранения файлов с данными запроса./data
sme.directoryPollerIntervalИнтервал проверки директории хранения файлов с данными запроса в секундах50
sme.scriptConfigPathПуть до конфигурационного файла scripts.yaml./scripts.yaml
sme.LogStringSizeРазмер строки логов300
sme.RapidDeleteУдалять ли файлы с данными запросовTrue
sme.redis.urlАдрес для подключения к Redis"127.0.0.1"
sme.redis.portПорт для подключения к Redis6379
sme.redis.passПароль для подключения к Redis""
logging.file.pathПуть для хранения логовlogs
server.ssl.enabledПри ожидании входящих подключений использовать SSL/TLStrue
server.ssl.certificateПуть до открытого ключа (сертификата) текущего сервера SME-RE в формате PKCS8/app/opensearch/config/node-cert.pem
server.ssl.certificate-private-keyПуть до закрытого ключа текущего сервера SME-RE в формате PKCS8/app/opensearch/config/node-key.pem
server.ssl.trust-certificateПуть до цепочки удостоверяющих центров (CA) в формате PKCS8/app/opensearch/config/ca-cert.pem
server.ssl.client-authРежим валидации сертификатов, может быть need, none, wantneed

Параметры маршрута активных действий /sme_scripts/v1​

Параметры читаются при старте SME-RE. Исключение — хранилище токенов, которое перечитывается без перезапуска.

ПараметрОписаниеЗначение по умолчанию
sme.scripts.interpretersРазрешенные пути интерпретаторов через запятую. Запуск с путем, которого нет в списке, отклоняется. Пустой список запрещает все запуски(пусто)
sme.scripts.loadersDirКаталог, куда при старте раскладываются загрузчик скриптов и пакет sm_actions./loaders
sme.scripts.cacheDirКаталог кэша кода скриптов./scripts-cache
sme.scripts.cacheMaxBytesОбъем кэша кода. При переполнении удаляются файлы, которые дольше всего не использовались1GB
sme.scripts.workRootКорень рабочих каталогов вызовов./runs
sme.scripts.maxProcessesОбщее число одновременно работающих процессов скриптов16
sme.scripts.maxPerScriptЧисло одновременно работающих процессов одного скрипта4
sme.scripts.queueSizeСколько вызовов могут ждать свободного места. Сверх этого — 429 busy. Свободное место занимается без очереди, поэтому 0 означает «без очереди», а не «отказ всем»32
sme.scripts.queueWaitMsСколько миллисекунд вызов ждет места в очереди2000
sme.scripts.maxSourceBytesПредел размера кода скрипта при загрузке. Сверх него — 413 source.too_large20MB
sme.scripts.maxOutputBytesПредел размера результата скрипта10MB
sme.scripts.logTailBytesРазмер хвоста stdout и stderr скрипта, который возвращается в ответе и попадает в диагностику запуска64KB
sme.scripts.interruptGraceЗа сколько до истечения срока вызова скрипту посылается SIGTERM, чтобы run() получил DeadlineExceeded и освободил ресурсы. Не больше 10 % срока1s
sme.scripts.pool.enabledСохранять запущенные процессы скриптов между вызовами. Если параметр выключен, каждый вызов запускает новый процессfalse
sme.scripts.pool.idleTtlКак долго простаивающий процесс остается запущенным до остановки5m
sme.scripts.pool.maxCallsPerWorkerСколько вызовов обслуживает один процесс до перезапуска1000
sme.scripts.pool.setupBackoffПауза перед повторной попыткой поднять процесс после сбоя setup()30s
sme.scripts.pool.maxMessageBytesПредел размера сообщения между SME-RE и запущенным процессом64MB
sme.scripts.pool.teardownTimeoutСколько ждать teardown() при остановке процесса5s
sme.scripts.auth.keystorePathПуть к PKCS12-хранилищу токенов вызовов. Если пусто, токенов нет и все вызовы получают 401(пусто)
sme.scripts.auth.keystorePasswordПароль хранилища токеновЗначение переменной окружения SME_RE_KEYSTORE_PASSWORD
sme.scripts.auth.reloadCheckIntervalКак часто проверяется время изменения файла хранилища. Измененный файл перечитывается без перезапуска; если файл не удается прочитать, используется прежний набор токенов5s
Обратите внимание!
  • путь в sme.scripts.interpreters должен вести к исполняемому файлу интерпретатора (подойдет bin/python3 виртуального окружения), а не к shim или обертке, которая запускает интерпретатор дочерним процессом. Иначе при прерывании вызова дочерние процессы скрипта продолжат работу. Для разных наборов библиотек используйте разные виртуальные окружения и пути
  • группа процессов скрипта завершается командой kill. Она должна находиться в PATH процесса SME-RE (в минимальные образы ее добавляет пакет procps). Если команда kill отсутствует, при запуске в журнал записывается ошибка

Общие настройки подключения к SME-RE​

Настройки ниже относятся к маршруту /sme_remote_exec (команда script в поиске и тип script планировщика задач). Активные действия на маршруте /sme_scripts/v1 используют из них только sme.core.remote_script.enable_ssl, а вместо пользователя и пароля — токен (см. раздел Запуск активных действий).

НастройкаОписаниеЗначение по умолчаниюТип настройки
sme.core.remote_script.userИмя пользователя, от которого выполняется запрос к SME-REsme_re_userКластерная настройка
sme.core.remote_script.passwordПароль пользователя, от которого выполняется запрос к SME-RE—Настройка keystore узла
sme.core.remote_script.enable_sslФлаг, указывающий, использовать ли SSL для подключения к SME-RE из команды script в поиске, из типа script планировщика задач и из активных действийtrueКластерная настройка

Информация для запуска скрипта в поиске​

Настройки подключения к SME-RE из команды script в поиске​

В таблице приведены кластерные настройки подключения команды script к SME-RE:

НастройкаОписаниеЗначение по умолчанию
sme.core.remote_script.base_pathПуть к каталогу, куда будут загружаться скрипты"/app/opensearch/utils/scripts/"
sme.core.remote_script.portПорт, на котором запущен SME-RE18080
sme.core.remote_script.urlСписок URL-адресов узлов, на которых работает SME-RE["https://127.0.0.1"]
sme.core.remote_script.base_interpreter_nameНазвание интерпретатора по умолчанию, чтобы использовать команду script без параметра intr"bash"
sme.core.remote_script.interpretersМассив строк с доступными интерпретаторами. Формат элемента: "название интерпретатора"::"путь к интерпретатору". Массив используется командой script; для активных действий см. раздел Интерпретаторы["python3::/app/opensearch/utils/python/bin/python3","bash::bash"]
к сведению

Запросы равномерно распределяются между хостами с SME-RE с помощью алгоритма Round Robin.

Авторизация

Авторизация запросов к SME-RE на маршруте /sme_remote_exec всегда выполняется на том хосте, где запущен SME-RE.

Создание скрипта​

Чтобы использовать скрипт в поиске, разместите его на всех серверах кластера в каталоге, указанном в настройке sme.core.remote_script.base_path. Убедитесь, что файл исполняемый и принадлежит пользователю и группе opensearch:opensearch.

Чтобы вернуть из скрипта данные для дальнейшей обработки в поиске, нужно вывести результат в формате JSON.

Пример для Python:

print(scriptResultJson)

Если перед командой script выполняются другие команды, их результат сохраняется во временный файл в папке, указанной в sme.baseData. Название этого файла будет передано в скрипт аргументом командной строки.

Пример для Python:

import sys

if __name__ == "__main__":
# открыть файл с данными из запроса
inputDataFile = open(sys.argv[1], "r")
# прочитать файл с данными из запроса
inputData = inputDataFile.read()
# закрыть файл после прочтения
inputDataFile.close()

Запуск активных действий через маршрут /sme_scripts/v1​

Активные действия на скриптах из каталога ядра (_core/adhoc_scripts) выполняет SME-RE по запросу плагина sm-actions-api. Хост SME-RE выбирается из списка sme.core.remote_script.url, а код скрипта плагин передает самостоятельно.

Настройки подключения со стороны OpenSearch​

Адреса SME-RE берутся из тех же кластерных настроек, что и для команды script. Их изменение подхватывается без перезапуска узлов.

НастройкаОписаниеЗначение по умолчаниюТип настройки
sme.core.remote_script.urlСписок URL-адресов узлов с SME-RE. Схема берется из записи; если она не указана — определяется по enable_ssl. Порт берется из записи; если он не указан — используется общий порт["https://127.0.0.1"]Кластерная настройка
sme.core.remote_script.portПорт SME-RE для записей без порта18080Кластерная настройка
sme.core.remote_script.enable_sslИспользовать ли SSL для записей без схемыtrueКластерная настройка
sm.actions.script.sme_re.tokenТокен вызовов скриптов. Без него запуски отклоняются, а в журнале узла при старте появляется предупреждение—Настройка keystore узла
sm.actions.script.deadline_marginЗапас между сроком вызова SME-RE и сроком выполнения действия, чтобы ответ успел дойти до плагина2sНастройка узла (opensearch.yml)

Токен вызовов скриптов​

Вызовы на маршруте /sme_scripts/v1 принимаются с заголовком Authorization: Bearer <token>. SME-RE проверяет токен по своему хранилищу: файлу PKCS12, путь к которому задан в sme.scripts.auth.keystorePath. Принимается каждая секретная запись с алиасом, начинающимся на scripts-token, длиной не меньше 32 байт. Записей может быть несколько.

Порядок создания токена:

  1. Сгенерируйте токен:

    openssl rand -base64 32
  2. На каждом хосте SME-RE добавьте токен в хранилище (пароль хранилища задается переменной окружения SME_RE_KEYSTORE_PASSWORD):

    keytool -importpass -storetype PKCS12 -keystore <путь из sme.scripts.auth.keystorePath> -alias scripts-token-<метка>

    Перезапуск SME-RE не нужен: файл перечитывается в пределах sme.scripts.auth.reloadCheckInterval.

  3. На каждом узле OpenSearch добавьте тот же токен в keystore. Через консоль разработчика (настройка применяется сразу):

    POST _core/keystore/sm.actions.script.sme_re.token
    {
    "value": "<токен>"
    }

    Или добавьте токен с помощью утилиты на узле, а затем перезагрузите защищенные настройки:

    opensearch-keystore add sm.actions.script.sme_re.token
    POST _nodes/reload_secure_settings

Чтобы сменить токен без простоя, добавьте новую запись в хранилище каждого SME-RE, затем замените токен на узлах OpenSearch. Когда старый алиас перестанет встречаться в журнале SME-RE, удалите его:

keytool -delete -storetype PKCS12 -keystore <путь> -alias <старый алиас>

Интерпретаторы​

Интерпретатор скрипта действия берется из справочника интерпретаторов ядра, а не из sme.core.remote_script.interpreters. Путь интерпретатора должен быть одинаковым на всех хостах SME-RE и входить в параметр sme.scripts.interpreters файла application.properties каждого из них, иначе SME-RE отклонит запуск.

Информация для запуска скрипта в планировщике задач (тип script)​

Тип script планировщика задач запускает произвольную команду на хосте SME-RE по маршруту /sme_remote_exec/command. Для его работы на узлах должен быть установлен плагин sm-actions-api.

Настройки подключения к SME-RE из ScriptAction в планировщике задач​

Получить настройки можно по следующему пути:

GET _core/settings/job-scheduler

В таблице приведены настройки подключения ScriptAction к SME-RE:

НастройкаОписаниеЗначение по умолчанию
sme-re_portПорт, на котором запущен SME-RE18080
sme-re_hostСписок URL-адресов узлов, на которых работает SME-RE["localhost"]

Пользователь и пароль берутся из кластерной настройки sme.core.remote_script.user и настройки keystore sme.core.remote_script.password.

Создание скрипта​

В планировщике задач можно запустить любой скрипт.

Для передачи скрипту секретных данных можно использовать механизм переменных environment. Он позволяет сохранить секреты в keystore, чтобы SME-RE добавлял их в переменные окружения при запуске скрипта.

Порядок настройки переменных environment:

  1. На всех серверах кластера сохраните в keystore значения переменных, которые нужно передать скрипту, под ключами вида jobscheduler.script.pass.<название переменной>.

  2. В настройках Планировщика задач укажите, какие переменные из keystore доступны каждому заданию. Для этого выполните команду:

    PUT _core/settings/job-scheduler
    {
    "script_environments": """{
    "<идентификатор задачи>": ["<название переменной>"]
    }"""
    }

    Теперь Планировщик задач передаст SME-RE эти переменные для запуска скрипта.

  3. Добавьте в скрипт чтение переменной из окружения.

    Пример для Python:

    import sys
    from os import getenv

    if __name__ == "__main__":
    # получить переменную из окружения
    try:
    envParamData = getenv("<название переменной>")
    except Exception as e:
    envParamData = e

Изменения в журналировании SME-RE​

Начиная с версии 4.2.1 журнал SME-RE включает следующие изменения:

  1. Добавлены следующие новые поля:
    • ID лога — уникальный идентификатор записи
    • ID потока — идентификатор потока, в котором создана запись
    • Код ошибки (только для записей об ошибках) — код, соответствующий конкретной проблеме в работе программы
    • Имя пользователя — пользователь, связанный с событием. Для вызовов по маршруту /sme_scripts/v1 указывается алиас токена
    • Глобальный тип — тип, который определяет принадлежность записи к определенной системе
  2. Теперь каждая запись включает дату и время.

Формат логов до изменений:

13:40:11.957 INFO [main] c.s.s.r.JavaClass#info:1 - Custom message

Формат логов после изменений:

[2024-11-27 13:40:11,957][INFO ][c.s.s.r.r.JavaClass] [re][user_name][id][id_thread] Custom message