背景

公司有600多台服务器,打算写一个小程序,能一眼看见哪些服务器不在线。

大体思路是:

1、把所有服务器ip存进数据库,ping命令判断服务器是否在线

2、更新数据库中ip的状态

3、简单的web显示出来

4、优化程序,美观页面

一、python检测IP在线

fping命令,它是对一个文件的批量ping,瞬间完成的,如果ping不通,那就较慢,日常ping不通的毕竟是少数,所以这个非常适用。

这个命令需要安装,直接yum就行,yum install fping -y

创建fping.sh的shell脚本
#!/bin/bash
rm -f result.txt
cat ipmi_ping.txt | fping > result.txt

执行结果:

二、读取mysql数据

1、创建一张数据表,存放ip等信息

#创建一个表
create table ip_table(
id int auto_increment, #id自增
ipaddress char(15) not null, #地址禁止为空
application char(24),
status char(6),
primary key(id)
);
#插入部分数据
insert into ip_table values(id,'10.30.0.101','邮箱服务器','在线');
insert into ip_table values(id,'10.1.100.1','核心交换机','在线');
insert into ip_table values(id,'10.1.50.30','开发库','在线');
insert into ip_table values(id,'10.1.80.115','openstack控制节点','在线');
insert into ip_table values(id,'10.1.80.116','openstack计算节点','在线');
insert into ip_table values(id,'10.1.80.117','openstack块存储节点','在线');
commit;

2、python实现读取数据表中的内容,并写入到一个本地文件

# -*- coding:utf-8 -*-
import pymysql def get_loan_number(file):
connect = pymysql.connect(
host="10.1.80.200",
port=3306,
user="alex",
passwd="alex",
db="ip",
charset='utf8'
)
print("写入中,请等待……")
cursor = connect.cursor() #获取游标
sql = "select ipaddress from ip_table" #执行的sql
cursor.execute(sql) #执行数据库操作
number = cursor.fetchall() #查询并返回所有结果
fp = open(file, "w")
loan_count = 0
for loanNumber in number:
loan_count += 1
fp.write(loanNumber[0] + "\n")
fp.close()
cursor.close() #关闭指针对象
connect.close() #关闭数据库连接
print("写入完成,共写入%d条数据……" % loan_count) if __name__ == "__main__":
file = r"loanNUmber.txt"
get_loan_number(file)

二、执行fping脚本,并将结果输出到result文件

# -*- coding:utf-8 -*-
import pymysql
import os def get_loan_number(file):
connect = pymysql.connect(
host="localhost",
port=3306,
user="root",
passwd="12345678",
db="ip",
charset='utf8'
)
print("写入中,请等待……")
cursor = connect.cursor() #获取游标
sql = "select ipaddress from ip_table" #执行的sql
cursor.execute(sql) #执行数据库操作
number = cursor.fetchall() #查询并返回所有结果
fp = open(file, "w")
loan_count = 0
for loanNumber in number:
loan_count += 1
fp.write(loanNumber[0] + "\n")
fp.close()
cursor.close() #关闭指针对象
connect.close() #关闭数据库连接
print("写入完成,共写入%d条数据……" % loan_count)
f = os.system('sh /ping/fping.sh') if __name__ == "__main__":
file = r"ipmi_ping.txt"
get_loan_number(file)

三、读result.txt文件,将IP is unreachable的行提取更新状态‘不在线’

#!/usr/bin/python3
# -*- coding:utf-8 -*-
import pymysql
import os def get_loan_number(file):
connect = pymysql.connect(
host="localhost",
port=3306,
user="root",
passwd="12345678",
db="checkip",
charset='utf8'
)
print("写入中,请等待……")
cursor = connect.cursor() #获取游标
sql = "select ipaddress from ip_table" #执行的sql
cursor.execute(sql) #执行数据库操作
number = cursor.fetchall() #查询并返回所有结果
fp = open(file, "w")
loan_count = 0
for loanNumber in number:
loan_count += 1
fp.write(loanNumber[0] + "\n")
fp.close()
print("写入完成,共写入%d条数据……" % loan_count)
f = os.system('sh fping.sh') content = open('result.txt','r')
first= content.read().split('\n')
for i in range(0,len(first)-1):
tmp = first[i]
ip = tmp[:tmp.index('is')-1]
status = '在线'
if 'unreachable' in tmp:
status = '离线'
cursor.execute('update ip_table set status ="%s" where ipaddress ="%s"'%(status,ip))
connect.commit()
content.close()
cursor.close() #关闭指针对象
connect.close() #关闭数据库连接 if __name__ == "__main__":
file = r"ipmi_ping.txt"
get_loan_number(file)

此时已经可以在数据库中看见status发送了变化。

四、设置get_loan_number每秒执行

#!/usr/bin/python3
# -*- coding:utf-8 -*-
import pymysql
import os
import time def get_loan_number(file):
connect = pymysql.connect(
host="localhost",
port=3306,
user="root",
passwd="12345678",
db="checkip",
charset='utf8'
)
cursor = connect.cursor() #获取游标
sql = "select ipaddress from ip_table" #执行的sql
cursor.execute(sql) #执行数据库操作
number = cursor.fetchall() #查询并返回所有结果
fp = open(file, "w")
loan_count = 0
for loanNumber in number:
loan_count += 1
fp.write(loanNumber[0] + "\n")
fp.close()
f = os.system('sh fping.sh >> checkip.log 2>&1') content = open('result.txt','r')
first= content.read().split('\n') #通过指定分隔符对字符串进行切片
for i in range(0,len(first)-1):
tmp = first[i]
ip = tmp[:tmp.index('is')-1]
status = '在线'
if 'unreachable' in tmp:
status = '离线'
cursor.execute('update ip_table set status ="%s" where ipaddress ="%s"'%(status,ip))
connect.commit()
content.close()
cursor.close() #关闭指针对象
connect.close() #关闭数据库连接 while True:
get_loan_number(r"ipmi_ping.txt")
time.sleep(3)

五、设计web提取mysql数据

这里我用了flask框架,因为简单好用。

首先安装python第三方模块:

pip3 install flask
pip3 install flask_bootstrap
pip3 install pymysql

建立base.html

{% extends "bootstrap/base.html"  %}
{% block title %}Flask{% endblock %}
{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">PMSystem</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/">主机在线平台</a></li>
</ul>
</div>
</div>
</div>
{% endblock %} {% block content %}
<div class="container">
{% block page_content %}{% endblock %}
</div>
{% endblock %}

建立index.html

{% extends "base.html" %}

{% block title %}主机平台{% endblock %}

{% block page_content %}
<table class="table table-bordered">
<tr>
<th>序号</th>
<th>IP地址</th>
<th>服务</th>
<th>是否在线</th>
</tr>
{% for i in u %}
<tr>
<td>{{ i[0] }}</td>
<td>{{ i[1] }}</td>
<td>{{ i[2] }}</td>
<td>{{ i[3] }}</td>
</tr>
{% endfor %}
</table> {% endblock %}

建立app.py

from flask import Flask
from flask import render_template
from flask_bootstrap import Bootstrap
import pymysql
app = Flask(__name__)
bootstrap = Bootstrap(app) @app.route('/')
def index():
conn = pymysql.connect(host='10.1.80.110', user='alex', password='alex', db='checkip', charset='utf8')
cur = conn.cursor()
sql = "SELECT * FROM ip_table"
cur.execute(sql)
u = cur.fetchall()
conn.close()
return render_template('index.html',u=u)
if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True)

运行一下程序:

初步实现了需求。

六、设置后台执行

nohup /python3/bin/python3.5 -u ping.py >> ping.log
nohup /python3/bin/python3.5 -u app.py >> app.log 2>&1 &

python初级实战-----主机在线情况监控web的更多相关文章

  1. python初级实战-----关于邮件发送问题

    python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用.smtplib模块主要负责发送邮件,email模块主要负责构造邮件. sm ...

  2. 自学Zabbix4.3 zabbix实战监控Web网站性能

    自学Zabbix4.3 zabbix实战监控Web网站性能 用zabbix如何监控web性能和可用性呢?一般分为四个步骤:打开网站.登陆.登陆验证.退出,看实例. 1. 检测流程 1. 打开网站:如果 ...

  3. python 多线程ping大量服务器在线情况

    需要ping一个网段所有机器的在线情况,shell脚步运行时间太长,用python写个多线程ping吧,代码如下: #!/usr/bin/python #coding=utf-8 ''' Create ...

  4. Python接口测试实战5(下) - RESTful、Web Service及Mock Server

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  5. Python实现监测抖音在线时间,实时记录一个人全天的在线情况

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:小dull鸟 今天给大家分享一篇有趣的文章,灵感来自于前几天与室友的 ...

  6. zabbix 监控web网站性能

    一直在纠结用什么实例来给大家演示呢?想来想去还是官方的好,那我们怎么用zabbix监控web性能和可用性呢?我们这边分为几个步骤:打开网站.登陆.登陆验证.退出,一共4个小step,看实例. 检测流程 ...

  7. 优化系统资源ulimit《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》

    优化系统资源ulimit<高性能Linux服务器构建实战:运维监控.性能调优与集群应用> 假设有这样一种情况,一台Linux 主机上同时登录了10个用户,在没有限制系统资源的情况下,这10 ...

  8. zabbix如何监控WEB应用性能

    HTTP服务目前最流行的互联网应用之一,如何监控服务的健康状态对系统运维来说至关重要.   Zabbix本身提供了对WEB应用程序的监控,比如监控WEB程序的Download Speed,Respon ...

  9. Spring MVC 程序首页的设置 - 一号门-程序员的工作,程序员的生活(java,python,delphi实战)

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

随机推荐

  1. POJ 2823 Sliding Window (单调队列)

    单调队列 加了读入挂比不加更慢.... 而且这份代码要交c++ 有大神G++跑了700ms..... orzorzorz #include<iostream> #include<cs ...

  2. (链表) leetcode 21. Merge Two Sorted Lists

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  3. 数据库连接池 C3p0

    数据库连接池 C3po 1 定义 本质上是个容器(集合) 存放数据库的连接容器(connection 对象) ,当系统初始化以后 容器就会创建 容器中就会申请一些连接对象 ,当用户来访问数据库的时候 ...

  4. plsql无法正常显示汉字

    首先执行语句 select * from V$NLS_PARAMETERS  查看第一行中PARAMETER项中为NLS_LANGUAGE 对应的VALUE项中是否为SIMPLIFIED CHINES ...

  5. C# 封装SqlBulkCopy,让批量插入更方便

    关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也 ...

  6. pt-online-schema-change 测试使用-包含生成测试数据

    pt-online-schema-change 测试使用-包含生成测试数据 # 参考网址: https://www.2cto.com/database/201703/618280.html 一.简要描 ...

  7. 流畅的python--2 序列构成的数组

    我们把文本.列表和表格叫做数据火车...FOR命令通常能作用于数据火车上.      ---ABC Programmer's Handbook 不管是哪种数据结构,字符串.列表.字节序列.数组.XML ...

  8. Python中字符串的操作

    字符串的基本详情 用单引号或者双引号包含的内容 不支持直接在内存中修改 可支持索引.切片.成员检查.长度查看 字符串赋值到变量 str1 = 'hello world' 字符串打印查看 str1 = ...

  9. redis注册成window服务 标签: redis

    注册服务 redis-server.exe –service-install redis.windows.conf 删除服务 redis-server –service-uninstall 开启服务 ...

  10. 修改ScriptBundle 生成顺序

    ScriptBundle 一般用法 C#的代码如下: bundles.Add(new ScriptBundle("~/bundles/jqueryval") .Include(&q ...