티스토리 뷰

Xenserver

XCP-NG Xen Server VM Backup for Python

Network && Devops 2024. 2. 2. 23:30
반응형

XCP-ng 는 회사에서도 무료로 사용할 수 있는 하이퍼바이저 입니다. 
템플릿을 활용한 OS 설치 및  배포, 라이브 마이그레이션도 지원하는 무료이지만 많은 기능을 제공하고 있어서 오랬동안 유용하게 사용하고 있습니다. 
이번 글은  Python을 이용하여 가상화 장비 VM을 백업하는 스크립트 입니다.
XCP-NG 8.2 를 사용하고 있으며, Python 2.x 버전을 기준으로 작성하였습니다. 

반응형
# -*- coding: utf-8 -*-
import socket
import os
from datetime import datetime
import re
import subprocess


def run(cmd):
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = p.communicate()
    if out:
        ## 성공
        t = 1
        result = out.decode('utf-8')
    else:
        ## 실패
        t = 2
        result = err.decode('utf-8')
    return (t, result)


def write_log(path, logmsg):
    log_path = path + "log/"

    if not os.path.isdir(log_path):
        os.mkdir(log_path)

    logfile = Date + "_backup.log"

    f = open(log_path + logfile, "w")
    f.write(logmsg)
    f.close()


def now_date():
    from datetime import datetime
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")


hostname = socket.gethostname()
Date = datetime.now().strftime("%Y-%m-%d")
mountpath = "/mnt/backup/"   ## 마운트할 xen서버 머신 디랙토리
nfs_path = "nfs_ip:/xenbackup"  ## NFS 스토리지 저장소 위치

cmd = "mount -t nfs " + nfs_path + " " + mountpath
run(cmd)

path = "/mnt/backup/" + hostname + "/"
if not os.path.isdir(path):
    os.mkdir(path)

##hostuuid 값 추출
cmd = '''xe host-list name-lb_name=''' + hostname + ''' | grep uuid | cut -d":" -f2 | xargs'''
value = run(cmd)
if value[0] == 1:
    hostuuid = re.sub("\n", "", value[1])
else:
    logmsg = hostname + "XEN HOSTUUID가 없습니다."
    write_log(path, logmsg)

backupmsg = []


##vmlist uuid 추출 : VM 서버 중에 xenbackup tag가 있는 리스트 추출
cmd = '''xe vm-list is-control-domain=false is-a-snapshot=false resident-on=''' + hostuuid + ''' tags:contains="xenbackup" | grep uuid | cut -d":" -f2'''
value = run(cmd)
value = re.sub(" ", "", value[1])
vmuuids = value.split("\n")


for row in vmuuids:

    cmd = "xe vm-list uuid=" + row + " | grep name-lb_name | cut -d':' -f2 | sed 's/^ *//g'"
    value = run(cmd)
    if value[0] == 1:
        vmname = re.sub("\n", "", value[1])
    else:
        continue

    ## 스냅샷 생성
    cmd = "xe vm-snapshot uuid=" + row + " new-name-lb_name='SNAPSHOT_" + vmname + "_" + Date + "'"
    value = run(cmd)
    if value[0] == 1:
        SNAPUUID = re.sub("\n", "", value[1])
    else:
        logmsg = re.sub(" \n", "", value[1])
        backupmsg.append(now_date() + " 백업 실패\n 사유 : 스냅샷 생성 실패\n Error : " + str(logmsg) + "\n\n")
        continue

    ## Set flags on the snapshot
    cmd = "xe template-param-set is-a-template=false ha-always-run=false uuid=" + SNAPUUID
    run(cmd)

    ##기존 백업파일 이름 변경 
    filename = path + vmname + ".xva"
    bakfile = path + vmname + "_old.xva"
    if os.path.isfile(filename):
        os.rename(filename, bakfile)

    ## 스냅샷에서 백업 파일 생성
    cmd = "xe vm-export vm=" + SNAPUUID + " filename='" + filename + "'"
    value = run(cmd)
    if value[0] == 1:
        result = re.sub("\n", "", value[1])
        backupmsg.append(now_date() + " 백업 완료\n\n") 


    else:
        vm_e_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        logmsg = re.sub(" \n", "", value[1])
        ## 스냅샷 파일 삭제
        run("xe snapshot-uninstall snapshot-uuid=" + SNAPUUID + " force=true")
        os.rename(bakfile, filename)
        continue

    ## 스냅샷 파일 삭제
    run("xe snapshot-uninstall snapshot-uuid=" + SNAPUUID + " force=true")

    if os.path.isfile(bakfile):
        os.remove(bakfile)
 
 
backupresult = ' '.join(backupmsg)


write_log(path, backupresult)  ## 백업 결과 로그 저장
cmd = "umount " + mountpath   ## NFS 스토리지 마운트 해제
run(cmd)
반응형

xenbackup 태그를 가진 vm을 백업하며, 스냅샷을 생성 후 스냅샷일 이용해 백업을 하는 방식입니다. 
별도의 NFS 스토리지에 마운트후 백업을 하며, 적절한 NFS 경로 수정후 사용하시면 됩니다. 

반응형
반응형

'Xenserver' 카테고리의 다른 글

Xen Server Bootoption 설정.  (0) 2016.08.29
Adding Ubuntu 16.04 LTS Template in XenServer 6.2  (0) 2016.08.29
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함