PowerShell调用Zabbix API查询事件如何获取主机名而非主机ID
Zabbix API事件查询返回主机名解决方案
方案1:单次查询直接关联主机信息(推荐)
Zabbix 原生event.get接口支持通过selectHosts参数直接拉取事件绑定的主机数据,无需单独查询主机列表,修改事件查询的params配置即可:
# 先单独存储登录凭证,避免result变量复用导致的取值错误 $auth = ($result.Content | ConvertFrom-Json).result # 查询事件列表 新增selectHosts参数 $params.body = @{ "jsonrpc" = "2.0" "method" = "event.get" "params" = @{ "output" = "extend" "selectHosts" = @("host", "hostid") # 新增该行,指定返回关联主机的名称和ID "time_from" = "1638226800" "time_till" = "1638313200" "sortfield" = @("clock", "eventid") "sortorder" = "DESC" } auth = $auth id = 1 } | ConvertTo-Json # 获取事件查询结果,返回结果中会新增hosts字段包含对应主机名 $result = Invoke-WebRequest @params -UseBasicParsing $eventWithHost = $result.Content | ConvertFrom-Json $eventWithHost.result # 直接查看带主机名的事件数据
方案2:本地关联已有主机映射
如果你需要复用已查询到的主机列表,可通过哈希表做ID到名称的映射,批量关联事件数据,适合大量数据处理场景:
# 存储登录凭证 $auth = ($result.Content | ConvertFrom-Json).result # 查询主机列表并生成ID-名称映射表 $params.body = @{ "jsonrpc" = "2.0" "method"= "host.get" "params"= @{ output = @( "host", "hostid", "status" ) selectInterfaces = @( "interfaceid", "ip", "dns", "useip" ) groupids = @( "40") } auth = $auth id = 2 } | ConvertTo-Json $hostResult = Invoke-WebRequest @params -UseBasicParsing | ConvertFrom-Json # 构建哈希映射表 $hostMap = @{} foreach ($h in $hostResult.result) { $hostMap[$h.hostid] = $h.host } # 查询事件列表 $params.body = @{ "jsonrpc" = "2.0" "method" = "event.get" "params" = @{ "output" = "extend" "time_from" = "1638226800" "time_till" = "1638313200" "sortfield" = @("clock", "eventid") "sortorder" = "DESC" } auth = $auth id = 1 } | ConvertTo-Json $eventResult = Invoke-WebRequest @params -UseBasicParsing | ConvertFrom-Json # 关联主机名 $eventWithHost = foreach ($e in $eventResult.result) { # 新增host_name字段存储对应主机名 $e | Add-Member -MemberType NoteProperty -Name "host_name" -Value $hostMap[$e.hostid] -Force $e } # 输出结果 可按需选择格式 $eventWithHost | Format-Table # 表格输出 $eventWithHost | ConvertTo-Json -Depth 10 # JSON输出
内容的提问来源于stack exchange,提问作者scribe
相关产品推荐
相关产品推荐

