快速入门指南
在你安装 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.1 的 10051 端口。
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}")