快速入门指南

在你安装 zabbix_utils 之后,就可以在脚本中使用它。

本快速入门指南将向你展示如何:

  • 从 Zabbix agent 获取主机名。
  • 使用 Zabbix API 创建一个主机和一个 trapper 监控项。
  • 向该监控项发送一个值。

本指南会逐步介绍脚本,并在引入每一部分时进行说明。 页面末尾提供了完整脚本

本指南还假定你的 Zabbix 服务器、agent 和 API 都在本地运行。

从 Zabbix agent 获取主机名

首先获取运行 Zabbix agent 的系统主机名。
您需要使用此主机名通过 Zabbix API 创建主机。

1. 从 zabbix_utils 导入 Getter 类。
此类的工作方式类似于 Zabbix get,可让您向 Zabbix agent 请求数据。

2. 创建一个 Getter 实例,连接到 127.0.0.1 上端口 10050 的本地 Zabbix agent。

3. 在 Getter 实例上调用 get() 方法,从 Zabbix agent 请求主机名。

  • get() 方法以监控项键作为参数,并向 Zabbix agent 发送该监控项的请求。
  • get() 方法返回一个对象,主机名存储在该对象的 value 属性中。
  • system.hostname 是一个内置的 Zabbix agent 键,用于返回主机名。
from zabbix_utils import Getter

agent = Getter(host='127.0.0.1', port=10050)
hostname = agent.get('system.hostname').value

连接并登录 Zabbix API

接下来,连接到 Zabbix API。 这将使你的脚本能够管理 Zabbix 对象,例如主机和监控项。

1. 从 zabbix_utils 导入 ZabbixAPI 类。

2. 创建一个 ZabbixAPI 实例,并提供你的 Zabbix 前端 URL。

3. 在 ZabbixAPI 实例上调用 login() 方法,并提供你的用户名和密码。 该账户必须具有访问 Zabbix API 的权限

4. 在 API 操作完成后,调用 logout() 方法关闭会话。

from zabbix_utils import ZabbixAPI

api = ZabbixAPI(url='127.0.0.1/zabbix')
api.login(user='Admin', password='zabbix')

# API operations go here

api.logout()

在 Zabbix 中创建主机

现在你已经从 Zabbix agent 获取了主机名,并且已连接到 Zabbix API,就可以在 Zabbix 中创建一个新主机。

1. 在 ZabbixAPI 实例上调用 host.create() API 方法,并提供主机详细信息:

  • host - 设置为包含你从 Zabbix agent 获取的主机名的 hostname 变量。
  • interfaces - 包含运行在该主机上的 Zabbix agent 的连接详细信息。
  • groups - 至少包含一个该主机应归属的主机组。

2. 由于 Zabbix API 会返回新创建主机的 ID,请将此 ID 保存到 host_id 变量中以便后续使用。

3. 打印一条消息以确认主机已创建。

api.host.create(
    host=hostname,
    interfaces=[{
        'type': 1,
        'main': 1,
        'useip': 1,
        'ip': '127.0.0.1',
        'dns': '',
        'port': '10050',
    }],
    groups=[{'groupid': '2'}]
)

host_id = host['hostids'][0]

print(f"Host '{hostname}' created with ID {host_id}")

在 Zabbix 中创建新监控项

在创建主机后,您可以为其添加一个监控项。

1. 为要创建的监控项定义一个唯一的 key。

2. 在 ZabbixAPI 实例上调用 item.create() 方法,并提供监控项详细信息:

  • hostid - 设置为 host_id 变量,其中包含您刚创建的主机的 ID。
  • name - 监控项的名称。
  • key_ - 设置为您刚定义的 item_key 变量。
  • type - 设置为 2 (trapper item),这是后续步骤中接收脚本发送值所必需的。
  • value_type - 设置为 3(无符号数值),即此监控项存储的数据类型。

3. 由于 Zabbix API 会返回新创建监控项的 ID,请将此 ID 保存到 item_id 变量中,以便后续使用。

4. 打印一条消息以确认监控项已创建。

item_key = 'app.myservice.heartbeat'

item = api.item.create(
    hostid=host_id,
    name='App heartbeat',
    key_=item_key,
    type=2,
    value_type=3,
)

item_id = item['itemids'][0]

print(f"Item '{item_key}' created with ID {item_id}")

将值发送到主机

现在你已经创建了主机和监控项,可以向它发送数据了。

1. 导入 time 类,并在发送数据前等待几秒钟。
这可以确保 Zabbix 已完全处理你新创建的主机和监控项。

2. 从 zabbix_utils 导入 Sender 类。
这个类的工作方式类似于 Zabbix sender,可让你的脚本向 Zabbix 发送数据。

3. 创建一个 Sender 实例,连接到本地 Zabbix 服务器 127.0.0.110051 端口。

4. 在 Sender 实例上调用 send_value() 方法,向主机的监控项发送一个值,并提供以下详细信息:

  • hostname - 设置为 hostname 变量,该变量包含你从 Zabbix agent 获取的主机名。
  • item_key - 设置为你刚刚在脚本中定义的 item_key 变量。
  • 1 - 要发送的值。

4. 打印一条消息以确认该值已发送。

import time
time.sleep(10)

from zabbix_utils import Sender

sender = Sender(server='127.0.0.1', port=10051)

response = sender.send_value(hostname, item_key, 1)

print(f"Sender response: {response}")

当这段代码成功运行后,你应该会看到一条成功消息,表示 Zabbix 已接收到你的值:

Sender response: {"processed": 1, "failed": 0, "total": 1, "time": "0.000151", "chunk": 1}

现在你还可以检查 Zabbix 前端(Monitoring > Latest data)来查看该值。

完整脚本

下面是一个完整脚本,整合了所有步骤:获取主机名、使用 Zabbix API 创建主机和监控项,以及向 Zabbix 发送数据。

import time
from zabbix_utils import Getter, ZabbixAPI, Sender

# 从 Zabbix agent 获取主机名
agent = Getter(host='127.0.0.1', port=10050)
hostname = agent.get('system.hostname').value

# 连接并登录 Zabbix API
api = ZabbixAPI(url='127.0.0.1/zabbix')
api.login(user='Admin', password='zabbix')

# 在 Zabbix 中创建主机
host = api.host.create(
    host=hostname,
    interfaces=[{
        'type': 1,
        'main': 1,
        'useip': 1,
        'ip': '127.0.0.1',
        'dns': '',
        'port': '10050',
    }],
    groups=[{'groupid': '2'}]
)

host_id = host['hostids'][0]

print(f"Host '{hostname}' created with ID {host_id}")

# 在 Zabbix 中创建监控项
item_key = 'app.myservice.heartbeat'

item = api.item.create(
    hostid=host_id,
    name='App heartbeat',
    key_=item_key,
    type=2,
    value_type=3
)

item_id = item['itemids'][0]

print(f"Item '{item_key}' created with ID {item_id}")

# 从 API 注销
api.logout()

# 等待 Zabbix 处理新主机
time.sleep(10)

# 向主机发送值
sender = Sender(server='127.0.0.1', port=10051)
response = sender.send_value(hostname, item_key, 1)

print(f"Sender response: {response}")