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入门篇之编程习惯与特点
Oct 17 Python
python中的break、continue、exit()、pass全面解析
Aug 05 Python
Python读取sqlite数据库文件的方法分析
Aug 07 Python
python2.7安装图文教程
Mar 13 Python
在python中按照特定顺序访问字典的方法详解
Dec 14 Python
从0开始的Python学习016异常
Apr 08 Python
Django 开发环境与生产环境的区分详解
Jul 26 Python
python接口调用已训练好的caffe模型测试分类方法
Aug 26 Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 Python
Python将列表中的元素转化为数字并排序的示例
Dec 25 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
用Python制作音乐海报
Jan 26 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
PHP实现加密的几种方式介绍
2015/02/22 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
JavaScript中for-in遍历方式示例介绍
2014/02/11 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
python flask 多对多表查询功能
2017/06/25 Python
python-str,list,set间的转换实例
2018/06/27 Python
python3.5绘制随机漫步图
2018/08/27 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
Form表单及django的form表单的补充
2019/07/25 Python
python3 xpath和requests应用详解
2020/03/06 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
机械专业应届生求职信
2013/12/12 职场文书
贷款担保申请书
2014/05/20 职场文书
辩护词范文大全
2015/05/21 职场文书
2015年中秋寄语
2015/07/31 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
Python使用openpyxl模块处理Excel文件
2022/06/05 Python