Python

[Python] 멀티패스 설정 스크립트

ping핑이 2025. 3. 2. 14:14
반응형

온프레미스에서 이중화를 다루다보면 멀티패스를 사용하는 경우가 많은데 생각보다 설정하기 번거로울때가있다.

내가 직접 파이썬 코드를 작성해서 좀 더 빠르게 설정 할 수 있도록 해봤습니다.

 

VM에서 테스트는 완료 되었고 실제 환경에서도 사용해 봐야겠습니다.

 

주의 할 점

- /etc/multipath.conf 의 마지막 블록이 multipaths{} 이어야 합니다!

import subprocess
## variable
info_scsi = subprocess.Popen(["lsscsi", "-is"],stdout=subprocess.PIPE)
info_scsi_wwid = subprocess.Popen(["awk","{print $8}"],stdin=info_scsi.stdout, stdout=subprocess.PIPE,text=True)
wwid_lines, _ = info_scsi_wwid.communicate()
info_scsi.stdout.close()
info_scsi_wwid.stdout.close()

info_scsi = subprocess.Popen(["lsscsi", "-is"],stdout=subprocess.PIPE)
info_scsi_wwid_size = subprocess.Popen(["awk","{print $8 , $9}"],stdin=info_scsi.stdout, stdout=subprocess.PIPE,text=True)
size_lines, _ = info_scsi_wwid_size.communicate()

info_scsi.stdout.close()
info_scsi_wwid_size.stdout.close()

hostname = subprocess.run(["hostname"],capture_output=True,text=True).stdout.strip()

parsed_scsi = []
selected_scsi=[]
number = []
count = 1
file_path = "/etc/multipath.conf"

# Write multipath block
def write_contents(wwid,alias,file):
    with open(file, "a") as f:
        f.write(f"""
            multipath{{
                wwid  {selected_scsi[i]}
                alias {array_of_alias[i]}
            }}  
        """
        )
    f.close()

# Check multipaths{} in file
def check_no_multipaths(file):
    with open(file, "r") as f:
        content = f.read()
        if "multipaths{" not in content:
            f.close()
            return 1
        else:
            f.close()
            return 0

# Erase last line
def erase_last_closing_brace(file):
    with open(file, "r") as f:
        lines = f.readlines()
    with open(file, "w") as f:
        for line in lines[:-1]:
            f.write(line)

# Show colunm of wwid and size.
for line in size_lines.strip().split("\n"):
    print("{}. ".format(count)+line)
    count+=1

# Make wwid array
for line in wwid_lines.strip().split("\n"):
    parsed_scsi.append(line)

number = input("Input number what you want (parsed by space): ").split()
num =[int(i)for i in number]

print("\nyou choose these wwid\n")
for i in num:
    print (parsed_scsi[i-1])
    selected_scsi.append(parsed_scsi[i-1])

name_of_alias = input("\nInput alias for multipath: hostname")
array_of_alias = []

for i in range(1,len(num)+1,1):
    array_of_alias.append(hostname+name_of_alias+str(i).zfill(2))

for i in range(0,len(num),1):
        print("\nthis will be written to /etc/multipath.conf in append mode.\n")

        print(f"""multipath{{
            wwid  {selected_scsi[i]}
            alias {array_of_alias[i]}
        }}"""
        )

        if (i==0 and check_no_multipaths(file_path)):
            with open(file_path, "a") as f:
                f.write("multipaths{")
                f.close()
        elif i==0:
            erase_last_closing_brace(file_path)

        answer = input("Are you sure?[y/n]")

        if answer=="y":
            write_contents(selected_scsi[i],array_of_alias[i],file_path)

        if i==len(num)-1:
            with open(file_path, "a") as f:
                f.write("}")
                f.close()

print("Writing Complete!! please check /etc/multipath.conf and reload multipath.")

 

궁금한 점 이나 개선 할 점은 댓글 부탁드립니다.

반응형