반응형
온프레미스에서 이중화를 다루다보면 멀티패스를 사용하는 경우가 많은데 생각보다 설정하기 번거로울때가있다.
내가 직접 파이썬 코드를 작성해서 좀 더 빠르게 설정 할 수 있도록 해봤습니다.
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.")
궁금한 점 이나 개선 할 점은 댓글 부탁드립니다.
반응형