1. 程式人生 > >python運維實戰--LVM創建和在線擴容

python運維實戰--LVM創建和在線擴容

tor sel pytho sting info vgcreate physical eat sda

python運維實戰--LVM創建和在線擴容

LVM有關概念和操作

  • CentOS LVM卷轉變成普通卷操作步驟
  • linux 縮減文件系統大小 LVM
  • linux7創建邏輯卷lv報錯問題

說明??:有關LVM詳細概念,請各位大佬自行百度,谷歌。。這裏不做重點介紹。

這個python腳本能做什麽

創建LVM

  • 指定具體磁盤進行分區,這裏定義分區號1
  • 刷新分區,不需要reboot系統
  • 創建pv
  • 創建vg
  • 創建lv
  • 格式化,ext4/xfs
  • 創建掛載目錄
  • 將文件系統信息寫到 /etc/fstab
  • 使用 mount -a 自動掛載

在線擴容vg/lv

  • 磁盤分區
  • 刷新分區信息
  • 創建pv
  • 在線擴容vg
  • 在線擴容lv
  • 擴容後容量刷新

python 腳本信息

#!/usr/bin/env python
# coding=utf-8

__author__ = "wutengfei"
__email__ = "[email protected]"
__status__ = "Production"
__version__ = "1.0"

from optparse import OptionParser
from subprocess import Popen, call, PIPE
from shlex import split
from commands import getstatusoutput
from os import mkdir
from os.path import basename , normpath
import time

parser = OptionParser()
parser.add_option(‘-d‘, ‘--drive‘, dest=‘drive‘, help=‘this is the name of the drive like sda, hdd etc..‘)
parser.add_option(‘-f‘, ‘--folder‘, dest=‘folder‘, help=‘this is the name of the directory like /data or /var/log‘)
parser.add_option(‘-t‘, ‘--fstype‘, dest=‘fstype‘, help=‘this is the type of filesystem you need like ext4 or xfs‘)
(opts,args) = parser.parse_args()

class FormatDriver(object):
    """
    This is a class that does end to end create partition, deal with lvm, make filesystem, extend filesystem, write to fstab and resize filesystem
    """
    def __init__(self,drive,folder,fstype):
        self.drive = str(drive)
        self.folder = str(folder)
        self.fstype = str(fstype)

    def fdisk(self):
        """
        this is a definition to perform fdisk the drive in the argument
        """
        before_pipe_cmd = ‘echo -e "n\np\n1\n\n\nt\\n8e\nw"‘
        before_pipe_args = split(before_pipe_cmd)
        after_pipe_cmd = "fdisk /dev/%s" % self.drive
        after_pipe_args = split(after_pipe_cmd)
        p1 = Popen(before_pipe_args, stdout=PIPE)
        p2 = call(after_pipe_args, stdin=p1.stdout)

    def partprobe(self):
        """
        this function performs the partprobe
        """
        pprobe = "partprobe"
        pprobe1 = split(pprobe)
        part = call(pprobe1)

    def pvcreate(self):
        """
        This function creates the physical volume
        """
        pvcreate = call(["pvcreate", "/dev/%s1" %self.drive])

    def volgroup(self):
        """
        This function creates the physical volume and also created the volume group
        """
        vgcreate = ‘vgcreate -v vg_%s /dev/%s1‘ % (basename(normpath(self.folder)), self.drive)
        status, output = getstatusoutput(vgcreate)

    def lvm(self):
        """
        This function creates the logical volume
        """
        lvcreate = ‘lvcreate -v -l "100%FREE" -n lv_{0} vg_{1}‘.format(basename(normpath(self.folder)),
                                                                       basename(normpath(self.folder)))
        status, output = getstatusoutput(lvcreate)
        print status
        print output

    def makefs(self):
        ‘‘‘This functions creates the filesystem on the /dev/mapper LVM device‘‘‘
        if self.fstype == ‘ext4‘:
            mkfs = call(["mkfs.ext4", "/dev/mapper/vg_%s-lv_%s" % (
            basename(normpath(self.folder)), basename(normpath(self.folder)))])
        elif self.fstype == ‘xfs‘:
            mkfs = call(["mkfs.xfs", "/dev/mapper/vg_%s-lv_%s" % (
            basename(normpath(self.folder)), basename(normpath(self.folder)))])

    def makedir(self):
        ‘‘‘This function makes directory inthe /root level‘‘‘
        path = "%s" % self.folder
        mkdir(path, 0755)
        print ‘%s is created‘ % path

    def write_to_fstab(self):
        ‘‘‘This function appends the filesystem info to the /etc/fstab‘‘‘
        if self.fstype == ‘ext4‘:
            string = ‘/dev/mapper/vg_%s-lv_%s     %s           ext4    defaults        1 1‘ % (
            basename(normpath(self.folder)), basename(normpath(self.folder)), self.folder)
            f = open("/etc/fstab", ‘a‘)
            f.write(string + "\n")
            f.close()
        elif self.fstype == ‘xfs‘:
            string = ‘/dev/mapper/vg_%s-lv_%s     %s           xfs    defaults        1 1‘ % (
            basename(normpath(self.folder)), basename(normpath(self.folder)), self.folder)
            f = open("/etc/fstab", ‘a‘)
            f.write(string + "\n")
            f.close()

    def filesystem_mount(self):
        ‘‘‘This is a simple function to mount all the drive‘‘‘
        fsmount = ‘mount -a‘
        status, output = getstatusoutput(fsmount)

    def resizefs(self):
        ‘‘‘ This method is to resize an existing filesystem‘‘‘
        if self.fstype == ‘ext4‘:
            rs = ‘resize2fs /dev/vg_%s/lv_%s‘ % (basename(normpath(self.folder)), basename(normpath(self.folder)))
            status, output = getstatusoutput(rs)
        elif self.fstype == ‘xfs‘:
            rs = ‘xfs_growfs /dev/vg_%s/lv_%s‘ % (basename(normpath(self.folder)), basename(normpath(self.folder)))
            status, output = getstatusoutput(rs)

    def extend_vg(self):
        ‘‘‘Extending volume group‘‘‘
        vgextend = ‘vgextend vg_%s /dev/%s1‘ % (basename(normpath(self.folder)), self.drive)
        status, output = getstatusoutput(vgextend)

    def extend_lv(self):
        ‘‘‘Extending logical volume‘‘‘
        lvextend = call(["lvextend", "-l", "+100%FREE",
                         "/dev/vg_%s/lv_%s" % (basename(normpath(self.folder)), basename(normpath(self.folder)))])

def main():
    x = FormatDriver(opts.drive, opts.folder, opts.fstype)
    intake = raw_input("Do you want to extend of create a new filesystem ? please enter ‘extend‘ or ‘create‘:")
    if intake == ‘create‘:
        print "a new drive has been created"
        x.fdisk()
        x.partprobe()
        x.pvcreate()
        time.sleep(5)
        x.volgroup()
        time.sleep(5)
        x.lvm()
        x.makefs()
        x.makedir()
        x.write_to_fstab()
        x.filesystem_mount()
    elif intake == ‘extend‘:
        print "a drive has been extended"
        x.fdisk()
        x.partprobe()
        x.pvcreate()
        x.extend_vg()
        x.extend_lv()
        x.resizefs()

if __name__ == ‘__main__‘:
    if opts.drive == None or opts.folder == None or opts.fstype == None:
        parser.print_help()
        exit(-1)

main()
print ‘The root folder is %s‘ % opts.folder
print ‘the drive is %s‘ % opts.drive
print ‘The fstype is %s‘ % opts.fstype

腳本執行情況

實戰創建LVM

# python test.py -d sdb -f /data1 -t ext4
Do you want to extend of create a new filesystem ? please enter ‘extend‘ or ‘create‘:create
a new drive has been created
歡迎使用 fdisk (util-linux 2.23.2)。
....
/data1 is created
The root folder is /data1
the drive is sdb
The fstype is ext4

說明??:如果執行腳本時不使用任何參數,則會提示幫助信息,如:

# python test.py 
Usage: test.py [options]

Options:
  -h, --help            show this help message and exit
  -d DRIVE, --drive=DRIVE
                        this is the name of the drive like sda, hdd etc..
  -f FOLDER, --folder=FOLDER
                        this is the name of the directory like /data or
                        /var/log
  -t FSTYPE, --fstype=FSTYPE
                        this is the type of filesystem you need like ext4 or
                        xfs

python運維實戰--LVM創建和在線擴容