我正在尝试使用this特定的nuget包(版本1.1.3)将模板添加到Zabbix(3.0)中的主机。
虽然我可以获取/删除特定的主机和模板,但无法更新它们。 看着Zabbix documentation for updating hosts,我发现了对 templates 参数的描述:
用于替换当前链接的模板的模板。未通过的模板仅被取消链接。
所以我收集到一个信息,我应该在主机对象的 parentTemplates 属性中添加一个模板,并将主机传递给 HostService 的 Update 方法>:
Context context = new Context();
var templateService = new TemplateService(context);
Template template = templateService.Get(new { host = "Template_test" }).First();
var hostService = new HostService(context);
Host host = hostService.GetByName("testhost");
host.parentTemplates.Add(template);
hostService.Update(host);
(请注意,Context context = new Context()
将在我使用.config文件时正常工作。)
在编译和执行后,程序运行没有错误,但是主机仍然是无模板的。
以前有人尝试过吗? 我缺少明显的东西吗?
关于Zabbix配置的注意事项:
===编辑===
正在提出四个请求:
最后一个导致问题。完整请求为here。
响应:
{“ jsonrpc”:“ 2.0”,“结果”:{“ hostids”:[“ 10135”]},“ id”:“ ca04d839-e6ec-4017-81b0-cc7f8e01fcfc”}
请求不必要地大。我会检查是否可以将其修剪一下。
答案 0 :(得分:0)
如问题注释中所述:参数名称无效。 这是因为Zabbix的 host.get 方法会返回 parentTemplates 属性中的模板,而 host.update 使用的是 templates 。
NuGet的创建者没有考虑到这一点,因此我在他的项目中创建了一个新的issue。
我设法通过从 Host 派生一个类来使代码正常工作:
private class NewHost : Host
{
public IList<Template> templates { get; set; }
}
然后我可以使用此类进行请求:
Context context = new Context();
var templateService = new TemplateService(context);
Template template = templateService.Get(new { host = "Template_test" }).First();
var hostService = new HostService(context);
Host host = hostService.GetByName("testhost");
host.parentTemplates.Add(template);
var newhost = new NewHost
{
Id = host.Id,
templates = host.parentTemplates
}
hostService.Update(newhost);
不仅如此,不仅使用了专有名称,而且请求正文也变小了。