我尝试自动发现我的整个网络,这是由 puppet 管理的,并且出于多种原因我想使用 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