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 相关文章推荐
wxPython窗口的继承机制实例分析
Sep 28 Python
python操作列表的函数使用代码详解
Dec 28 Python
Python模块文件结构代码详解
Feb 03 Python
更换Django默认的模板引擎为jinja2的实现方法
May 28 Python
python3之模块psutil系统性能信息使用
May 30 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
May 23 Python
Python celery原理及运行流程解析
Jun 13 Python
python实现自动清理重复文件
Aug 24 Python
python爬取豆瓣电影TOP250数据
May 23 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 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
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
JavaScript 继承详解 第一篇
2009/08/30 Javascript
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
2017/05/12 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
vue绑定设置属性的多种方式(5)
2017/08/16 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
Python中的变量和作用域详解
2016/07/13 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
python matplotlib画图实例代码分享
2017/12/27 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
pytorch 模型可视化的例子
2019/08/17 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
python全栈开发语法总结
2020/11/22 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
地理科学专业毕业生求职信
2013/10/15 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
邀请函样本
2015/02/02 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle