Пятница, 17 Октябрь 2025 11:16

Мониторинг программных лицензий 1С через Zabbix

Автор
Оцените материал
(2 голосов)

На работе дали задание отслеживать количество используемых программных лицензий 1С. Речь о клиентских лицензиях. Для этого есть уже рабочий Zabbix 5.4, в который нужно добавить и настроить шаблон для вышеупомянутой задачи. И готовый шаблон уже есть, оформленный отдельным проектом на Github:

https://github.com/slothfk/1c_zabbix_template_ce

Там же есть и инструкция по установке:

https://github.com/slothfk/1c_zabbix_template_ce/blob/master/docs/install.md

С первого взгляда кажется, что всё понятно, но лично у меня возникли некоторые проблемы и вопросы при установке и настройке. Поэтому хочу описать этот процесс своими словами и заострить внимание на некоторых моментах. И первый момент, в моём случае, заключается в том, что мне нужно мониторить лишь лицензии, а для этого достаточно импортировать лишь один шаблон 1c_license_server.xml. Поэтому скачиваю его:

https://github.com/slothfk/1c_zabbix_template_ce/blob/master/1c_license_server.xml

После чего перехожу в Zabbix в настройку шаблонов и импортирую скачанный шаблон:

В окошке импорта никакие опции не трогаю, а сразу выбираю файл:

На следующем шаге можно будет увидеть код шаблона (справа) и всё, что он добавляет (слева) – триггеры, элементы данных, правила обнаружения и т.д.:

Тут важно отметить, что в импортируемом файле 1c_license_server.xml заложено сразу два шаблона: Template App 1C Enterprise License Server и Template App 1C License Files. Второй является вложенным для первого:

Дальше нужно приступить к настройке zabbix агента на самом сервере лицензирования. У меня это Astra Linux 1.8_x86-64. Сперва я выполню все пункты настройки, которые описывает разработчик шаблона, а потом уже опишу нюансы от себя.
Сначала копирую на сервер лицензирования вот эти скрипты:

Для них нужно создать каталог /var/lib/zabbix/scripts. Создаю и скачиваю:

mkdir /var/lib/zabbix
mkdir /var/lib/zabbix/scripts
wget -O /var/lib/zabbix/scripts/1c_license_server.sh "https://github.com/slothfk/1c_zabbix_template_ce/raw/master/scripts/1c_license_server.sh"
wget -O /var/lib/zabbix/scripts/1c_license_files.sh "https://github.com/slothfk/1c_zabbix_template_ce/raw/master/scripts/1c_license_files.sh"
wget -O /var/lib/zabbix/scripts/1c_central_server.sh "https://github.com/slothfk/1c_zabbix_template_ce/raw/master/scripts/1c_central_server.sh"
wget -O /var/lib/zabbix/scripts/1c_common_module.sh "https://github.com/slothfk/1c_zabbix_template_ce/raw/master/scripts/1c_common_module.sh"
wget -O /var/lib/zabbix/scripts/1c_work_server.sh "https://github.com/slothfk/1c_zabbix_template_ce/raw/master/scripts/1c_work_server.sh"

Подозреваю, что в моём случае достаточно лишь первых двух файлов. Но пусть будут все, на всякий случай. Потом назначаю этим скриптам право ни исполнение, а также назначаю каталогу /var/lib/zabbix владельца – пользователя zabbix:

chmod +x /var/lib/zabbix/scripts/*.sh
chown -R zabbix:zabbix /var/lib/zabbix

Следующим шагом надо скопировать все файлы userparameter_1c-*.conf из каталога configs в каталог /etc/zabbix/zabbix_agent2.d (или /etc/zabbix/zabbix_agent.d):

Делаю это командами:

wget -O /etc/zabbix/zabbix_agent2.d/userparameter_1c-ls.conf "https://github.com/slothfk/1c_zabbix_template_ce/raw/master/configs/userparameter_1c-ls.conf"
wget -O /etc/zabbix/zabbix_agent2.d/userparameter_1c-lf.conf "https://github.com/slothfk/1c_zabbix_template_ce/raw/master/configs/userparameter_1c-lf.conf"
wget -O /etc/zabbix/zabbix_agent2.d/userparameter_1c-cs.conf "https://github.com/slothfk/1c_zabbix_template_ce/raw/master/configs/userparameter_1c-cs.conf"
wget -O /etc/zabbix/zabbix_agent2.d/userparameter_1c-ws.conf "https://github.com/slothfk/1c_zabbix_template_ce/raw/master/configs/userparameter_1c-ws.conf"

Здесь тоже подозреваю, что для моей задачи хватило бы лишь первых двух конфигов. После добавления этих конфигов надо перезапустить zabbix агента:

systemctl restart zabbix-agent2

Следующим шагом будет создание каталога и подкаталогов для логов и назначение нужных прав на них:

mkdir /var/log/1C
mkdir /var/log/1C/zabbix
mkdir /var/log/1C/zabbix/problem_log
chown -R usr1cv8:grp1cv8 /var/log/1C
chown zabbix:grp1cv8 /var/log/1C/zabbix/problem_log

Разработчик шаблона требует установить именно такие права. Также, разработчик указывает добавить пользователя zabbix в группу grp1cv8, чтобы скрипт, запущенный zabbix агентом мог прочитать файлы технологического журнала:

usermod -a -G grp1cv8 zabbix

Далее разработчик пишет, что следует из файла configs/logcfg.xml перенести секции log в файл logcfg.xml рабочего сервера 1С Предприятия (или просто скопировать его в каталог /opt/1C/v8.3/тип_архитектуры/conf/, если сбор ТЖ ранее не использовался):

И тут стоит обратить внимание, что в файле из Гитхаба присутствует шаблонная переменная {{tech_logs_dir}} – её надо заменить на тот путь, куда будут собираться логи тех.журнала. Т.е. например вот эта строка:

<log location="{{tech_logs_dir}}/zabbix/locks" history="1">

должна быть такой:

<log location="/var/log/1C/zabbix/locks" history="1">

И поскольку у меня уже есть файл со своими настройками тех.журнала /opt/1cv8/conf/logcfg.xml, то мне в него нужно добавить вот такую конструкцию:

     <log location="/var/log/1C/zabbix/locks" history="1">
         <event>
             <eq property="name" value="tlock"/>
         </event>
         <event>
             <eq property="name" value="ttimeout"/>
         </event>
         <event>
             <eq property="name" value="tdeadlock"/>
         </event>
         <property name="p:processname"/>
         <property name="t:connectid"/>
         <property name="waitconnections"/>
         <property name="deadlockconnectionintersections"/>
         <property name="regions"/>
         <property name="locks"/>
         <property name="context"/>
     </log>
     <log location="/var/log/1C/zabbix/calls" history="1">
         <event>
             <eq property="name" value="call"/>
             <ne property="context" value=""/>
         </event>
         <event>
             <eq property="name" value="call"/>
             <ne property="module" value=""/>
             <ne property="method" value=""/>
         </event>
         <property name="p:processname"/>
         <property name="context"/>
         <property name="module"/>
         <property name="method"/>
         <property name="memorypeak"/>
         <property name="cputime"/>
         <property name="inbytes"/>
         <property name="outbytes"/>
     </log>
     <log location="/var/log/1C/zabbix/excps" history="1">
         <event>
             <eq property="name" value="excp"/>
         </event>
         <property name="p:processname"/>
         <property name="descr"/>
         <property name="context"/>
     </log>

Эту конструкцию я добавляю ниже своих уже настроенных логов, например сюда:

Сервер приложений, при этом, не нужно перезапускать. Если всё сделано правильно, и logcfg.xml настроено корректно, то в каталоге /var/log/1C/zabbix появятся подкаталоги calls, excps и locks:

Следующим шагом разработчик пишет, что у zabbix агента надо прописать параметр ServerActive, поскольку в шаблоне используются элементы данных, получающие данные от активного агента Zabbix. В /etc/zabbix/zabbix_agent2.conf прописываю строку:

ServerActive=zabbix-server.srv

где zabbix-server.srv – адрес сервера Zabbix. Он же прописан в параметре Server.

Вместе с тем, разработчик указывает, параметр Hostname должен иметь такое же значение какое имеет этот узел мониторинга на сервере Zabbix. В противном случае, Zabbix сервер не сможет корректно обработать поступающие к нему данные. Ну т.е. вот наглядно на картинке:

После внесённых изменений в конфиг не забываю перезапустить агента:

systemctl restart zabbix-agent2

Дальше разработчик пишет: Для корректной работы скриптов на сервере 1С Предприятия должны быть установлены следующие программы: zabbix-sender и zabbix-get. Так же должен быть запущен RAS на центральном сервере кластера. И вот тут могут возникнуть непонятки. Начну с пакетов zabbix-sender и zabbix-get. Дело в том, что на моей Astra Linux установлен zabbix агент из родных репозиториев Астры, и в этом репозитории нет пакета zabbix-get. Не знаю, этот нюанс только в Астре, или может ещё где-то есть, но случае с Astra Linux решением будет переустановка zabbix агента из оф.репозитория Zabbix. Как известно, Astra Linux 1.8 сделана на базе Debian 12, поэтому подключаю репозиторий под Debian12, затем удаляю старого агента и ставлю нового:

wget https://repo.zabbix.com/zabbix/6.0/debian/pool/main/z/zabbix-release/zabbix-release_latest_6.0+debian12_all.deb
dpkg -i zabbix-release_latest_6.0+debian12_all.deb
apt update
systemctl stop zabbix-agent2
systemctl disable zabbix-agent2
apt remove zabbix-agent2
apt install zabbix-agent2=1:6.0.42-1+debian12 zabbix-sender=1:6.0.42-1+debian12 zabbix-get=1:6.0.42-1+debian12
systemctl restart zabbix-agent2
systemctl enable zabbix-agent2

Во время установки нового zabbix агента будет вопрос о том, сохранить или заменить конфиг от старого агента. Я выбираю оставить старый конфиг:

Файл настройки «/etc/zabbix/zabbix_agent2.conf»
 ==> Изменён с момента установки (вами или сценарием).
 ==> Автор пакета предоставил обновлённую версию.
  Что нужно сделать? Есть следующие варианты:
   Y или I : установить версию, предлагаемую сопровождающим пакета
   N или O : оставить установленную на данный момент версию
      D    : показать различия между версиями
      Z    : запустить оболочку командной строки для проверки ситуации
 По умолчанию сохраняется текущая версия файла настройки.
*** zabbix_agent2.conf (Y/I/N/O/D/Z) [по умолчанию N] ? O

Теперь, что касается сервиса RAS. Я хочу показать свою структуру кластеров:

Из картинки видно, что сервер лицензирования входит в разные кластеры и выполняет роль именно лицензирования – через ТНФ настроено, что он только выдаёт лицензии. Верхний кластер работает на портах 1540, 1541. Средний кластер поднят на том же самом сервере (1cerp-app-t1), но уже на портах 2540, 2541. А нижний (третий) кластер поднят на портах 3540, 3541. Так вот, демон(служба) RAS должна быть настроена и включена на центральных серверах кластера, а не на самом сервере лицензирования. Ну т.е., в моём случае, это серверы: 1cerp-app-p1:3540, 1cerp-app-t1:2540 и 1cerp-app-t1:1540.

Приведу пример юнита RAS для первого(верхнего) сервера. В каталоге /etc/systemd/system создаётся файл с таким содержимым:

[Unit]
Description=1C:Enterprise Remote Administration Server 8.3 (8.3.25.1560)
Requires=network.target
 
[Service]
Type=simple
User=usr1cv8
Group=grp1cv8
# Remote administration server port
Environment=RAS_PORT=1545

# Address of cluster agent. Default - empty, so ras administers cluster,
# running on localhost and standard agent port
# example value:
#   host[:port]
Environment=RAS_CLUSTER_ADDRESS=localhost:1540

ExecStart=/opt/1cv8/x86_64/8.3.25.1560/ras cluster --port=${RAS_PORT} $RAS_CLUSTER_ADDRESS --monitor-base /metrics --monitor-address localhost --monitor-port 1555
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target

Имя файла можно любое осмысленное, например ras-8.3.25.1560-1545.service. Повторюсь, что он должен быть создан и запущен на сервере 1cerp-app-t1:1540. Дальше этот юнит включается и запускается:

systemctl enable ras-8.3.25.1560-1545.service
systemctl start ras-8.3.25.1560-1545.service

На остальных двух серверах делается аналогично, но лучше для удобства использовать порты 2545-2555 и 3545-3555.

Идём далее. Автор шаблона, в своей же статье на Инфостарте, пишет, что должны быть установлены ещё и пакеты ring и license-tools:

https://infostart.ru/1c/tools/1114020/

Эти пакеты идут в комплекте установщика 1c-enterprise-license-tools-a.b.c+d_linux_x86_64.tar, который скачивается на сайте https://releases.1c.ru/. Кратко опишу процесс установки. Сначала надо установить Liberica 11 Full JDK, пакет которой можно скачать тоже на сайте 1С https://releases.1c.ru/project/Liberica11FullJDK:

dpkg -i bellsoft_jdk11.0.20_8_linux_amd64_full.deb

Затем, надо распаковать скачанный 1c-enterprise-license-tools (пусть это будет версия 0.15.0_2):

tar -zxvf 1c_enterprise_license_tools_0.15.0_2_linux_x86_64.tar.gz

и запустить установщик:

cd 1c_enterprise_license_tools_0.15.0_2_linux_x86_64
./1ce-installer-cli install --ignore-signature-warnings

После установки можно проверить, работает ли утилита ring. Нужно перейти в каталог с её расположением и запустить, например, просмотр ключей:

cd /opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/
./ring license list --path /var/1C/licenses/

У меня вылезло предупреждение:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/lib/compat-0.11/guice-4.2.2.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

Чтобы этой ругани не было, нужно сделать как написано тут:

https://infostart.ru/1c/articles/1723694/

В файле /opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring нахожу вот эту строку:

CODEPATH="-p "${DIR}/lib/boot" --add-modules=ALL-MODULE-PATH --add-opens java.base/java.lang=com.e1c.ring.cli.boot.jpms"

И правлю её вот так:

CODEPATH="-p "${DIR}/lib/boot" --add-modules=ALL-MODULE-PATH --add-opens java.base/java.lang=com.e1c.ring.cli.boot.jpms --add-opens java.base/java.lang=ALL-UNNAMED"

Сохраняю изменения и снова пробую запустить:

./ring license list --path /var/1C/licenses/

На этот раз результат выходит без всякой ругани (ключ один у меня):

558234765987232-8138745639 (имя файла: "20240518212438.lic")

Идём дальше. Разработчик пишет: В случае использования шаблона на Debian-like операционных системах, необходимо заменить, установленный в системе по-умолчанию mawk, на gawk, так как в скриптах сервера лицензирования используются специфичные для gawk "конструкции". У меня установлены и mawk, и gawk. Проверить, какой из них используется системой можно так:

readlink /etc/alternatives/awk

Если вывод такой:

/usr/bin/gawk

значит всё как нужно. Если gawk не установлен или не используется, то его сначала надо установить, а затем выбрать в конфиг-меню:

apt install gawk
update-alternatives --config awk

Появится меню выбора. Надо выбрать номер, соответствующий /usr/bin/gawk.

Так, теперь пришло время проверить корректность работы zabbix агента. Чтобы это сделать, нужно по ssh зайти на zabbix сервер и в консоли запустить следующую команду:

zabbix_get -s 192.168.10.240 -p 10050 -k 1c.ls.sessions["1545","1.5","clastadmin","passclastadmin"]

где 192.168.10.240 – адрес сервера лицензирования 1С, а конструкция 1c.ls.sessions["1545","1.5","clastadmin","passclastadmin"] – это ключ по которому заббикс получает ряд элементов данных шаблона:

На скриншоте этот ключ изображён с подставляемыми в него макросами. Я заменил макросы на значения, которые потом собираюсь в эти макросы прописать. Т.е. это порт RAS демона, таймаут ожидания ответа от службы RAS, администратор кластера и пароль администратора кластера.

И вот здесь кроется подвох, который я долго не мог понять и который нигде не описан, но из-за которого ничего не работает. И этот подвох я как раз и нашёл, когда решил попробовать запросить данные через zabbix_get. А подвох в пароле администратора кластера. Если в нём есть спецсимволы, например, «@» или «#», то вылезет ошибка:

zabbix_get -s 192.168.10.240 -p 10050 -k 1c.ls.sessions["1545","1.5","clastadmin","P@ssword"]
ZBX_NOTSUPPORTED: Character "@" is not allowed

Соответственно, в вэб-интерфейсе заббикса это нигде не отображается (ну или я не увидел), и понять чё оно не работает – тяжко. Поэтому для заббикса надо создать отдельного администратора кластера с паролем без спецсимволов. В каждом кластере:

После чего пробую снова сделать запрос для разных RAS и уже получаю какие-то результаты:

zabbix_get -s 192.168.10.240 -p 10050 -k 1c.ls.sessions["1545","1.5","zabbix","Zabpass"]
CL#8c3464526-2562-4566-9564-0da34565d31:192:154:194:2:0
LIC#20240518212438.lic:192
summary:192:154:194:2:0

zabbix_get -s 192.168.10.240 -p 10050 -k 1c.ls.sessions["2545","1.5","zabbix","Zabpass"]
CL#8c3464526-2562-4566-9564-0da34565d31:12:14:14:2:0
LIC#20240518212438.lic:0
summary:12:14:14:2:0

zabbix_get -s 192.168.10.240 -p 10050 -k 1c.ls.sessions["3545","1.5","zabbix","Zabpass"]
CL#8c3464526-2562-4566-9564-0da34565d31:2:1:4:2:0
LIC#20240518212438.lic:0
summary:2:1:4:2:0

Это вывод лишь для наглядности того, что примерно должно получиться. Циферки я намеренно исказил для конфиденциальности.

Теперь перехожу в вэб-интерфейс Zabbix сервера и добавляю шаблон Template App 1C Enterprise License Server к моему серверу лицензирования 1С:

Затем добавляю нужные макросы:

Кстати сказать, макросы с логином и паролем кластерного админа можно заполнить прямо в самом шаблоне, чтобы не прописывать их каждому хосту вручную:

Ну и всё, спустя некоторое время у хоста появятся данные об использовании лицензий:

Донаты принимаются на кошельки:

Yoomoney:
4100118091867315

Карта Т-Банк (бывший Тиньков):
2200 7017 2612 2077

Карта Альфа-Банк:
2200 1539 1357 2013

Прочитано 12 раз Последнее изменение Суббота, 18 Октябрь 2025 21:24

You have no rights to post comments

Вы здесь: Home Мои статьи Разное Мониторинг программных лицензий 1С через Zabbix