python常用运维脚本实例小结


Posted in Python onFebruary 14, 2020

一、ps 可以查看进程的内存占用大小,写一个脚本计算一下所有进程所占用内存大小的和。

(提示,使用ps aux 列出所有进程,过滤出RSS那列,然后求和)

注:ps -ef 与 ps aux 效果一样使用随意

import os

list = []

sum = 0  

str1 = os.popen('ps aux','r').readlines()

for i in str1:

  str2 = i.split()

  new_rss = str2[5]

  list.append(new_rss)

for i in list[1:-1]: 

  num = int(i)

  sum = sum + num 

print '%s:%s' %(list[0],sum)

二、一键部署lvs与keepalived

注:部署keepalived配置文件,会自动将lvs部署好,不必单独搭建,但是要下载好ipvsadm

这里单独搭建了lvs

#提前配置好免密钥登陆,与apache服务

import pexpect
import os
ds_ip = '192.168.102.143'
rs1_ip = '192.168.102.144'
rs2_ip = '192.168.102.145'
vip = '192.168.102.250'
ds_cmd = ['ipvsadm -C',
     'ipvsadm -A -t {vip}:80 -s rr'.format(vip=vip),
     'ipvsadm -a -t {vip}:80 -r {rs1_ip}:80 -g'.format(vip=vip, rs1_ip=rs1_ip),
     'ipvsadm -a -t {vip}:80 -r {rs2_ip}:80 -g'.format(vip=vip,rs2_ip=rs2_ip),
     'ifconfig ens33:0 {vip} broadcast {vip} netmask 255.255.255.255 up'.format(vip=vip),
     'route add -host {vip} dev ens33:0'.format(vip=vip)
     ]
# for ds_cmd in ds_cmd:

rs1_cmd = [
  'ansible rs1 -m shell -a "ifconfig lo:0 {vip} broadcast {vip} netmask 255.255.255.255 up" &>/dev/null'.format(vip=vip),
  'ansible rs1 -m shell -a "route add -host {vip} dev lo:0" &>/dev/null'.format(vip=vip),
  'ansible rs1 -m shell -a "echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore" &>/dev/null',
  'ansible rs1 -m shell -a "echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce" &>/dev/null',
  'ansible rs1 -m shell -a "echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore" &>/dev/null',
  'ansible rs1 -m shell -a "echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce" &>/dev/null',
  'service httpd restart']
# for rs_cmd in rs_cmd:

rs2_cmd = [
  'ansible rs2 -m shell -a "ifconfig lo:0 {vip} broadcast {vip} netmask 255.255.255.255 up" &>/dev/null'.format(vip=vip),
  'ansible rs2 -m shell -a "route add -host {vip} dev lo:0" &>/dev/null'.format(vip=vip),
  'ansible rs2 -m shell -a "echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore" &>/dev/null',
  'ansible rs2 -m shell -a "echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce" &>/dev/null',
  'ansible rs2 -m shell -a "echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore" &>/dev/null',
  'ansible rs2 -m shell -a "echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce" &>/dev/null',
  'service httpd restart']

ansible='''
echo "[rs1]" >> /etc/ansible/hosts;
echo "{rs1_ip}" >> /etc/ansible/hosts;
echo "[rs2]" >> /etc/ansible/hosts;
echo "{rs2_ip}" >> /etc/ansible/hosts;
'''.format(rs1_ip=rs1_ip,rs2_ip=rs2_ip)


def Ansible():
  res = os.system('yum install ansible -y &>/dev/null')
  if res== 0:
    print('ansible安装完成!')
    os.system(ansible)


def lvs():
  i = os.system('yum -y install ipvsadm &>/dev/null')
  if i == 0:
    print('lvs下载完成')
    for a in ds_cmd:
      res = os.system(a)
      if res == 0:
        print('ok')
      else:
        print('false')
    for b in rs1_cmd:
      res1 = os.system(b)
      if res1 == 0:
        print('ok')
      else:
        print('false')
    for c in rs2_cmd:
      res2 = os.system(c)
      if res2 == 0:
        print('ok')
      else:
        print('false')
  else:
    print('lvs下载失败')

keepalived = '''
#全局配置
! Configuration File for keepalived
#全局配置
global_defs {
  notification_email {
    #收件人地址
  }
    #邮件服务器
}
VRRP配置DS1
vrrp_instance VI_1 {
  state MASTER          #角色类型MASTER|BACKUP
  interface ens33          #网卡名称
  virtual_router_id 51      #虚拟路由id(需要与BACKUP一致)
  priority 100          #优先级
  advert_int 1          #没1秒检查一次
  #nopreempt            #非抢占模式

  authentication {
    auth_type PASS        #认证类型 主备之间必须一样
    auth_pass 1111        #认证密码 主备之间必须一样
  }
  virtual_ipaddress {
    192.168.102.250        #虚拟ip(vip)
  }
}

#LVS配置
virtual_server 192.168.102.250 80 {
  delay_loop 3          #健康检查时间间隔
  lb_algo rr            #负载均衡调度算法
  lb_kind DR            #负载均衡转发规则
  protocol TCP          #协议

  real_server 192.168.102.144 80 {  #要监控的real_server的ip和端口号
      weight 1         #权重
    TCP_CHECK {          #基于tcp协议的检查
      connect_timeout 3     #连接时间超时
      retry 3          #重连次数
      delay_before_retry 3  #重连间隔时间
    }
  }


  real_server 192.168.102.145 80 {
      weight 1
    TCP_CHECK {
      connect_timeout 3
      retry 3
      delay_before_retry 3
    }
  }
}'''
def Keepalived():
  d = os.system('yum install keepalived -y &> /dev/null')
  if d == 0:
    print('keeplived下载完成')
    with open(r'/etc/keepalived/keepalived.conf', 'w', encoding='utf-8') as f:
      f.write(keepalived)
    e = os.system('systemctl start keepalived')
    if e == 0:
      print('keepalived部署完成!')
    else:
      print('keepalived部署失败')
  else:
    print('keepalived下载失败')

def main():
  # key()
  Ansible()
  # ssh_copy()
  lvs()
  Keepalived()

if __name__ == '__main__':
  main()

三、用python3编写一个监控上面lvs服务状态和系统资源的脚本

import yagmail
import paramiko
import socket
import re
import time
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
rs1_ip = '192.168.102.144'
rs2_ip = '192.168.102.145'
ds_ip = '192。168.102.143'
disk_cmd = "df -m | grep /dev/sda1 | awk '{print $4}'"
cpu_cmd = '''
top n 1 d 1 b -p 1 | grep '%Cpu' | awk -F "," '{print $4}' | awk -F "id" '{print $1}' | awk -F "." '{print $1}'
'''
free_cmd = "free -m | grep Mem |awk '{print $7}'"

def connect1():
  ssh.connect('{rs1_ip}'.format(rs1_ip=rs1_ip), 22, 'root', '1', timeout=3)
def connect2():
  ssh.connect('{rs2_ip}'.format(rs2_ip=rs1_ip), 22, 'root', '1', timeout=3)

def mail(head, Contents):
  yag = yagmail.SMTP(user="15898297124@163.com", password="zz54605519", host='smtp.163.com')
  yag.send('15898297124@163.com',subject = head, contents = Contents)
  yag.close()

def http():
  socket.setdefaulttimeout(1)
  server = socket.socket()
  host_list = ['%s:80' % (rs1_ip),'%s:80' % (rs2_ip)]
  for info in host_list:
    ip = re.compile('(.*?):(.*)').search(info).group(1)
    port = re.compile('(.*?):(.*)').search(info).group(2)
    res = server.connect_ex((ip, int(port)))
    if res != 0:
      mail(ip,'%s不通' % port)

def disk():
  connect1()
  stdin1, stdout1, stderr1 = ssh.exec_command(disk_cmd)
  disk1 = int(stdout1.read().decode('utf-8'))
  print('%s节点disk剩余空间为%sM' % (rs1_ip,disk1))
  if disk1 <= 200:
    mail(rs1_ip,'disk剩余空间为%sM' % disk1)
  connect2()
  stdin2, stdout2, stderr2 = ssh.exec_command(disk_cmd)
  disk2 = int(stdout2.read().decode('utf-8'))
  print('%s节点disk剩余空间为%sM' % (rs2_ip, disk2))
  if disk2 <= 200:
    mail(rs2_ip, 'disk剩余空间为%sM' % disk2)

def cpu():
  connect1()
  stdin1, stdout1, stderr1 = ssh.exec_command(cpu_cmd)
  cpu1 = int(stdout1.read().decode('utf-8'))
  cpu = 100 - cpu1
  print('%s节点cpu使用率为百分之%s' % (rs1_ip, cpu))
  if cpu >= 80:
    mail(rs1_ip, 'cpu使用量为%s' % cpu)

  connect2()
  stdin2, stdout2, stderr2 = ssh.exec_command(cpu_cmd)
  cpu2 = int(stdout2.read().decode('utf-8'))
  cpu = 100 - cpu2
  print('%s节点cpu使用率为百分之%s' % (rs2_ip, cpu))
  if cpu >= 80:
    mail(rs2_ip, 'cpu使用量为%s' % cpu)

def free():
  connect1()
  stdin1, stdout1, stderr1 = ssh.exec_command(free_cmd)
  free1 = int(stdout1.read().decode('utf-8'))
  print('%s节点磁盘剩余空间为%sM' % (rs1_ip, free1))
  if free1 <= 200:
    mail(ds_ip, '磁盘剩余空间为%sM' % free1)

  connect2()
  stdin2, stdout2, stderr2 = ssh.exec_command(disk_cmd)
  free2 = int(stdout2.read().decode('utf-8'))
  print('%s节点磁盘剩余空间为%sM' % (rs2_ip, free2))
  if free2 <= 200:
    mail(ds_ip, '磁盘剩余空间为%sM' % free2)

def main():
  while True:
    http()
    cpu()
    free()
    disk()
    time.sleep(60)

if __name__ == '__main__':
  main()

四、用python编写一键部署数据库主从服务

主服务器

import pexpect
import os
import configparser

# HOSTNAME_DB1='db1'
# HOSTNAME_DB2='db2'
# DB1 = '192.168.254.24'
# DB2 = '192.168.254.27'
DBPASSWORD = '1'

def repo():
  os.system('touch /etc/yum.repos.d/mariadb.repo')
  with open('/etc/yum.repos.d/mariadb.repo','w',encoding='utf8') as f:
    f.write('[mariadb]')
  config = configparser.ConfigParser()
  config.read("/etc/yum.repos.d/mariadb.repo", encoding="utf-8")
  config.set('mariadb', 'name', 'MariaDB')
  config.set('mariadb', 'baseurl', 'http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/')
  config.set('mariadb', 'gpgkey', 'http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB')
  config.set('mariadb', 'gpgcheck', '1')
  config.write(open('/etc/yum.repos.d/mariadb.repo','w'))
def mariadb():
  a = os.system('yum install MariaDB -y &> /dev/null')
  if a == 0:
    b = os.system('systemctl start mariadb &> /dev/null')
    if b == 0:
      print('mariadb启动成功')
    child = pexpect.spawn('mysql_secure_installation')
    child.expect('enter for none')
    child.sendline('')
    child.expect('Y/n')
    child.sendline('y')
    child.expect('New')
    child.sendline(DBPASSWORD)
    child.expect('Re-enter')
    child.sendline(DBPASSWORD)
    child.expect('successfully')
    child.sendline('')
    child.sendline('')
    child.sendline('')
    child.sendline('')
    child.interact()
    child.close()
def db1():
  config = configparser.ConfigParser()
  config.read("/etc/my.cnf.d/server.cnf", encoding="utf-8")
  config.set('mysqld', 'server-id', '1')
  config.set('mysqld', 'log-bin', 'mysql-bin')
  config.write(open('/etc/my.cnf.d/server.cnf','w'))
  b = os.system('systemctl restart mariadb')
  if b == 0:
    # os.system('mysql -uroot -p%s' % DBPASSWORD)
    # os.system("CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';")
    # os.system("GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';")
    # os.system('flush privileges;')
    # os.system('show master status')
    child = pexpect.spawn('mysql -uroot -p1')
    child.expect('none')
    child.sendline("CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';")
    child.expect('none')
    child.sendline("GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';")
    child.expect('none')
    child.sendline('flush privileges;')
    child.expect('none')
    child.sendline('show master status;')
    child.interact()
    child.close()
def main():
  repo()
  mariadb()
  db1()
if __name__ == '__main__':
  main()

从服务器

import pexpect
import os
import configparser

# HOSTNAME_DB1='db1'
# HOSTNAME_DB2='db2'
DB1 = '192.168.102.143'
# DB2 = '192.168.254.27'
DBPASSWORD = '1'

def repo():
  os.system('touch /etc/yum.repos.d/mariadb.repo')
  with open('/etc/yum.repos.d/mariadb.repo','w',encoding='utf8') as f:
    f.write('[mariadb]')
  config = configparser.ConfigParser()
  config.read("/etc/yum.repos.d/mariadb.repo", encoding="utf-8")
  config.set('mariadb', 'name', 'MariaDB')
  config.set('mariadb', 'baseurl', 'http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/')
  config.set('mariadb', 'gpgkey', 'http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB')
  config.set('mariadb', 'gpgcheck', '1')
  config.write(open('/etc/yum.repos.d/mariadb.repo','w'))

def mariadb():
  a = os.system('yum install MariaDB -y')
  if a == 0:
    b = os.system('systemctl start mariadb &> /dev/null')
    if b == 0:
      print('mariadb启动成功')
    child = pexpect.spawn('mysql_secure_installation')
    child.expect('enter for none')
    child.sendline('')
    child.expect('Y/n')
    child.sendline('y')
    child.expect('New')
    child.sendline(DBPASSWORD)
    child.expect('Re-enter')
    child.sendline(DBPASSWORD)
    child.expect('successfully')
    child.sendline('')
    child.sendline('')
    child.sendline('')
    child.sendline('')

def db2():
  config = configparser.ConfigParser()
  config.read("/etc/my.cnf.d/server.cnf", encoding="utf-8")
  config.set('mysqld', 'server-id', '2')
  config.write(open('/etc/my.cnf.d/server.cnf','w'))
  b = os.system('systemctl restart mariadb')
  if b == 0:
    bin = 'mysql-bin.000001'
    pos = 765
    # os.system('mysql -uroot -p%s' % DBPASSWORD)
    # os.system('''mysql -uroot -p%s -e "CHANGE MASTER TO MASTER_HOST='%s', MASTER_USER='slave', MASTER_PASSWORD='slave', MASTER_LOG_FILE='%s', MASTER_LOG_POS=%s;"''' % (DBPASSWORD,DB1,bin,pos))
    # os.system("mysql -uroot -p%s -e 'start slave;'" % DBPASSWORD)
    child = pexpect.spawn('mysql -uroot -p%s' % DBPASSWORD)
    child.expect('none')
    child.sendline("CHANGE MASTER TO MASTER_HOST='%s', MASTER_USER='slave', MASTER_PASSWORD='slave', MASTER_LOG_FILE='%s', MASTER_LOG_POS=%s;" % (DB1,bin,pos))
    child.expect('none')
    child.sendline( 'start slave;' )
    child.interact()
    child.close()
def main():
  repo()
  mariadb()
  db2()
if __name__ == '__main__':
  main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python实现strcmp函数功能示例
Mar 25 Python
Python日志模块logging简介
Apr 13 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
Python实现查看系统启动项功能示例
May 10 Python
python无序链表删除重复项的方法
Jan 17 Python
TensorFlow Autodiff自动微分详解
Jul 06 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
Django日志及中间件模块应用案例
Sep 10 Python
Python try except finally资源回收的实现
Jan 25 Python
Python 多线程处理任务实例
Nov 07 Python
Python帮你解决手机qq微信内存占用太多问题
Feb 15 Python
利用Python多线程实现图片下载器
Mar 25 Python
Python如何在DataFrame增加数值
Feb 14 #Python
python turtle工具绘制四叶草的实例分享
Feb 14 #Python
Python阶乘求和的代码详解
Feb 14 #Python
Python pip配置国内源的方法
Feb 14 #Python
Python3基本输入与输出操作实例分析
Feb 14 #Python
From CSV to SQLite3 by python 导入csv到sqlite实例
Feb 14 #Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
Feb 14 #Python
You might like
15个小时----从修改程序到自己些程序
2006/10/09 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
php实现的简易扫雷游戏实例
2015/07/09 PHP
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
JointJS流程图的绘制方法
2018/12/03 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
2020/09/01 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
JavaScript实现雪花飘落效果
2020/12/27 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
python比较2个xml内容的方法
2015/05/11 Python
python制作websocket服务器实例分享
2016/11/20 Python
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
高级运动鞋:GREATS
2019/07/19 全球购物
SQL中where和having的区别
2012/06/17 面试题
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
土木工程专业大学毕业生求职信
2013/10/13 职场文书
计算机学生的自我评价分享
2014/02/18 职场文书
企业后勤岗位职责
2014/02/28 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
李培根演讲稿
2014/05/22 职场文书
先进党员事迹材料
2014/12/24 职场文书
胡雪岩故居导游词
2015/02/06 职场文书