Назад | Перейти на главную страницу

Обнаружение сети Zabbix в марионеточной управляемой сети

Я пытаюсь автоматизировать обнаружение всей моей сети, которая управляется марионеткой, и я хочу использовать функцию обнаружения сети 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 для связывания хоста с шаблонами .