# -*- coding: UTF-8 -*-
import subprocess
def execute_cmd(cmd):
    p=subprocess.Popen(cmd,shell=True,stdin=subprocess.PIPE,stderr=subprocess.PIPE,stdout=subprocess.PIPE)
    stdout,stderr=p.communicate()
    if p.returncode != 0:
        return  p.returncode ,stderr
    return  p.returncode,stdout


if __name__ == '__main__':
    #卸载apps
    code_kube,kubelet=execute_cmd("systemctl stop kubelet")
    if code_kube == 0:
        code_dockerrm,dockerm=execute_cmd(" for i in $(docker ps | awk '{print $1}' | tail -n +2) ; do docker stop $i ; done")
        if code_dockerrm ==0:
            execute_cmd("systemctl stop docker")
            execute_cmd("systemctl disable docker ")
            execute_cmd("systemctl disable kubelet")
            print("备份目录")
            code_apps,apps=execute_cmd("cp  -a /apps /apps.bak")
            if code_apps ==0:
                execute_cmd('sed -i "s/^[^#].*apps/#&/g" /etc/fstab')
                #execute_cmd("reboot")
            else:
                print("备份有问题,apps")

        else:
            print("容器没有关闭完",dockerm)

    else:
        print(kubelet)

    #扩容apps目录
    execute_cmd("lvextend -L 30720G  /dev/vg1/lv_apps")

 

2.

"""
卸载apps,重新挂载新的/dev/sdb上
通过parted,kvm创建挂载盘
"""
# -*- coding: UTF-8 -*-
import subprocess
#执行shell命令
def execute_cmd(cmd):
    p=subprocess.Popen(cmd,shell=True,stdin=subprocess.PIPE,stderr=subprocess.PIPE,stdout=subprocess.PIPE)
    stdout,stderr=p.communicate()
    if p.returncode != 0:
        return  p.returncode ,stderr
    return  p.returncode,stdout

#stop apps ,umount apps
def stop_apps(code,result):
    if code_kube == 0:
        code_dockerrm,dockerm=execute_cmd(" for i in $(docker ps | awk '{print $1}' | tail -n +2) ; do docker stop $i ; done")
        if code_dockerrm ==0:
            execute_cmd("systemctl stop docker")
            execute_cmd("systemctl disable docker ")
            execute_cmd("systemctl disable kubelet")
            execute_cmd('for i in $(df -h |grep "/apps/data" | awk "{print $6}"); do umount $i; done')
            kill_lsof_code,kill_lsof=execute_cmd("for i in `lsof |  grep apps | awk '{print $2}'` ;do kill -9 $i; done")
            print(kill_lsof_code,kill_lsof)
            print("备份目录")
            code_apps,apps=execute_cmd("cp  -a /apps /apps.bak")
            #前面执行过一次,实际测试还是有没有删除的进程,多删除次
            execute_cmd("for i in `lsof |  grep apps | awk '{print $2}'` ;do kill -9 $i; done")
            if code_apps ==0:
                execute_cmd('sed -i "s/^[^#].*apps/#&/g" /etc/fstab')
                ####execute_cmd("reboot")
                check_mount_code,check=execute_cmd("df -h |grep apps")
                if check == "":
                    print("已经卸载")
                    return  0
                else:
                    umount_code,umount=execute_cmd("umount /apps")
                    if umount_code == 0 :
                        print("卸载成功")
                        return 0
                    else:
                        print("卸载失败")
                        return 1
            else:
                print("备份有问题,apps")
                return 1
        else:
            print("容器没有关闭完",dockerm)
            return 1
    else:
        print(kubelet)
        return 1
#kvm parted
def kvm(dev_var):
    print("parted")
    parted_code,parted=execute_cmd("parted " + dev_var + " 'mklabel gpt'    yes")
    #if parted_code == 0:
    pri_code,pri=execute_cmd('echo "Ignore" | parted ' + dev_var + ' "mkpart primary xfs 0% 100%"')
    if pri_code == 0:
        print("vgcreate")
        vgcreate_code,vgcreate=execute_cmd("vgcreate vg1 " + dev_var + "1 -y")
        if vgcreate_code ==0:
            lvcreate_code,lvcreate=execute_cmd("lvcreate -L 30T  -n lv_apps vg1  ")
            if lvcreate_code ==0:
                print("lvcreate")
                execute_cmd("mkfs.xfs /dev/vg1/lv_apps")
            else:
                print("lvcreate异常",lvcreate)
                exit()
        else:
            print("vgcreate异常",vgcreate)
            exit()
    else:
        print("parted异常",pri)
        exit()

    # else:
    #     print("parted异常1",parted)
    #     exit()

    #挂载
    # execute_cmd("echo '/dev/mapper/vg1-lv_apps /apps xfs defaults 0 0'>> /etc/fstab")
    # execute_cmd("mount /dev/mapper/vg1-lv_apps /apps")
    # execute_cmd("chown apps:apps /apps")
    # execute_cmd("chmod 775 /apps")

#mount apps
def mount_apps():
    dev_var = execute_cmd("blkid |grep vg1-lv_apps |awk '{print $1}' |sed 's/://g'")
    print(dev_var[1].split()[0])
    mount = "echo " + dev_var[1].split()[0] + " /apps                   xfs     defaults        0 0 >> /etc/fstab"
    print(mount)
    execute_cmd(mount)
    mount_code, mount = execute_cmd("mount -a")
    if mount_code ==0:
        print("挂载成功")
        return 0
    else:
        print("挂载失败",mount)
        return 1

#恢复数据,启动服务,修改权限
def recover_data():
    execute_cmd("cp -a /apps.bak/* /apps/")
    execute_cmd("chmod 775 /apps")
    execute_cmd("chown apps:apps /apps")
    execute_cmd("systemctl enable docker ")
    execute_cmd("systemctl enable kubelet ")
    execute_cmd("systemctl start docker")
    execute_cmd("systemctl start kubelet")
    status_docker_code,status_docker=execute_cmd("systemctl start docker")
    print(status_docker,status_docker_code)

if __name__ == '__main__':
    dev="/dev/sdb" #
    kvm(dev)
    code_kube, kubelet = execute_cmd("systemctl stop kubelet")
    result=stop_apps(code_kube, kubelet)
    if result ==0:
        result_mount=mount_apps()
        if result_mount == 0:
            recover_data()
    else:
        print("请先卸载")
View Code