python+flask+uwsgi 监控 openldap

工作中遇到需要监控 openldap 的问题,因为公司用的监控工具是 prometheus,所以一开始使用了一个 openldap_exporter 来抓取 openldap 的 metrics,后面就遇到了问题,监控会把 openldap 跑死,排查原因是连接的速度大于断开连接的速度,导致连接数不断增加,使得其他需要 ldap 认证的服务连接不上,所以果断放弃使用这个 exporter 监控。
决定自己写一个 python 脚本来监控 openldap,首先搜索到 python-ldap 提供 api,用于从 Python 程序访问 LDAP 目服务器。好了,接下来上脚本。

vim alert.py

import ldap
import requests
import json
l = ldap.initialize('ldap://ip:389')
binddn = "cn=Manager,dc=xxx,dc=xxx"
bindpw = "xxxxxxx"
def get_token():

  url='https://qyapi.weixin.qq.com/cgi-bin/gettoken'
  values = {'corpid' : 'xxx' ,
      'corpsecret':'xxx',
       }
  req = requests.post(url, params=values)
  data = json.loads(req.text)
  return data["access_token"]

def send_msg(messageinfo):
  url="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="+get_token()
  values = """{"touser" : "@all" ,
      "toparty":"1",
      "msgtype":"text",
      "agentid":"xxx",
      "text":{
        "content": "%s"
      },
      "safe":"0"
      }""" %(str(messageinfo))

  data = json.loads(values)
  req = requests.post(url, values)

try:
  l.simple_bind_s(binddn, bindpw)
  valid = True
except ldap.LDAPError, e:
  if type(e.message) == dict and e.message.has_key('desc'):
      send_msg(e.message['desc']+'ip')
  else:
      send_msg(e)
finally:
  l.unbind_s()

vim index.py

from flask import Flask
import os
app = Flask(__name__)

@app.route('/metrics')
def monitor():
    os.popen("python alert.py")
    return "this is monitor for ldap"

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=3531,debug=True)

上面的 ip 和 xxx 替换成你们自己对应的数值。这个脚本会将消息报警到微信,所以你也需要注册一个企业微信,然后将对应的值填进脚本里。

使用命令运行程序:

uwsgi  --http ip:3531 --wsgi-file index.py

或者

vim myproject.ini
[uwsgi]
virtualenv=/home/ldap-monitor/myenv
callable=app
wsgi-file=index.py
http=:3531
master=true
processes=4
threads=2
pidfile=myproject.pid
max-requests=100

你也可以将 uwsgi 程序加入到 systemctl 里,运行起来更加方便。

# /etc/systemd/system/ldapmonitor.service
[Unit]
Description=uWSGI instance to serve myproject
After=network.target

[Service]
[Unit]
Description=uWSGI instance to serve myproject
After=network.target

[Service]
WorkingDirectory=/home/ldap-monitor
ExecStart=/usr/bin/uwsgi --ini /home/ldap-monitor/myproject.ini
ExecStop=/usr/bin/uwsgi --stop /home/ldap-monitor/myproject.pid
ExecReload=/usr/bin/uwsgi --reload /home/ldap-monitor/myproject.pid
[Install]
WantedBy=multi-user.target

将 flask 起的 web 地址加入到 prometheus 的配置中,每隔 1m 访问一次,就完成了整个监控流程啦。
以上就可以实现监控 openldap 了,如果 ldap 挂掉,会报警到脚本里的微信。

你可能感兴趣的:(linux,prometheus,python,脚本)