zoukankan      html  css  js  c++  java
  • Python_自动化运维

    1. 生成磁盘使用情况的日志文件

    #!/usr/bin/env python
    #!coding=utf-8

    import time
    import os

    new_time = time.strftime('%Y-%m-%d')
    disk_status = os.popen('df -h').readlines()
    str1 = ''.join(disk_status)
    f = file(new_time+'.log','w')
    f.write('%s' % str1)
    f.flush()
    f.close()

     

    2. 探测Web服务质量

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    # 该脚本可以定位访问web页面的服务质量
    # 通过Python下的pycurl模块来实现定位
    # 它可以通过调用pycurl提供的方法,来探测Web服务质量
    # 比如了解相应的HTTP状态码、请求延时、HTTP头信息、下载速度等

    import os
    import time
    import sys
    import pycurl

    # 探测目标URL
    URL = "http://www.baidu.com"

    # 创建一个Curl对象
    c = pycurl.Curl()
    # 定义请求的URL变量
    c.setopt(pycurl.URL, URL)
    # 定义请求连接的等待时间
    c.setopt(pycurl.CONNECTTIMEOUT, 5)
    # 定义请求超时时间
    c.setopt(pycurl.TIMEOUT, 5)
    # 屏蔽下载进度条
    c.setopt(pycurl.FORBID_REUSE, 1)
    # 指定HTTP重定向的最大数为1
    c.setopt(pycurl.MAXREDIRS, 1)
    # 完成交互后强制断开连接,不重用
    c.setopt(pycurl.NOPROGRESS, 1)
    # 设置保存DNS信息的时间为30秒
    c.setopt(pycurl.DNS_CACHE_TIMEOUT,30)

    # 创建一个文件对象,以“wb”方式打开,用来存储返回的http头部及页面的内容
    indexfile = open(os.path.dirname(os.path.realpath(__file__))+"/content.txt", "wb")
    # 将返回的HTTP HEADER定向到indexfile文件
    c.setopt(pycurl.WRITEHEADER, indexfile)
    # 将返回的HTML内容定向到indexfile文件
    c.setopt(pycurl.WRITEDATA, indexfile)

    # 捕捉Curl.perform请求的提交,如果错误直接报错退出
    try:
       c.perform()
    except Exception,e:
       print "连接错误"
       indexfile.close()
       c.close()
       sys.exit()

    # DNS解析所消耗的时间
    NAMELOOKUP_TIME = c.getinfo(c.NAMELOOKUP_TIME)
    # 建立连接所消耗的时间
    CONNECT_TIME = c.getinfo(c.CONNECT_TIME)
    # 从建立连接到准备传输所消耗的时间
    PRETRANSFER_TIME = c.getinfo(c.PRETRANSFER_TIME)
    # 从建立连接到传输开始消耗的时间
    STARTTRANSFER_TIME = c.getinfo(c.STARTTRANSFER_TIME)
    # 传输结束所消耗的总时间
    TOTAL_TIME = c.getinfo(c.TOTAL_TIME)
    # 返回HTTP状态码
    HTTP_CODE = c.getinfo(c.HTTP_CODE)
    # 下载数据包的大小
    SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD)
    # HTTP头部大小
    HEADER_SIZE = c.getinfo(c.HEADER_SIZE)
    # 平均下载速度
    SPEED_DOWNLOAD = c.getinfo(c.SPEED_DOWNLOAD)


    print "HTTP状态码:%d" %HTTP_CODE
    print "DNS解析时间:%.2f ms"%(NAMELOOKUP_TIME*1000)
    print "建立连接时间:%.2f ms" %(CONNECT_TIME*1000)
    print "准备传输时间:%.2f ms" %(PRETRANSFER_TIME*1000)
    print "传输开始时间:%.2f ms" %(STARTTRANSFER_TIME*1000)
    print "传输结束总时间:%.2f ms" %(TOTAL_TIME*1000)
    print "下载数据包大小:%d bytes/s" %(SIZE_DOWNLOAD)
    print "HTTP头部大小:%d byte" %(HEADER_SIZE)
    print "平均下载速度:%d bytes/s" %(SPEED_DOWNLOAD)
    indexfile.close()
    c.close()


    """
    HTTP状态码:%d
    DNS解析时间:%.2f ms
    建立连接时间:%.2f ms
    准备传输时间:%.2f ms
    传输开始时间:%.2f ms
    传输结束总时间:%.2f ms
    下载数据包大小:%d bytes/s
    HTTP头部大小:%d byte
    平均下载速度:%d bytes/s
    """ %(HTTP_CODE, NAMELOOKUP_TIME*1000, CONNECT_TIME*1000, PRETRANSFER_TIME*1000, STARTTRANSFER_TIME*1000, TOTAL_TIME*1000, SIZE_DOWNLOAD, HEADER_SIZE, SPEED_DOWNLOAD)

     

    3. 发送邮件告警

    import smtplib
    from email.mime.text import MIMEText
    '''
    发送邮件函数,默认使用163smtp
    :param mail_host: 邮箱服务器,16邮箱host: smtp.163.com
    :param port: 端口号,163邮箱的默认端口是 25
    :param username: 邮箱账号 xx@163.com
    :param passwd: 邮箱密码(不是邮箱的登录密码,是邮箱的授权码)
    :param recv: 邮箱接收人地址,多个账号以逗号隔开
    :param title: 邮件标题
    :param content: 邮件内容
    :return:
    '''

    def send_mail(username, passwd, recv, title, content, mail_host='smtp.163.com', port=25):
     msg = MIMEText(content)  # 邮件内容
     msg['Subject'] = title   # 邮件主题
     msg['From'] = username   # 发送者账号
     msg['To'] = recv      # 接收者账号列表
     smtp = smtplib.SMTP(mail_host, port=port)   # 连接邮箱,传入邮箱地址,和端口号,smtp的端口号是25
     smtp.login(username, passwd)          # 登录发送者的邮箱账号,密码
     # 参数分别是 发送者,接收者,第三个是把上面的发送邮件的 内容变成字符串
     smtp.sendmail(username, recv, msg.as_string())
     smtp.quit() # 发送完毕后退出smtp
     print('email send success.')

    if __name__ == '__main__':
     email_user = 'xxxx@163.com' # 发送者账号
     email_pwd = 'xxxxx' # 发送者密码,授权码
     maillist = 'xxxx@qq.com'
     title = '测试邮件标题'
     content = '这里是邮件内容'
     send_mail(email_user, email_pwd, maillist, title, content)

     

     

    4. 收集系统信息

    采集系统信息包括了CPU,内存,磁盘,网络等。结合自身情况。

    psutil模块是一个跨平台的获取进程和系统应用情况(CPU,内存,磁盘,网络,传感器)的库。该模块用于系统监控、限制进程资源和运行进程的管理等方面。

    (1) CPU信息
    psutil.cpu_count() # CPU逻辑数量
    psutil.cpu_count(logical=False) # CPU物理核心
    psutil.cpu_percent() # CPU当前使用率

    (2) 内存信息
    mem = psutil.virtual_memory() # 实例化内存对象
    mem.total  # 系统总计内存
    mem.used  # 系统已经使用内存
    mem.free # 系统空闲内存
    psutil.swap_memory() # swap内存信息

    (3) 硬盘信息
    psutil.disk_usage('/')

    (4) 网络信息
    psutil.net_io_counters(pernic=True)

     

    4.1 CPU利用率采集脚本

    #!/bin/python
    #coding:utf-8

    import psutil
    import time

    while True:
       time.sleep(1)
       cpu_liyonglv = psutil.cpu_percent()
       print "当前cpu利用率:33[1;31;42m%s%%33[0m"%cpu_liyonglv

    4.2 内存使用率和用户采集脚本

    #!/bin/python
    #coding:utf-8

    import psutil
    import datetime

    free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2))
    total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2))
    memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total)
    print(u"物理内存: %s G" % total)
    print(u"剩余物理内存: %s G" % free)
    print(u"物理内存使用率: %s %%" % int(memory * 100))
    # 系统启动时间
    print(u"系统启动时间: %s" % datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S"))

    users_count = len(psutil.users())

    users_list = ",".join([u.name for u in psutil.users()])
    print(u"当前有%s个用户,分别是 %s" % (users_count, users_list))

    4.3 硬盘使用率采集脚本

    #!/bin/python
    #coding:utf-8

    import psutil

    disk = psutil.disk_partitions()
    for i in disk:
       print "磁盘:%s   分区格式:%s"%(i.device,i.fstype)
       disk_use = psutil.disk_usage(i.mountpoint)
       print "使用了:%sM,空闲:%sM,总共:%sM,使用率33[1;31;42m%s%%33[0m,"%(disk_use.used/1024/1024,disk_use.free/1024/1024,disk_use.total/1024/1024,disk_use.percent)

    4.4 网络流量采集脚本

    #!/bin/python
    #coding:utf-8

    import psutil
    import time

    #网卡,可以得到网卡属性,连接数,当前流量等信息
    net = psutil.net_io_counters()
    bytes_sent = '{0:.2f} Mb'.format(net.bytes_recv / 1024 / 1024)
    bytes_rcvd = '{0:.2f} Mb'.format(net.bytes_sent / 1024 / 1024)
    print(u"网卡接收流量 %s 网卡发送流量 %s" % (bytes_rcvd, bytes_sent))

     

    5. 系统批量运维管理

    paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。

     

    5.1  用户名和密码连接脚本

    5.1.1 未封装脚本
    #!/bin/python
    #coding:utf-8

    import paramiko
     
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='192.168.1.22', port=22, username='root', password='admin123')
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('ls')
    # 获取命令结果
    result = stdout.read()
     
    # 关闭连接
    ssh.close()

     

    5.1.2 SSHClient 封装 Transport脚本
    #!/bin/python
    #coding:utf-8

    import paramiko

    transport = paramiko.Transport(('192.168.1.22', 22))
    transport.connect(username='root', password='admin123')
    ssh = paramiko.SSHClient()
    ssh._transport = transport
    stdin, stdout, stderr = ssh.exec_command('ifconfig')
    print stdout.read()
    transport.close()

     

    5.2 公钥和私钥连接脚本

    5.2.1 未封装脚本
    #!/bin/python
    #coding:utf-8

    import paramiko

    private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')  
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', key=private_key)
     
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('df')
    # 获取命令结果
    result = stdout.read()
     
    # 关闭连接
    ssh.close()
    5.2.2 SSHClient 封装 Transport脚本
    #!/bin/python
    #coding:utf-8

    import paramiko

    private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
    transport = paramiko.Transport(('192.168.1.22', 22))
    transport.connect(username='root', pkey=private_key)
    ssh = paramiko.SSHClient()
    ssh._transport = transport
    stdin, stdout, stderr = ssh.exec_command('df')
    print stdout.read()
    transport.close()

    5.3 sftp上传和下载脚本

    #!/bin/python
    import os,sys
    import paramiko

    t = paramiko.Transport(('192.168.1.22',22))
    t.connect(username='root',password='admin123')
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.put('C:UsersyunweiDesktoperror.jpg','/home/yunwei/error.jpg')
    #将error.jpg上传到服务器/home/yangmv目录
    sftp.get('/home/yunwei/sftp.txt','C:UsersyunweiDesktopsftp.txt')
    #将sftp.txt下载到本机桌面
    t.close()

    5.4 批量主机命令执行脚本

    #!/bin/python
    #coding:utf-8

    import paramiko
    port=22
    username="root"
    file=open("ip.list")
    for line in file:
       hostname=str(line.split(" ")[0])
       password=str(line.split(" ")[4]).strip()
       print "##########################",hostname,"########################"
       s=paramiko.SSHClient()
       s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
       s.connect(hostname,port,username,password)
       stdin,stdout,sterr=s.exec_command("df -Th")
       print stdout.read()
       s.close()
    file.close()


    # ip.list
    test1   192.168.1.22    22      root    admin123
    test2   192.168.1.23    22      root    Aa123456



    实战:监控采集脚本

    # _*_ coding: utf-8 _*_
    __author__ = 'HeYang'

    import psutil
    import time
    import datetime


    def cpu_info():
    time.sleep(1)
    cpu_zyl = psutil.cpu_percent()
    cpu_obj = psutil.cpu_times_percent()
    cpu_count = psutil.cpu_count()
    cpu_wl_count = psutil.cpu_count(logical=False)

    print """
    ===============CPU监控===================
    CPU占用率:%s
    CPU用户执行百分比: %s
    CPU系统中断执行百分比:%s
    CPU空闲百分比:%s
    CPU逻辑个数:%s
    CPU物理个数:%s
    """ %(cpu_zyl, cpu_obj.user, cpu_obj.system, cpu_obj.idle, cpu_count, cpu_wl_count)

    return True

    def mem_info():
    time.sleep(1)
    mem_obj = psutil.virtual_memory()
    swap_obj = psutil.swap_memory()

    print """
    ===============物理内存监控===================
    内存总量:%.2f M
    内存已使用: %.2f M
    内存未使用:%.2f M


    ===============SWAP内存监控===================
    内存总量:%.2f M
    内存已使用: %.2f M
    内存未使用:%.2f M
    """ %(mem_obj.total/1024/1024, mem_obj.used/1024/1024, mem_obj.free/1024/1024,
    swap_obj.total/1024/1024, swap_obj.used/1024/1024, swap_obj.free/1024/1024)

    def io_info():
    time.sleep(1)
    io_obj = psutil.disk_io_counters()

    print """
    ===============IO监控===================
    读IO总大小:%.2f G
    写IO总大小: %.2f G
    """ % (io_obj.read_bytes/1024/1024/1024, io_obj.write_bytes/1024/1024/1024)

    def disk_info():
    time.sleep(1)
    disk_obj = psutil.disk_usage('/')

    print """
    ===============硬盘监控===================
    硬盘总量:%.2f G
    硬盘已使用: %.2f G
    硬盘未使用:%.2f G
    """ % (disk_obj.total/1024/1024/1024, disk_obj.used/1024/1024/1024, disk_obj.free/1024/1024/1024)

    def network_info():
    time.sleep(1)
    network_obj = psutil.net_io_counters()

    print """
    ===============网络流量监控===================
    出口流量:%.2f G
    入口流量: %.2f G
    """ % (network_obj.bytes_sent/1024/1024/1024, network_obj.bytes_recv/1024/1024/1024)

    def system_info():
    time.sleep(1)
    user_list = psutil.users()
    boottime = psutil.boot_time()

    print """
    ===============系统监控===================
    当前登录用户:%s
    开机时间: %s
    """ % ([user.name for user in user_list], datetime.datetime.fromtimestamp(boottime).strftime('%Y-%m-%d %H:%M:%S'))

    def mem():
    print"""
    1 cpu监控
    2 内存监控
    3 io监控
    4 硬盘容量监控
    5 网卡ip监控
    6 系统监控
    7 退出系统
    """
    while True:

    num = raw_input("请输入要查看的内容:")
    num = int(num)

    if num == 1:
    cpu_info()
    continue
    elif num == 2:
    mem_info()
    continue
    elif num == 3:
    io_info()
    continue
    elif num == 4:
    disk_info()
    continue
    elif num == 5:
    network_info()
    continue
    elif num == 6:
    system_info()
    continue
    elif num == 7:
    break
    else:
    print('您输入的编号不存在,请重试!!')
    continue

    if __name__ == '__main__':
    mem()

    坚持这种真诚,那么总归能遇到良人。
  • 相关阅读:
    百度地图bd map使用方法
    Nodejs学习笔记2
    Nodejs学习笔记-1
    npm的安装和使用?
    如何使用jqueryUi的datepicker日历控件?
    如何 使用vim的 session和viminfo 恢复上一次工作的环境??
    Yii使用笔记 2
    关于link标签的用法, 不声明rel=stylesheet则无效? 在ff中必须声明rel属性!
    物联网产业链八大环节全景图
    一场改变你投资生涯的讨论:职业德州扑克手看交易
  • 原文地址:https://www.cnblogs.com/jiaxiaozia/p/12157283.html
Copyright © 2011-2022 走看看