python運維實戰--LVM創建和在線擴容
阿新 • • 發佈:2018-09-12
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創建和在線擴容