python常用运维脚本实例-python常用运维脚本实例小结

一、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()

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值