python常用运维脚本实例小结
一、ps可以查看进程的内存占用大小,写一个脚本计算一下所有进程所占用内存大小的和。
(提示,使用psaux列出所有进程,过滤出RSS那列,然后求和)
注:ps-ef与psaux效果一样使用随意
importos
list=[]
sum=0
str1=os.popen('psaux','r').readlines()
foriinstr1:
str2=i.split()
new_rss=str2[5]
list.append(new_rss)
foriinlist[1:-1]:
num=int(i)
sum=sum+num
print'%s:%s'%(list[0],sum)
二、一键部署lvs与keepalived
注:部署keepalived配置文件,会自动将lvs部署好,不必单独搭建,但是要下载好ipvsadm
这里单独搭建了lvs
#提前配置好免密钥登陆,与apache服务
importpexpect
importos
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-srr'.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),
'ifconfigens33:0{vip}broadcast{vip}netmask255.255.255.255up'.format(vip=vip),
'routeadd-host{vip}devens33:0'.format(vip=vip)
]
#fords_cmdinds_cmd:
rs1_cmd=[
'ansiblers1-mshell-a"ifconfiglo:0{vip}broadcast{vip}netmask255.255.255.255up"&>/dev/null'.format(vip=vip),
'ansiblers1-mshell-a"routeadd-host{vip}devlo:0"&>/dev/null'.format(vip=vip),
'ansiblers1-mshell-a"echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignore"&>/dev/null',
'ansiblers1-mshell-a"echo"2">/proc/sys/net/ipv4/conf/lo/arp_announce"&>/dev/null',
'ansiblers1-mshell-a"echo"1">/proc/sys/net/ipv4/conf/all/arp_ignore"&>/dev/null',
'ansiblers1-mshell-a"echo"2">/proc/sys/net/ipv4/conf/all/arp_announce"&>/dev/null',
'servicehttpdrestart']
#forrs_cmdinrs_cmd:
rs2_cmd=[
'ansiblers2-mshell-a"ifconfiglo:0{vip}broadcast{vip}netmask255.255.255.255up"&>/dev/null'.format(vip=vip),
'ansiblers2-mshell-a"routeadd-host{vip}devlo:0"&>/dev/null'.format(vip=vip),
'ansiblers2-mshell-a"echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignore"&>/dev/null',
'ansiblers2-mshell-a"echo"2">/proc/sys/net/ipv4/conf/lo/arp_announce"&>/dev/null',
'ansiblers2-mshell-a"echo"1">/proc/sys/net/ipv4/conf/all/arp_ignore"&>/dev/null',
'ansiblers2-mshell-a"echo"2">/proc/sys/net/ipv4/conf/all/arp_announce"&>/dev/null',
'servicehttpdrestart']
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)
defAnsible():
res=os.system('yuminstallansible-y&>/dev/null')
ifres==0:
print('ansible安装完成!')
os.system(ansible)
deflvs():
i=os.system('yum-yinstallipvsadm&>/dev/null')
ifi==0:
print('lvs下载完成')
forainds_cmd:
res=os.system(a)
ifres==0:
print('ok')
else:
print('false')
forbinrs1_cmd:
res1=os.system(b)
ifres1==0:
print('ok')
else:
print('false')
forcinrs2_cmd:
res2=os.system(c)
ifres2==0:
print('ok')
else:
print('false')
else:
print('lvs下载失败')
keepalived='''
#全局配置
!ConfigurationFileforkeepalived
#全局配置
global_defs{
notification_email{
#收件人地址
}
#邮件服务器
}
VRRP配置DS1
vrrp_instanceVI_1{
stateMASTER#角色类型MASTER|BACKUP
interfaceens33#网卡名称
virtual_router_id51#虚拟路由id(需要与BACKUP一致)
priority100#优先级
advert_int1#没1秒检查一次
#nopreempt#非抢占模式
authentication{
auth_typePASS#认证类型主备之间必须一样
auth_pass1111#认证密码主备之间必须一样
}
virtual_ipaddress{
192.168.102.250#虚拟ip(vip)
}
}
#LVS配置
virtual_server192.168.102.25080{
delay_loop3#健康检查时间间隔
lb_algorr#负载均衡调度算法
lb_kindDR#负载均衡转发规则
protocolTCP#协议
real_server192.168.102.14480{#要监控的real_server的ip和端口号
weight1#权重
TCP_CHECK{#基于tcp协议的检查
connect_timeout3#连接时间超时
retry3#重连次数
delay_before_retry3#重连间隔时间
}
}
real_server192.168.102.14580{
weight1
TCP_CHECK{
connect_timeout3
retry3
delay_before_retry3
}
}
}'''
defKeepalived():
d=os.system('yuminstallkeepalived-y&>/dev/null')
ifd==0:
print('keeplived下载完成')
withopen(r'/etc/keepalived/keepalived.conf','w',encoding='utf-8')asf:
f.write(keepalived)
e=os.system('systemctlstartkeepalived')
ife==0:
print('keepalived部署完成!')
else:
print('keepalived部署失败')
else:
print('keepalived下载失败')
defmain():
#key()
Ansible()
#ssh_copy()
lvs()
Keepalived()
if__name__=='__main__':
main()
三、用python3编写一个监控上面lvs服务状态和系统资源的脚本
importyagmail
importparamiko
importsocket
importre
importtime
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='''
topn1d1b-p1|grep'%Cpu'|awk-F","'{print$4}'|awk-F"id"'{print$1}'|awk-F"."'{print$1}'
'''
free_cmd="free-m|grepMem|awk'{print$7}'"
defconnect1():
ssh.connect('{rs1_ip}'.format(rs1_ip=rs1_ip),22,'root','1',timeout=3)
defconnect2():
ssh.connect('{rs2_ip}'.format(rs2_ip=rs1_ip),22,'root','1',timeout=3)
defmail(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()
defhttp():
socket.setdefaulttimeout(1)
server=socket.socket()
host_list=['%s:80'%(rs1_ip),'%s:80'%(rs2_ip)]
forinfoinhost_list:
ip=re.compile('(.*?):(.*)').search(info).group(1)
port=re.compile('(.*?):(.*)').search(info).group(2)
res=server.connect_ex((ip,int(port)))
ifres!=0:
mail(ip,'%s不通'%port)
defdisk():
connect1()
stdin1,stdout1,stderr1=ssh.exec_command(disk_cmd)
disk1=int(stdout1.read().decode('utf-8'))
print('%s节点disk剩余空间为%sM'%(rs1_ip,disk1))
ifdisk1<=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))
ifdisk2<=200:
mail(rs2_ip,'disk剩余空间为%sM'%disk2)
defcpu():
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))
ifcpu>=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))
ifcpu>=80:
mail(rs2_ip,'cpu使用量为%s'%cpu)
deffree():
connect1()
stdin1,stdout1,stderr1=ssh.exec_command(free_cmd)
free1=int(stdout1.read().decode('utf-8'))
print('%s节点磁盘剩余空间为%sM'%(rs1_ip,free1))
iffree1<=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))
iffree2<=200:
mail(ds_ip,'磁盘剩余空间为%sM'%free2)
defmain():
whileTrue:
http()
cpu()
free()
disk()
time.sleep(60)
if__name__=='__main__':
main()
四、用python编写一键部署数据库主从服务
主服务器
importpexpect
importos
importconfigparser
#HOSTNAME_DB1='db1'
#HOSTNAME_DB2='db2'
#DB1='192.168.254.24'
#DB2='192.168.254.27'
DBPASSWORD='1'
defrepo():
os.system('touch/etc/yum.repos.d/mariadb.repo')
withopen('/etc/yum.repos.d/mariadb.repo','w',encoding='utf8')asf:
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'))
defmariadb():
a=os.system('yuminstallMariaDB-y&>/dev/null')
ifa==0:
b=os.system('systemctlstartmariadb&>/dev/null')
ifb==0:
print('mariadb启动成功')
child=pexpect.spawn('mysql_secure_installation')
child.expect('enterfornone')
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()
defdb1():
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('systemctlrestartmariadb')
ifb==0:
#os.system('mysql-uroot-p%s'%DBPASSWORD)
#os.system("CREATEUSER'slave'@'%'IDENTIFIEDBY'slave';")
#os.system("GRANTREPLICATIONSLAVEON*.*TO'slave'@'%';")
#os.system('flushprivileges;')
#os.system('showmasterstatus')
child=pexpect.spawn('mysql-uroot-p1')
child.expect('none')
child.sendline("CREATEUSER'slave'@'%'IDENTIFIEDBY'slave';")
child.expect('none')
child.sendline("GRANTREPLICATIONSLAVEON*.*TO'slave'@'%';")
child.expect('none')
child.sendline('flushprivileges;')
child.expect('none')
child.sendline('showmasterstatus;')
child.interact()
child.close()
defmain():
repo()
mariadb()
db1()
if__name__=='__main__':
main()
从服务器
importpexpect
importos
importconfigparser
#HOSTNAME_DB1='db1'
#HOSTNAME_DB2='db2'
DB1='192.168.102.143'
#DB2='192.168.254.27'
DBPASSWORD='1'
defrepo():
os.system('touch/etc/yum.repos.d/mariadb.repo')
withopen('/etc/yum.repos.d/mariadb.repo','w',encoding='utf8')asf:
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'))
defmariadb():
a=os.system('yuminstallMariaDB-y')
ifa==0:
b=os.system('systemctlstartmariadb&>/dev/null')
ifb==0:
print('mariadb启动成功')
child=pexpect.spawn('mysql_secure_installation')
child.expect('enterfornone')
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('')
defdb2():
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('systemctlrestartmariadb')
ifb==0:
bin='mysql-bin.000001'
pos=765
#os.system('mysql-uroot-p%s'%DBPASSWORD)
#os.system('''mysql-uroot-p%s-e"CHANGEMASTERTOMASTER_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'startslave;'"%DBPASSWORD)
child=pexpect.spawn('mysql-uroot-p%s'%DBPASSWORD)
child.expect('none')
child.sendline("CHANGEMASTERTOMASTER_HOST='%s',MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_LOG_FILE='%s',MASTER_LOG_POS=%s;"%(DB1,bin,pos))
child.expect('none')
child.sendline('startslave;')
child.interact()
child.close()
defmain():
repo()
mariadb()
db2()
if__name__=='__main__':
main()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。