公司数据库有近三千台服务器,用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端状态监控程序相关推荐

  1. saltstack state模块-状态管理

    一.说明 本文基于前两篇的salstack的安装部署和使用的基础上,又一个常用的功能, State模块是saltstack核心的功能,状态管理包括:Package,File,Network,      ...

  2. Asp.net控件开发学习笔记(四)---Asp.net服务端状态管理

    Asp.net请求处理构架 当一个客户端浏览器对IIS发起访问请求资源时(比如一个.aspx文件),Asp.net会初始化并维护一个包含了多个Response和Request的Http Session ...

  3. Flink 状态一致性:端到端状态一致性的保证

    文章目录 状态一致性 什么是状态一致性 状态一致性种类 端到端(end-to-end)状态一致性 Sink端到端状态一致性的保证 Flink+Kafka端到端状态一致性的保证 状态一致性 什么是状态一 ...

  4. 查看gpio状态_基于Arduino开发,借助blinker平台,让NodeMCU实现8路继电器APP端状态监视和控制...

    基于Arduino开发,借助blinker物联网平台,让NodeMCU实现8路继电器APP端状态监视和控制 先上开发板功能图: 本文利用了NodeMCU上的D0-D3,D5-D9,总共 8个 GPIO ...

  5. SaltStack系统初始化状态文件编写

    系统初始化 系统初始化要做的事: 就是系统刚安装的时候要做的事情: 前提是系统是好的,网络是好的,主机名已设置 ​ - SELINUX ​ - 防火墙关闭 ​ - 配置yum源 ​ - 安装常用软件 ...

  6. 判断html 处于移动端状态,还是PC端

    判断是移动端还是PC端 function judge() {let str = (navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|i ...

  7. python saltstack_通过Python利用saltstack进行生成服务器资产清单

    前言:人工去对每一台服务器的硬件信息并记录早已经过去了,无论通过脚本还是自动化工具都是可以进行一次编写到处抓取的,本文主要使用saltstack作为使用工具,然后利用其提供的APi编写所需的Pytho ...

  8. saltstack平台master不能发现minion的问题排查

    有网友在openeuler22.03LTS系统平台部署好salt-master和salt-minion,服务起来了,但是master段发现不了minion,咨询该如何解决,本文提示相关排查方向和解决办 ...

  9. 【saltstack】配置salt-master端REDIS_RETURN

    实现配置相对简单,在/etc/salt/master中增加: master_job_cache: redis redis.db: '0' redis.host: 'redis-host-addr' r ...

  10. 自动化运维—saltstack

    2019独角兽企业重金招聘Python工程师标准>>> 自动化运维--saltstack .ansible 一.自动化运维介绍 传统运维:传统运维效率低,大多工作需要人工完成,工作繁 ...

最新文章

  1. ActiveMQ结合Spring收发消息
  2. 看动画学算法之:排序-快速排序
  3. 关于CI框架引入CSS与JS文件
  4. svn ignore 的用法
  5. sql语句出错:Column count doesn't match value count at row 1
  6. SQL-SERVER2008登录错误233
  7. 如何在股票软件画波浪?波浪原理?初级应用画线
  8. 黑马程序员-为梦想而努力!
  9. 三菱plc程序三菱FX3U三轴伺服电机程序,包含轴点动,回零,相对与绝对定位
  10. java模拟器安卓7,指小游Java模拟器
  11. 决策树----对天气和自身状态是否适合去运动做出预测
  12. java 正则 惰性匹配_js正则表达式惰性匹配和贪婪匹配用法分析
  13. dms3.0 mysql_DMS 3.0 导入数据库出错-问答-阿里云开发者社区-阿里云
  14. [curl] 开启代理加速下载
  15. python的打开方式有哪些_python中打开程序的方式有哪些
  16. Win系统 - 如何找出预装Windows系统的密钥
  17. 扫二维码领红包系统软件开发流程
  18. 如何将Excel表中一列数据的分子和分母分别存储
  19. mysql 8.0版本 error 3516 ;error 3618
  20. php gearman 定时任务,php使用gearman进行任务分发操作实例详解

热门文章

  1. 31线性空间05——列空间和零空间、维数
  2. 最优化方法:深度学习最优化方法
  3. 【机器学习笔记】使用lightgbm画并保存Feature Importance
  4. fwr171改无线服务器,迅捷(Fast)FWR171无线路由器3G路由模式设置
  5. Android自定义弹窗页面,Android编程实现的自定义弹窗(PopupWindow)功能示例
  6. Futter基础11篇: 实现自定义AppBar 定义顶部Tab切换、底部Tab结合顶部Tab实现类似头条页面布局
  7. 使用 Multipath TCP 为 iOS 创建备份连接(转)
  8. S11 day 94 RestFramework 之 APIView视图
  9. Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
  10. oracle函数大全-字符处理函