上一期:http://t.csdn.cn/541DY

安装完node_exporter后,需要在prometheus的配置文件中添加该节点才能使之被纳入prometheus的监控范围中。想要自动化该过程,不免需要两台主机之间的通信,不过既然能被监控说明之间的网络应该是相通的。

为了使脚本尽可能的轻量并具有泛用性,不添加额外的库和包,脚本方面采用curl发送get和post的方式进行通信。prometheus服务器上部署一个服务接收参数并处理,这个服务不可避免要装一些组件的,不过装一次就够了。服务采用tronado框架。prometheus的配置文件采用conf.d的方法实现自动更新,具体可以参考这里:http://t.csdn.cn/RW1tw,实际上就是把prometheus.yml中的job换成conf.d中的json文件,例如:

这样这个job的节点就是读取该json中的内容。

下面上代码:

自动化脚本script.py:

# -*- coding: utf-8 -*-
import os
#与prometheus服务器通信,注册prometheus监控
print((os.popen('curl 192.168.100.181:9123')).read())
print('请选择job:')
job=raw_input()
ip = ((os.popen("ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/'")).read())
print('输入hostname:(按enter使用默认值:jt-'+ip[:-1]+')')
hostname = raw_input()#这是python2的,3的话就input()就好
if hostname =='':hostname ='linux-'+ip[:-1]
order="curl 192.168.100.181:9123 -X POST -d '{ \"job\": \"" + job + '\",\"hostname\": \"' + hostname + '\", \"ip\": \"' + ip[:-1] + "\"}' --header 'Content-Type: application/json'"
print((os.popen(order).read()))

服务端脚本scriptService.py:

import tornado.ioloop
import tornado.web
import json
import os
def promeConf(hostname,ip,job):path="/opt/monitor/prometheus/prometheus-2.7.1.linux-amd64/conf.d/"#prometheus配置文件路径,根据实际情况修改filename=j.joblist[int(job)]+'.json'with open(path+filename, mode='r') as f:list=json.load(f)f.close()dict=\{"targets": [ip+":9100"],"labels":{"hostname": hostname}}with open(path+"hf10g_virtual.json", mode='w') as f:list.append(dict)f.write(json.dumps(list,indent=1))
class Job():joblist=[]#定义一个类供全局使用
class MainHandler(tornado.web.RequestHandler):def get(self):datalist=''job = (os.popen('ls /opt/monitor/prometheus/prometheus-2.7.1.linux-amd64/conf.d/')).read()j.joblist = (job.split('\n'))while ('' in j.joblist):j.joblist.remove('')for i in range(len(j.joblist) - 1):if (j.joblist[i])[-5:] == '.json':j.joblist[i] = j.joblist[i][:-5]else:j.joblist.remove(j.joblist[i])i = i + 1for i in range(len(j.joblist) - 1):datalist = datalist + str(i) + ':' + j.joblist[i] + '\n'datalist='请选择job:\n'+datalistself.write(datalist)self.finish()def post(self):data = json.loads(self.request.body)hostname=data['hostname']ip=data['ip']job=data['job']promeConf(hostname,ip,job)application = tornado.web.Application([(r"/", MainHandler),
])
if __name__ == "__main__":j=Job()#实例化application.listen(9123)#自设端口tornado.ioloop.IOLoop.instance().start()

大致流程:

下面逐步解析这套程序:

1.script.py:get请求job列表

print((os.popen('curl 192.168.100.181:9123')).read())

在linux端用curl方法去get prometheus服务器对应服务接口,没什么好说的。

2.scriptService.py:接收get请求、获取job列表、处理数据、返回信息

ls一下文件夹,把str切成列表,把不是.json的、空的都去掉,逻辑上仔细看应该就能明白,但是一般来讲拿去就能用,毕竟形式都固定的。然后加个序号排一下版再发回去,同时列表存起来供下一步使用。

    def get(self):datalist=''job = (os.popen('ls /opt/monitor/prometheus/prometheus-2.7.1.linux-amd64/conf.d/')).read()j.joblist = (job.split('\n'))while ('' in j.joblist):j.joblist.remove('')for i in range(len(j.joblist) - 1):if (j.joblist[i])[-5:] == '.json':j.joblist[i] = j.joblist[i][:-5]else:j.joblist.remove(j.joblist[i])i = i + 1for i in range(len(j.joblist) - 1):datalist = datalist + str(i) + ':' + j.joblist[i] + '\n'datalist='请选择job:\n'+datalistself.write(datalist)self.finish()

3.script.py:键入job编号,获取本机ip,键入或生成hostname

想获取本机网络上的ip就是ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/'这条命令,根据实际情况使用。raw_input是python2的方法,3的话就input(),主机名输入为空的话就默认为linux-ip。查到的ip最后一位是‘\n’,所以截掉最后一位。

job=raw_input()
ip = ((os.popen("ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/'")).read())
print('输入hostname:(按enter使用默认值:kvm-'+ip[:-1]+')')
hostname = raw_input()
if hostname =='':hostname ='linux-'+ip[:-1]

这个是适用于单网卡的方法多网卡不一定适用,下面给出另一种方法:

ip = ((os.popen("ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d 'addr:'")).read())#ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk "{print $2}'|tr -d "addr:"ip = ip.split('\n')if len(ip)>1:ip=[s for s in ip if '192' in s]#如果多网卡中想要的ip有特征可以在这里筛选,否则就手动选择吧ip=ip[0]

而且这种方法ip后面不带‘\n’,不用切掉最后一位。总之核心都是围绕着shell命令,再根据情况做数据处理。

4.script.py:post发送参数json

还是curl,发送一个json,注明--header 'Content-Type: application/json'。python2中解析json好像内部的引号必须是双引号,可以用\"来区分。

order="curl 192.168.100.181:9123 -X POST -d '{ \"job\": \"" + job + '\",\"hostname\": \"' + hostname + '\", \"ip\": \"' + ip[:-1] + "\"}' --header 'Content-Type: application/json'"
print((os.popen(order).read()))

5.scriptService.py:接收post,解析json

也没啥好说的,拿来就用就行

    def post(self):data = json.loads(self.request.body)hostname=data['hostname']ip=data['ip']job=data['job']promeConf(hostname,ip,job)

6.scriptService.py:更新配置文件

首先确定自己prometheus的配置conf.d路径,然后按照job的序号在joblist中找到对应job.json,格式就是

[
  {
    "targets": ["10.30.17.13:9100"],
    "labels": {
      "hostname": "kvm1"
    }
  },
  {
    "targets": ["10.30.17.14:9100"],
    "labels": {
      "hostname": "kvm2"
    }
  },
{
    "targets": ["10.30.17.15:9100"],
    "labels": {
      "hostname": "linux01"
    }
  }
]

文件操作是先读,把json转成字典列表,然后append新的字典,再写入json文件。

def promeConf(hostname,ip,job):path="/opt/monitor/prometheus/prometheus-2.7.1.linux-amd64/conf.d/"filename=j.joblist[int(job)]+'.json'with open(path+filename, mode='r') as f:list=json.load(f)f.close()dict=\{"targets": [ip+":9100"],"labels":{"hostname": hostname}}#有些node设定的端口不是9100,根据实际情况去改with open(path+"hf10g_virtual.json", mode='w') as f:list.append(dict)f.write(json.dumps(list,indent=1))

注意防火墙开对应端口嗷~

7.注册跳板机资产

这个可以看http://t.csdn.cn/SYRZT,把模块整合进去,反正注册只需要ip和hostname,传参里都有了。admin_user是跳板机中root用户的id,nodes是节点的id,都可以是固定的。

def get_token(jms_url, username, password):url = jms_url + '/api/v1/authentication/auth/'query_args = {"username": username,"password": password}response = requests.post(url, data=query_args)return json.loads(response.text)['token']
def create_assest(jms_url, token,ip,hostname):url = jms_url + '/api/v1/assets/assets/'headers = {"Authorization": 'Bearer ' + token,'X-JMS-ORG': '','accept': 'application/json','Content-Type': 'application/json'}data={"ip": ip,"hostname": hostname,"platform": "Linux","is_active": True,"admin_user": "53594e64-48c7-4679-bf7c-d54aba747416","nodes": ["d422754d-36fb-4f6f-a0ba-8f41b60c38e2"]}data_json = json.dumps(data)response = requests.post(url,data_json, headers=headers)response.json()return(response.text)
class MainHandler(tornado.web.RequestHandler):def post(self):data = json.loads(self.request.body)hostname=data['hostname']ip=data['ip']jms_url = '跳板机地址'username = '~'password = '~'token = get_token(jms_url, username, password)#promeConf(hostname,ip)self.write(create_assest(jms_url,token,ip,hostname))

开发笔记:Python脚本自动远程注册prometheus监控+注册jumpserver资产(tronado主机间通信)相关推荐

  1. 利用python脚本自动发布服务之arcmap篇

    最近在学习arcpy,参考官方帮助文档及一些博客文章练习了下利用python脚本自动发布各中server服务,顺便将把发布的流程以及遇到的问题进行记录总结.用的是Python2.x,ArcGIS Pr ...

  2. Windows和ubuntu使用python脚本自动登录校园网

    Windows和ubuntu使用python脚本自动登录校园网 背景: 事情事这样的: 最近拿着老板的服务器在玩,奈何学校没有找到合适的机房,无奈就搬回寝室放在一个无人问津的角落里,这科研条件让我也很 ...

  3. python生成yaml_使用python脚本自动生成K8S-YAML的方法示例

    1.生成 servie.yaml 1.1.yaml转json service模板yaml apiVersion: v1 kind: Service metadata: name: ${jarName} ...

  4. python生成yaml_使用python脚本自动生成K8S-YAML

    使用python脚本自动生成K8S-YAML 1.生成 servie.yaml 1.1.yaml转json service模板yaml apiVersion: v1 kind: Service met ...

  5. 如何使用python脚本自动解锁电脑屏幕

    1. 使用Python脚本自动解锁电脑屏幕,首先需要安装pywin32模块,这是一个Python模块,可以让Python脚本访问Windows API. 2. 然后,使用以下代码来解锁电脑屏幕: im ...

  6. python连接wifi_树莓派利用PYTHON脚本自动连接WIFI无线

    前言 树莓派3集成了无线WIFI以后我们就可以利用树莓派自身的WIFI模块来进行无线网络的连接,但是在平成的使用过程中我们发现无线WIFI因为环境复杂所以经常出现断网的现象.这次我们牛人技术就为大家介 ...

  7. python脚本,检测域名是否被注册

    Python批量检测Url是否已注册(抓域名,抢域名小工具,还在开发中) 感觉垃圾的一批,想放弃了,整出来也没什么用,目前多线程已经开发完毕,每秒提交200次 环境是Python3.7 有些库是不用的 ...

  8. salt远程执行python脚本_SaltStack远程执行Windows job程序(黑窗口)填坑经过

    近期接到领导通知,要将公司内的所有Windows服务添加到自动发布系统中,由于这种服务很多,节点分布散乱,每次都是由开发主管手动替换(虽然他们自己开发了自动打包替换工具,但仍需要一台一台登陆到服务器上 ...

  9. python脚本自动qq签到_Python爬虫实现自动登录、签到功能 附代码

    这篇文章主要介绍了Python爬虫实现自动登录.签到功能的代码,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 前几天在一个素材网站上下载东 ...

最新文章

  1. Android逆向--如何调试smali代码?
  2. You are using pip version 8.1.1, however version 20.1.1 is available
  3. 达观数据分析平台架构和Hive实践——TODO
  4. 如何利用vw+rem进行移动端布局
  5. 用C++,调用浏览器打开一个网页
  6. 鸿蒙电视应用市场,任正非:鸿蒙系统已上线,未来将被应用到手机、平板、电视系列产品上...
  7. 【转载】Vue 2.x 实战之后台管理系统开发(二)
  8. koajs mysql_koajs 项目实战(一)
  9. 【Unity3D插件】Unity3D各类教程汇总
  10. 里恩eLearning在线培训考核系统介绍
  11. 故障树手册(Fault Tree handbook)(2)
  12. SpringBoot 整合 kaptcha + redis 实现 图形验证码登录
  13. 注意!某知名国产软件被曝携带木马病毒
  14. Cocos Creator三消小游戏(TS 02版)
  15. 怎么在宝妈论坛引流?宝妈论坛如何引流?如何引流宝妈群体
  16. python求15的因数_python学习第15期
  17. openlayer3.0隐藏地图右下角的attribution控件图标
  18. 华为mate30老是显示无法连接服务器,华为Mate30 Pro手机微信信息老是发不出,提示无法连接到网络...
  19. 服务器网站后门检测软件,服务器安全工具
  20. Python3,3行代码,自动为脚本生成命令行,我默默的收藏了。

热门文章

  1. JS实现动画之setTimeout、setInterval和requestAnimationFrame
  2. java转俯视图,如何使用纯CSS实现一个足球场的俯视图(附源码)
  3. 花5min就能搞清楚redis和zookeeper分布式锁的区别,太有必要读一下了
  4. 尼日利亚4g频段_全球主要4G频段答案.doc
  5. web前端开发技术实验与实践(第三版)储久良编著 项目5 综合编程岗位介绍
  6. Python爬虫实战(1)之千千音乐热歌前50
  7. Throttlestop
  8. 注意!青年失业率高达21.3%,而这个Android 岗位需求却不降反升!!
  9. Java----常用类:日期相关类、数学运算相关类
  10. Synopsys逻辑工艺库(DC综合)