一、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="[email protected]", password="zz54605519", host="smtp.163.com")
yag.send("[email protected]",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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。