[python][icinga]python3获取icinga2监控信息

2022-05-20 14:13:14 浏览数 (1)

python脚本通过icinga2的api获取设备和服务的状态信息

1. 开启api

运行命令'icinga2 api setup'启用api功能并作为新的API用户root自动生成密码提供认证(配置文件/etc/icinga2/conf.d/api-users.conf)。

代码语言:javascript复制
# icinga2 api setup
# systemctl restart icinga2

icinga2 API有两种认证方式: HTTP基础认证 X.509客户证书 这里我们用简单的第一种,下面的例子假设用户名和密码为root/icinga,api默认端口5665

代码语言:javascript复制
# cat /etc/icinga2/conf.d/api-users.conf
object ApiUser "root" {
password = "icinga"
  permissions = [ "*" ]
}

这里的权限可以用正则表达式匹配,具体参考官方文档

https://icinga.com/docs/icinga2/latest/doc/12-icinga2-api/

2. curl测试api(根据自己的实际情况选择是http或者https)

代码语言:javascript复制
# curl -k -s -u root:icinga 'http://localhost:5665/v1

<html><head><title>Icinga 2</title></head><h1>Hello from Icinga 2 (Version: r2.11.4-1)!</h1><p>You are authenticated as <b>root</b>. Your user has the following permissions:</p> <ul><li>*</li></ul><p>More information about API requests is available in the <a href="https://icinga.com/docs/icinga2/latest/" target="_blank">documentation</a>.</p></html>

3. python3脚本

官方文档的例子都是用curl操作,下面是一个简单的python3获取信息的例子

代码语言:javascript复制
#!/usr/bin/python3
# -*- coding: utf-8 -*-

# Icinga2 Api v1 HTTP基本认证

import urllib.request
import json

class api:

    def __init__(self, url, user, password):

        self.url = urlBase
        password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
        password_mgr.add_password(None, self.url, user, password)
        handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
        self.opener = urllib.request.build_opener(handler)
        res = self.opener.open(self.url)
        if not (res.status == 200):
            print("认证错误")

    def query(self, url):

        urlQuery = self.url   url
        res = self.opener.open(urlQuery)
        fields = json.loads(res.read().decode('utf-8'))

return fields

if __name__ == '__main__':
    urlBase = "http://xxx.xxx.xxx.xxx:5665/v1/"                                            
    urlQuery = 'status/IcingaApplication'
    userName = 'root'
    passWord = 'icinga'

    icingApi = api(urlBase, userName, passWord)
    res = icingApi.query(urlQuery)
    print(res)

4. 测试

代码语言:javascript复制
$ python3 icinga2api.py 
{'results': [{'name': 'IcingaApplication', 'perfdata': [], 'status': {'icingaapplication': {'app': {'enable_event_handlers': True, 'enable_flapping': True, 'enable_host_checks': True, 'enable_notifications': True, 'enable_perfdata': True, 'enable_service_checks': True, 'environment': '', 'node_name': 'icinga2', 'pid': 23841.0, 'program_start': 1599468006.09186, 'version': 'r2.11.4-1'}}}}]}

5. 更多

查询全部设备和服务的状态

urlQuery = 'status'

可以使用过滤器执行复杂的查询,如查找状态不是'OK'的服务:

urlQuery = 'objects/services?filter=service.state!=ServiceOK'

可以以此修改执行更多操作,比如创建/修改监控对象,执行检测任务,确认故障等等。

具体参考官方文档

https://icinga.com/docs/icinga2/latest/doc/12-icinga2-api/

0 人点赞