快速入门指南

在您安装 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 Web 界面的 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 - 设置为 hostname 变量,其中包含您从 Zabbix agent 获取的主机名。
  • 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. 为要创建的监控项定义一个唯一的键。

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

  • hostid - 设置为 host_id 变量,其中包含您刚刚创建的主机 ID。
  • name - 监控项名称。
  • key_ - 设置为您刚刚定义的 item_key 变量。
  • type - 设置为 2trapper 监控项),这是接收后续步骤中由脚本发送的值所必需的。
  • 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 Web 界面(监测 > 最新数据)以查看该值。

完整脚本

下面是整合了所有步骤的完整脚本:获取主机名、使用 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"主机 '{hostname}' 已创建,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_key}' 已创建,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}")