Я пытаюсь автоматизировать обнаружение всей моей сети, которая управляется марионеткой, и я хочу использовать функцию обнаружения сети zabbix вместо Puppetdb по нескольким причинам.
Я попытался создать пользовательский параметр с именем puppet.classes, который возвращает все классы в виде значений, разделенных запятыми (например, apache, mysql, zabbix,). Это называется проверкой правила обнаружения.
Затем установите в моих действиях «Полученное значение вроде apache», затем «Ссылка на шаблоны: Apache». Скриншот
Все в порядке только с несколькими классами марионеток, но в моей тестовой среде значение усекается в базе данных:
[zabbix]> select dserviceid,dhostid,status,lastup,lastdown,value,dns from dservices where dcheckid=3 and type=9 and key_='puppet.classes' \G
*************************** 1. row ***************************
dserviceid: 9
dhostid: 3
status: 0
lastup: 1464103581
lastdown: 0
value: ,apache,apache::default_confd_files,apache::default_mods,apache::mod::alias,apache::mod::dir,apache::mod::filter,apache::mod::mime,apache::mod::php,apache::mod::prefork,apache::mod::ssl,apache::mod::status,apache::params,apache::service,apache::version,ap
dns:
После довольно продолжительной отладки я наконец обнаружил, что проверки обнаружения не могут превышать 255 байт в
src/libs/zbxdbhigh/discovery.c
static void discovery_update_dservice(zbx_uint64_t dserviceid, int status, int lastup, int lastdown, const char *value)
{
char *value_esc;
value_esc = DBdyn_escape_string_len(value, DSERVICE_VALUE_LEN);
DBexecute("update dservices set status=%d,lastup=%d,lastdown=%d,value='%s' where dserviceid=" ZBX_FS_UI64, status, lastup, lastdown, value_esc, dserviceid);
zbx_free(value_esc);
}
include/db.h
#define DSERVICE_VALUE_LEN 255`
Использование метаданных с автоматической регистрацией будет иметь такое же ограничение:
### Option: HostMetadata
# Optional parameter that defines host metadata.
# Host metadata is used at host auto-registration process.
# An agent will issue an error and not start if the value is over limit of 255 characters.
# If not defined, value will be acquired from HostMetadataItem.
#
# Mandatory: no
# Range: 0-255 characters
# Default:
# HostMetadata=
Я мог бы использовать API и написать сценарий, который сделает это сам, но это был бы довольно большой проект, и я не нашел ни одного проекта, который бы это делал. Буду рад услышать, если есть.
Кроме того, я знаю, что могу создать несколько проверок обнаружения в правиле обнаружения, но в итоге я получу более 40 проверок в обнаружении, и мне придется добавлять их вручную каждый раз, когда у нас будет новый шаблон ... Я хотел бы иметь решение, в котором требуется как можно меньше манипуляций для добавления нового шаблона.
Кто-нибудь сталкивался с этой проблемой и получил масштабируемое решение?
Я использую zabbix 3.0.3
Самый гибкий и мощный подход - использовать Zabbix API для создания хостов и связывания их с соответствующими шаблонами из Puppet.
Один проект, который занимается этим, https://github.com/voxpupuli/puppet-zabbix#module-description , и похоже, что он уже протестирован с Zabbix 3.0. Есть и другие подобные https://github.com/purplehazech/puppet-zabbix и возможно больше.
Вы должны попробовать их сами, чтобы увидеть, какой из них лучше всего соответствует вашим потребностям.
Вы уже знаете о Zabbix обнаружение сети, но ограничение в 255 символов делает его не таким полезным для вас. Вы можете использовать более короткие коды вместо полных имен, таких как "apache :: default_confd_files", но это может быть труднее поддерживать, и, вероятно, все еще есть шанс достичь предела.
В автоматическая регистрация активного агента имеет тот же предел длины, поэтому не сильно отличается.
В качестве хакерского обходного пути вы можете использовать обнаружение сети или автоматическую регистрацию только для создания хостов и запуска сценария, который использует zabbix_get для запроса ключа элемента со всеми ролями, которые имеет хост, а затем использовать API для связывания хоста с шаблонами .