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/