了解Zabbix API

x33g5p2x  于2021-09-19 转载在 其他  
字(6.9k)|赞(0)|评价(0)|浏览(525)

了解如何利用Zabbix API、自动化日常流程以及与其他解决方案集成。

介绍

在这篇文章中,我将通过示例向您概述Zabbix API的使用与优点。您将了解如何利用Zabbix API和Zabbix进行集成和优化。
    以下是一些您会用到的资源:

关于API

API是一个应用程序编程接口,也是用于配置Zabbix的方法之一。
    如您所知,Zabbix分为Zabbix server、数据库和前端。Zabbix server和前端连接到数据库。当Zabbix server从PC或其他设备收集信息时,数据由二进制进程处理并写入数据库。每次打开前端并创建新主机时,相关信息也会写入数据库。

在这里插入图片描述

    
Zabbix通信过程
    注意:虚线表示前端和server之间的次要通信。
    您可以在前端添加或更改任何配置。坏消息是,您必须手动完成所有工作,这需要大量的时间和人力资源,所以这绝对不是执行此任务的最佳方式。
    在我上一篇关于 资产管理的文章中,我提到如果要更新所有现有主机的资产选项,有两种方法:

  • 数据库查询;
  • Zabbix API。

直接查询数据库能够根据条件更新表,并更改主机上的默认资源管理模式。但是,没有经验的用户可能会发现使用Zabbix API更容易。

在这里插入图片描述

    
Zabbix API
    每次使用API时,都会连接到 api_jsonrpc.php 文件,这个页面和包含所有PHP文件的前端本身已经了解特定API调用的含义。例如,当使用host.create API方法时,前端将知道哪些字段是必填字段。host.create可用于指定接口、组、标记等……
    有四种类型的主机接口,在API中用数字表示:

  • agent = 1
  • SNMP = 2
  • JMX = 3
  • IPMI = 4
{
    "jsonrpc": "2.0",
    "method": "host.create",
    "params": {
        "host": "Linux server",
        "interfaces": [
            {
                "type": 1,
                "main": 1,
                "useip": 1,
                "ip": "192.168.3.1",
                "dns": "",
                "port": "10050"
            }
        ],
...

在本例中,您可以看到type的值为1,这意味着我们将使用agent接口。
    当传递值的信息时,Zabbix会自动识别我想要使用的内容,因此无需在前端手动选择任何内容。
    这是主机组 host group,这在创建主机时是必需的。

"groups": [
            {
                "groupid": "50"
            }
        ],
...

还可以添加模板ID、用户宏和资产管理模式。
    虽然直接在前端创建单个新主机可能更快,但通常使用API创建大量主机。编程语言(Python、Bash等)允许您在执行调用之前运行不同的函数。
    例如,假设您正在从内部CSV文档中获取信息,其中包含计算机清单(主机名、IP地址、操作系统等)。您可以将此数据用作必填字段的变量,并在循环中自动创建具有唯一值的任意数量的主机。当然,这需要一些编程知识。

PyZabbix

现在,让我们深入研究Python。在zabbix.wiki上,您可以找到Python以及Ruby、Crystal、Java和其他编程语言的API库。
PyZabbix是一个Python模块,用于使用Zabbix API。我将解释PyZabbix的安装过程,因为默认情况下它在服务器上不可用。
    对于新安装,您需要先安装pip。基本上有两种选择:

  • EPEL repo,或
  • curl

执行以下命令之一:

1) EPEL repo ---> yum install python-pip
2) curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install pyzabbix

最后,您应该能够使用 Python 脚本和 Zabbix gnomes。

Zabbix gnomes

这个页面,你可以clone Zabbix gnomes,也就是在Zabbix中使用的最常见的Python脚本。Zabbix gnomes为刚开始使用 Zabbix API 但不确定所需参数的用户提供了一个简单的解决方案。
    命令示例:

zabbix_sender -k $ITEMKEY -o $ITEMVALUE -s $HOSTNAME -z $(zhproxyfinder.py $HOSTNAME)

./zhtmpllinker.py -t "Template App Apache" "Template App MySQL" "Template OS Linux" -G "LAMP Servers"

./zhtmplunlink.py -G "Webservers" -t "Template App MySQL"

假设我是一个初学者,不知道如何处理脚本。如果我在没有任何参数的情况下运行zhostfinder.py,它将失败,因为没有指定任何信息。

在这里插入图片描述

    但是,可以在那里找到主要选项:

  • -A = get all
  • -S = search
  • -h = help

使用用户名和密码进行身份验证以使用API(例如,更改配置)非常重要。凭据与前端用户的凭据相同。我还建议您为Zabbix API创建一个单独的用户。
    请记住,API重视用户的权限。如果您使用API脚本创建了一个新用户,并且没有提供主机组权限,那么如果您最终无法获取任何信息,请不要感到惊讶。
    您还需要将API调用指向 api_jsonrpc.php 文件的URL。
    例如,zhost.finder允许您执行以下操作:
    查找Zabbix中所有服务器的输出:

./zhostfinder.py. -A -u Admin -p zabbix -a http://localhost/zabbix/api_jsonrpc.php

在这里插入图片描述

    

输出1
    如果我创建一个新服务器,将其添加到主机组,并执行zhostfinder.py,此行将返回三个主机。
    在其他主机中找到某种特定模式:

./zhostfinder.py. -S MySQL -u Admin -p zabbix -a http://localhost/zabbix/api_jsonrpc.php

也可以使用Zabbix GNOME创建一些东西,例如,主机组:

zgcreate.py -u Admin -p zabbix -a http://192.168.56.101/zabbix/api_isonrpc.php HostGroupName

创建多个主机组的步骤:

zgcreate.py -u Admin -p zabbix -a http://192.168.56.101/zabbix/api_isonrpc.php Testing1 Testing2 Testing3

您可以在CLI中手动执行此操作,但也可以使用脚本动态创建新主机组。脚本还可以帮助向新创建的组添加新主机,并使用Python链接一些模板。

带curl的API

也可以不使用任何编程语言,只使用curl测试API方法。它是一个发送到前端的HTTP(S)请求,用于发布信息并指定API调用的执行。
    对于user.login方法,我从Zabbix文档中获取了API数据,并指定了curl。此方法允许我们登录到API并生成身份验证令牌。

curl -H "Content-type: application/json-rpc" -X POST 'http://localhost/zabbix/api_jsonrpc.php -d'
{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "Admin",
        "password": "zabbix"
    },
    "id": 1
}'

复制并粘贴到CLI中。结果是一个令牌,即经过身份验证的用户的会话ID。我将在下次通话中使用此会话ID。
    host.get方法允许您检索有关主机的信息(本例中为Zabbix和Linux)。在本例中,我按主机和名称过滤数据,并使用令牌和会话ID。

curl -H "Content-type: application/json-rpc" -X POST 'http://localhost/zabbix/api_jsonrpc.php -d' 
{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
      "filter": {
      "host": [
        "Zabbix server",
        "Linux server"
      ]
   }
},
    "auth": "token",
    "id": 1
}'

如果我想使用另一台主机,例如我的MySQL监控主机,我必须添加一个新参数。
    在输出中,您将看到更详细的信息,如:

  • 主机是否已禁用
  • 是否有错误消息
  • 主机是否被监控
  • 是否在维修中,等等

您可以在特定字段(例如host id)上使用筛选以获得详细输出。例如,我只想筛选Zabbix server的请求,并使用会话ID进行身份验证。

curl -H "Content-type: application/json-rpc" -X POST 'http://127.0.0.1/zabbix/api_jsonrpc.php -d'
{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
       "output": ["hostid"],
       "selectGroups": "extend",
       "filter": {
          "host": [
          "Zabbix server"
       ]
    }
},
    "auth": "token",
    "id": 2
}'

因此,我有关于主机ID的信息和一些附加信息。

在这里插入图片描述

    curl还可用于创建主机。为此,请先查看文档。在这里,您可以找到几个host.create命令的示例。
    出于目的,我必须调整复制粘贴的示例,添加curl命令行、标点和修改会话ID。我还将新主机的名称更改为YouTube Tutorial,并添加了新的组ID和模板ID。

curl -H "Content-type: application/json-rpc" -X POST 'http://localhost/zabbix/api_jsonrpc.php -d'
{
    "jsonrpc": "2.0",
    "method": "host.create",
    "params": {
        "host": "YouTube Tutorial",
        "interfaces": [
            {
                "type": 1,
                "main": 1,
                "useip": 1,
                "ip": "192.168.3.1",
                "dns": "",
                "port": "10050"
            }
        ],
        "groups": [
            {
                "groupid": "50"
            }
        ],
        "tags": [
            {
                "tag": "Host name",
                "value": "Linux server"
            }
        ],
        "templates": [
            {
                "templateid": "20045"
            }
        ],
        "macros": [
            {
                "macro": "{$USER_ID}",
                "value": "123321"
            },
            {
                "macro": "{$USER_LOCATION}",
                "value": "0:0:0",
                "description": "latitude, longitude and altitude coordinates"
            }
        ],
        "inventory_mode": 0,
        "inventory": {
            "macaddress_a": "01234",
            "macaddress_b": "56768"
        }
    },
    "auth": "token",
    "id": 1
}'

如果我打开前端并转到 Configuration > Hosts,我将找到一个名为YouTube Tutorial的新主机,其中包含上述模板、界面、端口、宏、用户ID等。

其他特征

Zabbix API函数不仅限于获取信息和创建新主机。
    host.update允许您更改现有主机的配置,例如,设置从agent到SNMP的接口。您还可以通过API删除配置或获取Zabbix的历史记录。
    如果您不是数据库专家,API比直接查询更好。Zabbix前端支持所有由Zabbix开发人员编写和优化的API方法和查询,可以获得不错的性能,不必担心出错。
    API还促进了自动化和集成。在Zabbix监控的具有多个前端用户和管理员、主机、项目和触发器的大型公司中,不可能控制所有员工的行为。任意一人可能会意外更改配置中的单个值,但这足以妨碍监控。最后,错误会被发现并修复,但您如何确保不会再次发生?
    其中一个方法是更改公司的策略,并仅允许通过集中式模板存储(例如,项目或触发器存储)更改模板、项目、触发器和阈值。如果有人在前端进行任何更改,则带有API和配置导入的全局脚本将用所有值和参数覆盖前端中发生的所有事件,这些值和参数将保存在集中式模板存储中。
    另一个重要功能与票务系统有关。在Zabbix和票务系统之间进行单向集成的情况下,Zabbix解析信息并传递到服务,然后信息丢失。当事件发生时,将向票务系统发送警报,创建具有ID的票据。发送警报时,前端不可见。票据已创建,但您不知道是否已采取任何操作来修复它。票据ID未知,因为它在发送警报后丢失。
    在这种情况下,可以使用Zabbix API建立双向集成。现在,当服务创建票据时,将使用票据ID(或事件ID)作为变量执行API调用。应用problem.ack API方法。用户将找到关于新票据的通知,并转到前端确认问题。你可以看到进展,检查你的同事是否已经对票据做出反应,问题是什么或者需要什么来解决。
    一般来说,Zabbix API 90%的成功取决于您的脚本制作技能、对Zabbix文档的了解以及支持的API方法(其中有230多种)。前端或数据库中99%的操作可以使用API执行。

参考文档

[1]Dmitry Lambert. Zabbix API Explained[EB/OL]. 2020年3月25日[]. https://blog.zabbix.com/zabbix-api-explained/9155/.

相关文章