saltstack minion端状态监控程序
公司数据库有近三千台服务器,用saltstack管理近三千台服务器,会出现各种问题,监控minion端状态非常重要,因为这种监控不属于非常紧急,出了问题就必须立刻处理的故障,所以只需要写好定时任务,定时执行就可以了
代码逻辑:
1、首先从数据库里面查出所有数据库平台的机器
2、通过通道机api调用,在salt master执行一条命令uptime
3、对返回的结果进行分析,如果存在load关键字,则表明该minion的salt状态良好,反之如果没有关键字,则重启salt minion,再检测一次,如果还没有返回,则表示该minion状态为bad,入库
表:
show create table salt_mon \G;
*************************** 1. row ***************************
Table: salt_mon
Create Table: CREATE TABLE `salt_mon` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`ip_in` varchar(16) NOT NULL DEFAULT '',
`salt_mon_value` varchar(10) NOT NULL DEFAULT '',
`salt_mon_info` varchar(100) NOT NULL DEFAULT '',
`ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `salt_mon_value` (`salt_mon_value`),
KEY `ip_in` (`ip_in`),
KEY `ctime` (`ctime`)
) ENGINE=InnoDB AUTO_INCREMENT=4244 DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
程序代码:
#!/usr/bin/python26
# -*- coding: utf-8 -*-
"""
@author:mujibin
@modify time: 2015-11-05
"""
import os
import sys
import time
import datetime
import re
import paramiko
import socket
os.chdir(sys.path[0])
sys.path.append("/data1/salt/mysqlapi/salt/")
import urllib
import urllib2
import traceback
import json
import logging
import types
import commands
import MySQLdb
from multiprocessing import Pool
#from salt_repair import *
reload(sys)
sys.setdefaultencoding('utf8')
c_date = time.strftime("%Y%m%d",time.localtime())
c_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) # 统一入库时间,很重要,是前端
最新信息的依据
H3306='**com.cn'
H3308='***com.cn'
P3306=3306
P3308=3308
dp_admin='dp_admin'
HOST_PORT='3306'
HOST_USER = 'mysqlha'
HOST_PASSED = '*******'
db='test'def getIp(domain):import socketmyaddr = socket.getaddrinfo(domain,'http')[0][4][0]return myaddr
MASTERDNS= "********.com.cn"
MASTERIP = getIp(MASTERDNS) ###获取salt-master的ip地址def sql_select(sql, port=3306, domain='*****', db='salt'):##查询port = int(port)array = []try:db = MySQLdb.connect(host=domain,user=HOST_USER,port=port,passwd=HOST_PASSED,db=db,connect_timeout=3,charset="utf8")cursor = db.cursor()cursor.execute(sql)rows = cursor.fetchall()for row in rows:array.append(row)return arrayexcept Exception,e:#print str(e)return array
def sql_insert(sql, port=3306, domain='****', db='salt'):##插入try:db = MySQLdb.connect(host=domain,user=HOST_USER,port=port,passwd=HOST_PASSED,db=db,connect_timeout=3,charset="utf8")cursor = db.cursor()cursor.execute(sql)db.commit()db.close()except Exception,e:#print str(e)db.rollback()db.close()
def ssh_connect_bak(host):client = paramiko.SSHClient()client.load_system_host_keys()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())privatekeyfile = os.path.expanduser('/root/.ssh/id_rsa')mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile)host=host.strip()client.connect(host,26387,username='root',timeout=2,pkey=mykey)return clientdef ssh_connect(host):##ssh连接client = paramiko.SSHClient()client.load_system_host_keys()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())host=host.strip()client.connect(host,26387,username='root',timeout=2)return client'''通过测试发现通过ssh连接到master端执行命令,一旦服务器数量多了,很容易会卡住退不出来,程序也被卡死,没法继续跑下去,设置超时时间也不生效,具体原因没找到,换了公司通道机来进行连接,没有再出现这个问题,用下面这个run_cmd函数'''def run_cmd(ips,cmd,method,output,ignore_error,timeout):_ips_ = ips_cmd_ = cmd_method_ = method_output_ = output_ignore_error_ = ignore_error_timeout_ = timeout_user_='litao'_key_='*******'url='https://*****.php'argument={ 'user':_user_,'method':_method_,'output':_output_,'ignore_error':_ignore_error_,'key':_key_,'timeout':_timeout_,'ip':_ips_,'cmd':_cmd_}try:data = urllib.urlencode(argument)response = urllib2.urlopen(url, data)except Exception,e:msg = "Call the api function error!"#logger.debug(msg)#logger.debug(e)#print msg#print epassreturn response.read()
def ssh_cmd(host,cmd):###通过ssh去执行命令try:client = ssh_connect(host)i,o,e = client.exec_command(cmd)res = o.read()return resexcept Exception,e:msg = "The host:%s and cmd:%s execute exception." % (host,cmd)#print msgpass
iplist=['10.75.16.197']
# 获取 node表内所有ip
def get_all_id():##获取所有的ip列表sql = """select distinct ip_in from node \where depid=1 \and ip_in not in \(select node.ip_in from node, node2module where node.id=node2module.nid \and node2module.mname in ('dbstorage') ) """ids = []rows = sql_select(sql, port=3306, domain='***.com.cn', db='**')if rows:for row in rows:if row[0] not in ids:if row[0] not in iplist:ids.append(row[0])return ids
def salt_minion_mon(host,p_status,s_status,re_info): ###处理salt-master端执行命令后的结果,并写入数据库try:status = ""salt_mon_value = ""salt_mon_info = ""insertSql = ""res_ping = p_statussalt_res = s_statusif salt_res == 1:status = "BAD"salt_mon_value = "BAD"salt_mon_info="%s#NULL#NULL#NULL#NULL#%s " %(host,re_info)insertSql = "insert into salt_mon (ip_in, salt_mon_value, salt_mon_info, ctime) values('%s','%s','%s','%s')" %(host,salt_mon_value,salt_mon_info,c_time)#print insertSqlsql_insert(insertSql)else:status = "OK"salt_mon_value = "OK"salt_mon_info="%s#NULL#NULL#NULL#NULL#%s " %(host,re_info)insertSql = "insert into salt_mon (ip_in, salt_mon_value, salt_mon_info, ctime) values('%s','%s','%s','%s')" %(host,salt_mon_value,salt_mon_info,c_time)#print insertSqlsql_insert(insertSql)except Exception,e:msg = "salt_minion_mon failed!"#print e
def ping_mon_by_host(host): ##获取ping结果try:ping_cmd = "ping -c 1 -w 2 %s > /dev/null" % hostret = os.system(ping_cmd)if ret == 0:status = 0msg = "The host %s ping ok" % hostelse:status = 1msg = "The host %s ping failed" % hostresult = {"status":status,"msg":msg}return resultexcept Exception,e:msg = """The host %d: ping_mon_by_host failed!""" % host
def check_salt_minion(host):###检查minion端状态,通过一个简单的命令try:#cmd = "ps -ef|grep salt-minion|grep -v grep"cmd = "salt '%s' -t 7 cmd.run 'uptime'" %host#cmd = "salt '%s' test.ping" %host
# cmd = "uptime" #ret = ssh_cmd(MASTERIP,cmd)#ret = ssh_cmd(MASTERIP,cmd)ret = run_cmd(host,cmd,method="sync",output="text",ignore_error="true",timeout=5)msg = ""#if ret and 'load' in ret:if ret and 'load' in ret:status = 0#msg = 'The host %s salt-minion is running ok.\n' % hostmsg = 'ok'else :restart_salt_minion(host)time.sleep(3)ret1 = run_cmd(host,cmd,method="sync",output="text",ignore_error="true",timeout=5)if ret1 and 'load' in ret1:status = 0 #msg = 'The host %s salt-minion is running ok.\n' % hostmsg = 'ok'else:status = 1#msg = "The host %s salt-minion is running failed.\n" % hosttry:msg = ret1.split(':')[1].strip()##打印出客户端的详细报错except Exception,e:msg = ret1#msg = 'salt-minion failed'result = {'status':status,'message':msg}return resultexcept Exception,e:#traceback.print_exc()pass
def restart_salt_minion(host):##重启minion端try:cmd = '/etc/init.d/salt-minion restart'#ret = ssh_cmd(host,cmd)ret = run_cmd(host,cmd,method="sync",output="text",ignore_error="true",timeout=5) if ret != None and "Starting salt-minion daemon" in ret and "OK" in ret:status = 0msg = 'The host %s salt-minion restart successed.\n' % hostelse :status = 1msg = "The host %s salt-minion restart failed.\n" % hostresult = {'status':status,'message':msg}return resultexcept Exception,e:#traceback.print_exc()#print epass
def get_salt_minion_status(host):#print '%s test########################' % hostping_ret = ping_mon_by_host(host)if ping_ret["status"] == 0:salt_ret = check_salt_minion(host)# 如果salt进程不在尝试重启一次saltsalt_status = salt_ret["status"]salt_info = salt_ret["message"]salt_minion_mon(host,ping_ret["status"],salt_status,salt_info)else:salt_status = 1salt_info = 'ping failed'#delete_key_by_id(host)#insert_salt_status(host,ping_ret["status"],salt_status) #salt_minion_mon(host,ping_ret["status"],salt_status,salt_info)if __name__ == "__main__":begintime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))begintime = time.strptime(begintime, '%Y-%m-%d %H:%M:%S')begintime = datetime.datetime(*begintime[:6])all_id=get_all_id()pool = Pool(10)##使用进程池pool.map(get_salt_minion_status,all_id)pool.close()pool.join()endtime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))endtime = time.strptime(endtime, '%Y-%m-%d %H:%M:%S')endtime = datetime.datetime(*endtime[:6])time_dvalue = (endtime - begintime).secondsprint '总执行时间:%s sec' % (time_dvalue)print '统计的机器数 %s' % (len(all_id))##获取执行过程的时间
把信息录入数据库,然后写一个前端页面,去定时获取数据库最新的信息就可以了,以ctime时间为准
转载于:https://blog.51cto.com/6252961/1710977
saltstack minion端状态监控程序相关推荐
- saltstack state模块-状态管理
一.说明 本文基于前两篇的salstack的安装部署和使用的基础上,又一个常用的功能, State模块是saltstack核心的功能,状态管理包括:Package,File,Network, ...
- Asp.net控件开发学习笔记(四)---Asp.net服务端状态管理
Asp.net请求处理构架 当一个客户端浏览器对IIS发起访问请求资源时(比如一个.aspx文件),Asp.net会初始化并维护一个包含了多个Response和Request的Http Session ...
- Flink 状态一致性:端到端状态一致性的保证
文章目录 状态一致性 什么是状态一致性 状态一致性种类 端到端(end-to-end)状态一致性 Sink端到端状态一致性的保证 Flink+Kafka端到端状态一致性的保证 状态一致性 什么是状态一 ...
- 查看gpio状态_基于Arduino开发,借助blinker平台,让NodeMCU实现8路继电器APP端状态监视和控制...
基于Arduino开发,借助blinker物联网平台,让NodeMCU实现8路继电器APP端状态监视和控制 先上开发板功能图: 本文利用了NodeMCU上的D0-D3,D5-D9,总共 8个 GPIO ...
- SaltStack系统初始化状态文件编写
系统初始化 系统初始化要做的事: 就是系统刚安装的时候要做的事情: 前提是系统是好的,网络是好的,主机名已设置 - SELINUX - 防火墙关闭 - 配置yum源 - 安装常用软件 ...
- 判断html 处于移动端状态,还是PC端
判断是移动端还是PC端 function judge() {let str = (navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|i ...
- python saltstack_通过Python利用saltstack进行生成服务器资产清单
前言:人工去对每一台服务器的硬件信息并记录早已经过去了,无论通过脚本还是自动化工具都是可以进行一次编写到处抓取的,本文主要使用saltstack作为使用工具,然后利用其提供的APi编写所需的Pytho ...
- saltstack平台master不能发现minion的问题排查
有网友在openeuler22.03LTS系统平台部署好salt-master和salt-minion,服务起来了,但是master段发现不了minion,咨询该如何解决,本文提示相关排查方向和解决办 ...
- 【saltstack】配置salt-master端REDIS_RETURN
实现配置相对简单,在/etc/salt/master中增加: master_job_cache: redis redis.db: '0' redis.host: 'redis-host-addr' r ...
- 自动化运维—saltstack
2019独角兽企业重金招聘Python工程师标准>>> 自动化运维--saltstack .ansible 一.自动化运维介绍 传统运维:传统运维效率低,大多工作需要人工完成,工作繁 ...
最新文章
- ActiveMQ结合Spring收发消息
- 看动画学算法之:排序-快速排序
- 关于CI框架引入CSS与JS文件
- svn ignore 的用法
- sql语句出错:Column count doesn't match value count at row 1
- SQL-SERVER2008登录错误233
- 如何在股票软件画波浪?波浪原理?初级应用画线
- 黑马程序员-为梦想而努力!
- 三菱plc程序三菱FX3U三轴伺服电机程序,包含轴点动,回零,相对与绝对定位
- java模拟器安卓7,指小游Java模拟器
- 决策树----对天气和自身状态是否适合去运动做出预测
- java 正则 惰性匹配_js正则表达式惰性匹配和贪婪匹配用法分析
- dms3.0 mysql_DMS 3.0 导入数据库出错-问答-阿里云开发者社区-阿里云
- [curl] 开启代理加速下载
- python的打开方式有哪些_python中打开程序的方式有哪些
- Win系统 - 如何找出预装Windows系统的密钥
- 扫二维码领红包系统软件开发流程
- 如何将Excel表中一列数据的分子和分母分别存储
- mysql 8.0版本 error 3516 ;error 3618
- php gearman 定时任务,php使用gearman进行任务分发操作实例详解
热门文章
- 31线性空间05——列空间和零空间、维数
- 最优化方法:深度学习最优化方法
- 【机器学习笔记】使用lightgbm画并保存Feature Importance
- fwr171改无线服务器,迅捷(Fast)FWR171无线路由器3G路由模式设置
- Android自定义弹窗页面,Android编程实现的自定义弹窗(PopupWindow)功能示例
- Futter基础11篇: 实现自定义AppBar 定义顶部Tab切换、底部Tab结合顶部Tab实现类似头条页面布局
- 使用 Multipath TCP 为 iOS 创建备份连接(转)
- S11 day 94 RestFramework 之 APIView视图
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
- oracle函数大全-字符处理函