使用C#ZabbixAPI

时间:2018-08-14 09:34:51

标签: c# api nuget zabbix

我正在尝试使用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配置的注意事项:

  • Template_test 是有效且现有的模板
  • testhost 是现有的主机
  • 我在本演示中使用的Zabbix用户具有Zabbix超级管理员特权,可以消除权限问题。

===编辑===

正在提出四个请求:

  • user.login(确定)
  • template.get(确定)
  • host.get(确定)
  • host.update(NOK)

最后一个导致问题。完整请求为here

响应:

  

{“ jsonrpc”:“ 2.0”,“结果”:{“ hostids”:[“ 10135”]},“ id”:“ ca04d839-e6ec-4017-81b0-cc7f8e01fcfc”}

请求不必要地大。我会检查是否可以将其修剪一下。

1 个答案:

答案 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);

不仅如此,不仅使用了专有名称,而且请求正文也变小了。