• Linux运维常用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()
    
  • 相关阅读:
    C#使用表达式树实现对象复制
    用vbs将字符串复制到剪贴板
    C# 动态获取程序集信息
    关于ftp的主动模式(Active Mode)和被动模式(Passive Mode)
    %userprofile%\Local Settings文件夹拒绝访问怎么办
    在Winform框架的多文档界面中实现双击子窗口单独弹出或拖出及拽回的处理
    ABP VNext框架基础知识介绍(1)框架基础类继承关系
    ABP开发框架中分页查询排序的实现处理
    Vue&Element开发框架中增加工作流处理,工作流的各个管理页面的界面处理
    基于ABP开发框架的技术点分析和项目快速开发实现
  • 原文地址:https://www.cnblogs.com/fusheng11711/p/12290990.html
Copyright © 2020-2023  润新知