我尝试自动发现用 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
答案1
最灵活和最强大的方法是使用 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 将主机链接到模板。