prometheus自动发现与zabbix批量添加节点

前提条件:使用ansible批量安装完node-exporter与zabbix-agent

一、prometheus自动发现基于consul实现

1、consul单节点安装:

docker run --name consul1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul:1.2.2

2、注册服务到consul,批量添加

IP_LIST="xxx.xxx.xxx.xxx" ##ip列表用空格隔开
 
for ip in ${IP_LIST}
do
    host_ip=$(cat /etc/hosts|grep $ip|awk '{print $1}'|head -n 1)
    if [ "$host_ip" == "$ip" ];then
         host=$(cat /etc/hosts|grep $ip|awk '{print $2}'|head -n 1)
         curl -X PUT -d "{\"id\": \"node-exporter-${ip}\",\"name\": \"node-exporter-${ip}\",\"address\": \"${ip}\",\"port\": 9100,\"tags\": [\"noder\"],\"Meta\": {\"hostname\": \"${host}\"},\"checks\": [{\"http\": \"http://${ip}:9100/metrics\", \"interval\": \"5s\"}]}" http://10.3.166.3:8500/v1/agent/service/register
         echo "添加节点${ip},hostname: $host"
    else
        echo "列表ip: $ip, hosts文件ip: $host_ip。ip不一致,注册失败"
    fi
done

注销服务: curl -X PUT http://xxx.xxx.xxx.xxx:8500/v1/agent/service/deregister/node-exporter-$ip
3、检查注册状态
在这里插入图片描述
4、修改prometheus.yml文件添加如下内容


- job_name: 'consul-prometheus'
    consul_sd_configs:
      - server: 'xxx.xxx.xxx.xxx:8500'
        services: []  
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*noder.*
        action: keep 
      - regex: __meta_consul_service_metadata_(.+)
        action: labelmap


5、检查promethous是否添加成功
在这里插入图片描述

二、zabbix批量添加主机使用python实现

#!/bin/python3
import xlrd, os, json, requests, sys

参考zabbix API 5.0版本:https://www.zabbix.com/documentation/5.0/zh/manual/api

class zabbixtools:
url = 'http://xxx.xxxx.xxxx/zabbix/api_jsonrpc.php'
head = {'Content-Type': 'application/jsonrequest'}
# 获取认证id
def user_login(self):
    data = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "user": "Admin",
            "password": "zabbix"
        },
        "id": 1,
        "auth": None
    }
    try:
        request_auth = requests.post(self.url, headers=self.head, data=json.dumps(data))
        request_auth_json = request_auth.json()
        auth = request_auth_json['result']
    except Exception as e:
        return '0'
    return auth

##创建主机组
def hostgroup_create(self):
    file = sys.argv[2]
    with xlrd.open_workbook(file) as fb:
        sheet = fb.sheet_by_name('Sheet1')
        for i in range(1, sheet.nrows):
            group = sheet.row_values(i)[2]
            data = json.dumps({
                    "jsonrpc": "2.0",
                    "method": "hostgroup.create",
                    "params": {
                        "name": group
                    },
                    "auth": self.user_login(),
                    "id": 1
            })
            groups_create = requests.post(self.url, headers=self.head, data=data)
            result = groups_create.json()
            print(result)

# 获取主机组id
def hostgroup_get(self, hostGroupName):
    data = json.dumps({
        "jsonrpc": "2.0",
        "method": "hostgroup.get",
        "params": {
            "output": "extend",
            "filter": {
                "name": hostGroupName
            }
        },
        "auth": self.user_login(),
        "id": 1,
    })
    response = requests.get(url=self.url, headers=self.head, data=data)
    return response.json()

# 获取监控主机列表
def get_hosts(self):
    data = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": ["hostid", "host"], "selectInterfaces": ["interfaceid", "ip"]},
        "id": 2,
        "auth": self.user_login()
    }

    request_host = requests.post(self.url, headers=self.head, data=json.dumps(data))
    request_host_json = request_host.json()
    return request_host_json

# 创建主机
def create_hosts(self):
    file = sys.argv[2]
    print("创建主机")
    with xlrd.open_workbook(file) as fb:
        sheet = fb.sheet_by_name('Sheet1')
        for i in range(1, sheet.nrows):
            hostname = sheet.row_values(i)[0]
            hostip = sheet.row_values(i)[1]
            groupid_list = self.hostgroup_get(sheet.row_values(i)[2])['result']
            for groupid in groupid_list:
                templateid = int(sheet.row_values(i)[3])
                ####################################
                data = {
                    "jsonrpc": "2.0",
                    "method": "host.create", "params": {"host": hostip, "interfaces": [
                        {"type": 1, "main": 1, "useip": 1, "ip": hostip, "dns": "", "port": "10050"}],
                                                        "groups": [{"groupid": groupid['groupid']}],
                                                        "templates": [{"templateid": templateid}],
                                                        "inventory_mode": 0,
                                                        "inventory": {"macaddress_a": "01234",
                                                                      "macaddress_b": "56768"},
                                                        "name": hostname
                                                        },
                    "auth": self.user_login(),
                    "id": 1
                }
                request_create = requests.post(self.url, headers=self.head, data=json.dumps(data))
                request_create_json = request_create.json()
                print(request_create_json)

# 导入模板
def zbx_export(self):
    fb = open(sys.argv[2], encoding='utf8').read()
    data_export = {
        "jsonrpc": "2.0",
        "method": "configuration.import",
        "params": {
            "format": "xml",
            "rules": {
                "applications": {"createMissing": True, "deleteMissing": True},
                "valueMaps": {"createMissing": True, "updateExisting": True},
                "groups": {"createMissing": True},
                "graphs": {"createMissing": True},
                "screens": {"createMissing": True},
                "templateScreens": {"createMissing": True},
                "triggers": {"createMissing": True, "updateExisting": True},
                "templates": {"createMissing": True},
                "items": {"createMissing": True,
                          "updateExisting": True, "deleteMissing": True}
            },
            "source": fb},
        "auth": self.user_login(),
        "id": 1
    }
    request_export = requests.post(self.url, headers=self.head, data=json.dumps(data_export))
    request_export_json = request_export.json()
    return request_export_json
def main():
    if len(sys.argv) == 3:
        if (sys.argv[1] == 'delete' or sys.argv[1] == 'create' or sys.argv[1] == 'export') and os.path.isfile(
                sys.argv[2]):
            auths = zabbixtools()
            if auths == 0:
                print('获取认证令牌失败..请检查提交数据的准确性')
                return '0'
            # 获取认证令牌
            print('-------------')
            print('获取用户认证令牌auth:%s' % auths.user_login())
            if sys.argv[1] == 'create':
                #添加主机组
                print('添加主机log:%s' % auths.hostgroup_create())
                # 添加监控主机
                print('-------------')
                print('添加主机log:%s' % auths.create_hosts())
            if sys.argv[1] == 'export':
                # 导入模板
                print('-------------')
                print('导入模板log:%s' % auths.zbx_export())
            else:
                pass
            #获取线上监控主机列表
            print('--------------')
            hostlist = auths.get_hosts()['result']
            for i in hostlist:
                i['ip'] = i['interfaces'][0]['ip']
                del i['interfaces']
                print('目前监控主机列表:%s' % (i))
        else:
            print('执行失败.Usage: /bin/python3 %s delete/create/export target_file' % (sys.argv[0]))
    else:
        print('执行失败.Usage: /bin/python3 %s delete/create/export target_file' % (sys.argv[0]))
        return '0'


if __name__ == '__main__':
    main()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值