python常用運維指令碼例項小結
阿新 • • 發佈:2020-02-15
一、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),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,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,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,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,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',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')) 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",'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_LOG_POS=%s;" % (DB1,pos)) child.expect('none') child.sendline( 'start slave;' ) child.interact() child.close() def main(): repo() mariadb() db2() if __name__ == '__main__': main()
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。