Class: ZabbixManager::Hosts

Inherits:
Basic
  • Object
show all
Defined in:
lib/zabbix_manager/classes/hosts.rb

Instance Method Summary collapse

Methods inherited from Basic

#add, #all, #create, #delete, #destroy, #get, #get_full_data, #get_id, #get_ids, #get_ids_by_identify, #get_key_ids, #get_key_ids_by_identify, #get_or_create, #get_or_create_keys, #get_raw, #hash_equals?, #initialize, #key, #keys, #log, #merge_hashes, #normalize_array, #normalize_hash, #parse_keys, #request_raw, #symbolize_keys, #update

Constructor Details

This class inherits a constructor from ZabbixManager::Basic

Instance Method Details

#create_or_update(data) ⇒ Object

使用 Zabbix API 创建或更新 Zabbix 对象

Raises:



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/zabbix_manager/classes/hosts.rb', line 66

def create_or_update(data)
  # 输出调试日志,显示方法调用和参数信息
  log "[DEBUG] 调用 #{method_name}.create_or_update 方法,参数: #{data.inspect}"

  # 获取 Zabbix 对象的 ID
  hostid = get_id(identify.to_sym => data[identify.to_sym])
  # 如果不存在对应的对象ID,则创建新对象
  return create(data) unless hostid

  # 获取对象的接口 ID
  interface_id = get_interfaceid(hostid)
  # 如果接口 ID 不存在,抛出异常
  raise ZbxError, "#{data.inspect} get_interfaceid 查无记录" unless interface_id

  # 复制数据以避免修改原始数据
  dump_data = data.dup

  # 从数据中提取并删除 interfaces,并合并接口 ID
  interfaces = dump_data.delete(:interfaces)&.merge(interfaceid: interface_id)

  # 构建参数,包括 interfaces 和 Zabbix 对象的键值对
  params = dump_data.merge(interfaces: interfaces).merge(key.to_sym => hostid.to_s)

  # 更新对象
  update(params)
end

#default_optionsObject

在通过 Zabbix API 创建主机对象时使用的默认选项



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/zabbix_manager/classes/hosts.rb', line 16

def default_options
  {
    host:           nil,
    interfaces:     {
      main:    1,
      useip:   1,
      type:    2,
      ip:      nil,
      dns:     "",
      port:    161,
      details: {
        version:   2,
        community: "public"
      }
    },
    status:         0,
    available:      1,
    groups:         [],
    proxy_hostid:   nil,
    inventory_mode: 1
  }
end

#dump_by_id(data) ⇒ Object

通过 Zabbix API 从指定的 key 值获取主机对象数据



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/zabbix_manager/classes/hosts.rb', line 40

def dump_by_id(data)
  log "[DEBUG] 调用 dump_by_id 方法,参数: #{data.inspect}"

  get_raw({
            filter:      {
              key.to_sym => data[key.to_sym]
            },
            output:      "extend",
            selectHosts: "shorten"
          }
  )
end

#get_ids_by_name(data) ⇒ Object

通过 Zabbix API 根据名称获取 Zabbix 对象的 ID



54
55
56
57
58
59
60
61
62
63
# File 'lib/zabbix_manager/classes/hosts.rb', line 54

def get_ids_by_name(data)
  log "[DEBUG] 调用 #{method_name}.get_ids_by_name 方法,参数: #{data.inspect}"

  result = get_raw({
                     filter: { name: [data].flatten },
                     output: [key]
                   }
  )
  result.empty? ? nil : result.map { |i| { key.to_sym => i[key] } }
end

#get_interfaceid(hostid) ⇒ Object

从 API 中基于提供的 hostid 获取 Zabbix interface 的 id

Raises:



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/zabbix_manager/classes/hosts.rb', line 94

def get_interfaceid(hostid)
  log "[DEBUG] 调用 #{method_name}.get_interfaceid 方法,参数: #{hostid.inspect}"

  result = @client.api_request(
    method: "hostinterface.get",
    params: { output: "interfaceid", hostids: hostid }
  )

  # 使用 dig 方法获取深层嵌套的值
  interface_id = result&.dig(0, "interfaceid")&.to_i

  # 如果获取接口 ID 失败,提供更具体的错误信息
  raise ZbxError, "无法获取 #{hostid} 的接口 ID" if interface_id.nil?

  interface_id
end

#identifyObject

用于通过 Zabbix API 标识特定主机对象的 id 字段名称



11
12
13
# File 'lib/zabbix_manager/classes/hosts.rb', line 11

def identify
  "host"
end

#method_nameObject

与 Zabbix API 交互的主机方法名称



6
7
8
# File 'lib/zabbix_manager/classes/hosts.rb', line 6

def method_name
  "host"
end

在 Hosts 中使用 Zabbix API 取消关联/移除模板



112
113
114
115
116
117
118
119
120
121
# File 'lib/zabbix_manager/classes/hosts.rb', line 112

def unlink_templates(data)
  result = @client.api_request(
    method: "host.massRemove",
    params: {
      hostids:   data[:hosts_id],
      templates: data[:templates_id]
    }
  )
  result.empty? ? false : true
end