[클라우드 With리눅스/쉘프로그래밍(11) - dialog, 가상머신 관리 메뉴 만들기]

SooYeon Yeon·2022년 8월 30일

클라우드 With리눅스

목록 보기
36/39

dialog이용하기

yum -y install dialog

dialog 설치 이후

console 창에서

  • msgbox : 알림 용도
dialog --title test --msgbox "hello all" 10 20 # 0 0하면 꽉채워서
  • yes no : yes 또는 no 선택 가능
[root@sooyeon 0728]# dialog --title "선택하세요" --yesno "is it ok?" 10 20

# no 선택후 엔터 시
[root@sooyeon 0728]# echo $?
1

# yes 선택 후 엔터 시
[root@sooyeon 0728]# echo $?
0
  • inputbox : 사용자로부터 입력 가능
[root@sooyeon 0728]# dialog --title "name" --inputbox "what is your name?" 10 20

# cancel 선택 후 엔터 시
[root@sooyeon 0728]# echo $?
1

# ok 선택 후 엔터 시
[root@sooyeon 0728]# echo $?
0
  • 2는 표준오류(0은 표준입력 1은 표준출력 2는 표준오류)
  • 2번의 표준오류로 담긴 값을 name.txt로 저장하기때문에 입력한 내용이 name.txt에 저장됨
[root@sooyeon 0728]# dialog --title "name" --inputbox "what is your name?" 10 20 2> name.txt

[root@sooyeon 0728]# cat name.txt
홍길동
  • mktemp를 이용하면 임시파일을 만들 수 있음. 이것으로 보내면 불필요한 파일 많이 생성안해도 됨
  • t옵션: 자동으로 tmp위치에 지정
[root@sooyeon 0729]# mktemp -t test.XXX
/tmp/test.hhx
[root@sooyeon 0729]# testfile1=$(mktemp -t test.XXX)
[root@sooyeon 0729]# echo $testfile1
/tmp/test.kmM
[root@sooyeon 0729]# dialog --title "vm name" --inputbox "type virtual machine name" 10 40 2> $testfile1
  • textbox : 파일의 내용 출력하기
[root@sooyeon 0728]# dialog --textbox name.txt 10 20
  • 메뉴 만들기
[root@sooyeon 0728]# dialog --title "test title" --menu "what is your favorite sports?" 0 0 0 1 "baseball" 2 "football" 3 "running" 2> sports.txt
# 번호를 선택
[root@sooyeon 0728]# cat sports.txt
2

0(높이) 0(너비) 0(보기에서의 행)

  • 파일 select
  • space로 선택 후 엔터
[root@sooyeon 0728]# dialog --title "파일선택" --fselect $HOME/ 5 5 2>file.txt
  • radiolist : 여러개 중에 한개를 선택하도록

[ * ] centos7 linux centos version 7

[ ] ubuntu linux ubuntu version 18.04

dialog --title "Linux Dist." --radiolist "select one ! " 15 50 4 "CentOS7" "CentOS Version 7.0" ON "Ubuntu" "Ubuntu Linux version 18.04" OFF "RHEL7" "Red Hat Enterprise Linux version 7.0" OFF 2> result.txt

시스템 관리 메뉴 만들기

[root@sooyeon 0729]# cat lab1.sh
#!/bin/bash

temp=$(mktemp -t test.XXX)
ans=$(mktemp -t test.XXX)
diskspace(){
        df -h > $temp
        dialog --textbox $temp 20 60
}
whoseon() {
        who > $temp
        dialog --textbox $temp 20 50
}
memusage() {
        cat /proc/meminfo > $temp
        dialog --textbox $temp 20 50
}

vmlist(){
        virsh list --all > $temp
        dialog --textbox $temp 20 60
}

while [ 1 ]
do
dialog --menu "시스템 관리 메뉴" 20 30 7 1 "디스크 공간 확인" 2 "로그인 사용자 확인" 3 "메모리 정보 확인" 4 "가상머신 리스트 확인" 0 "종료하기" 2> $ans

# 만약 메뉴에서 ESC 선택시 프로그램 종료
if [ $? -eq 1 ]
then
        break
fi

# 메뉴 선택과 OK 선택시에는 결과에 따라 함수실행되도록 설정
select=$(cat $ans)
case $select in
1)
        diskspace ;;
2)
        whoseon ;;
3)
        memusage ;;
4)
        vmlist ;;
0)
        break ;;
*)
        dialog --msgbox "잘못된 선택입니다" ;;
esac

done

rm -rf $temp 2> /dev/null
rm -rf $ans 2> /dev/null

[root@sooyeon 0729]# systemctl stop httpd
[root@sooyeon 0729]# systemctl disable httpd

[root@sooyeon 0729]# systemctl start wokd
[root@sooyeon 0729]# systemctl enable wokd

# kvm 종료 맟 재시작
[root@sooyeon 0729]# systemctl stop libvirtd
[root@sooyeon 0729]# systemctl start libvirtd
[root@sooyeon 0729]# systemctl status libvirtd

KVM 관리 매니저

  • 가상머신 리스트 출력하기
virsh list --all # file에 저장
  • 가상네트워크 리스트 출력하기
virsh net-list --all # file에 저장
  • 가상머신 만들기

OS선택[radiolist] → VM 이름[inputbox] → flavor 선택 (cpu/memory세트) [radiolist]→ 변수 받아서 인스턴스 설치되도록

cp os/cloud/{os} /cloud/{vmname}.qcow2

[root@sooyeon 0729]# cat lab2.sh
#!/bin/bash
# 변수 선언
temp=$(mktemp -t test.XXX) # 함수 내에서 결과를 파일로 저장하기 위해
ans=$(mktemp -t test.XXX) # 메뉴에서 선택한 번호 담기위한 변수
image=$(mktemp -t test.XXX) #템플릿 이미지를 담기위한 변수
vmname=$(mktemp -t test.XXX) # 가상머신 이름 담기위한 변수
flavor=$(mktemp -t test.XXX) # CPU/RAM 세트인 flavor 정보 담기 위한 변수

# 함수 선언
# 가상머신 리스트 출력함수
vmlist(){
        virsh list --all > $temp
        dialog --textbox $temp 20 50
}

# 가상네트워크 리스트 출력함수
vmnetlist(){
        virsh net-list --all > $temp
        dialog --textbox $temp 20 50
}

# 가상머신 생성 함수
vmcreation(){
        dialog --title "이미지 선택하기" --radiolist "베이스 이미지를 아래에서 선택하세요" 15 50 5 "CentOS7" "CentOS 7 베이스 이미지" ON "Ubuntu" "우분투 20.04 베이스 이미지" OFF "RHEL" "레드햇 엔터프라이즈 리눅스 8.0" OFF 2> $image

        vmimage=$(cat $image)
        case $vmimage in
        CentOS7)
                os=/cloud/CentOS7-Base.qcow2 ;;
        Ubuntu)
                os=/cloud/Ubuntu20-Base.qcow2 ;;
        RHEL)
                os=/cloud/RHEL-Base.qcow2 ;;
        *)
                dialog --msgbox "잘못된 선택입니다" 10 40 ;;
        esac
        # OS 선택이 정상처리라면 인스턴스 이름 입력하기로 이동
        if [ $? -eq 0 ]
        then
                dialog --title "인스턴스 이름" --inputbox "인스턴스의 이름을 입력하세요 : " 10 50 2> $vmname

                # 선택된 이름을 이용해 Base 이미지로부터 새로운 볼륨 생성
                name=$(cat $vmname)
                cp $os /cloud/${name}.qcow2

                # 종료 코드가 0인 경우(OK인 경우) flavor선택으로 이동
                if [ $? -eq 0 ]
                then
                        dialog --title "스펙 선택" --radiolist "필요한 자원을 선택하세요" 15 50 5 "m1.small" "가상 CPU 1개, 메모리 1GB" ON "m1.medium" "가상 CPU 2개, 메모리 2GB" OFF "m1.large" "가상 CPU 4개, 메모리 8GB" OFF 2> $flavor
                        # flavor에 따라 변수에 cpu 개수, 메모리 사이즈 입력
                        spec=$(cat $flavor)
                        case $spec in
                        m1.small)
                                vcpus="1"
                                ram="1024"
                                dialog --msgbox "CPU: ${vcpus}core(s), RAM: ${ram}MB" 10 50 ;;
                        m1.medium)
                                vcpus="2"
                                ram="2048"
                                dialog --msgbox "CPU: ${vcpus}core(s), RAM: ${ram}MB" 10 50 ;;
                        m1.large)
                                vcpus="4"
                                ram="8192"
                                dialog --msgbox "CPU: ${vcpus}core(s), RAM: ${ram}MB" 10 50 ;;
                        esac

                        # 종료 코드가 0(OK)인 경우 설치 진행
                        if [ $? -eq 0 ]
                        then
                                virt-install --name $name --vcpus $vcpus --ram $ram --disk /cloud/${name}.qcow2 --import --network network:default,model=virtio --os-type linux --os-variant rhel7.0 --noautoconsole > /dev/null
                        fi
                                dialog --msgbox "설치가 시작되었습니다" 10 50
                fi
        fi

}
# 메인 코드
while [ 1 ]
do
        # 메인메뉴 출력하기
        dialog --menu "KVM 관리 시스템" 20 40 8 1 "가상머신 리스트" 2 "가상 네트워크 리스트" 3 "가상머신 생성" 0 "종료" 2> $ans

        # 종료 코드 확인하여 cancel이면 프로그램 종료
        if [ $? -eq 1 ]
        then
                break
        fi

        selection=$(cat $ans)
        case $selection in
        1)
                vmlist ;;
        2)
                vmnetlist ;;
        3)
                vmcreation ;;
        0)
                break ;;
        *)
                dialog --msgbox "잘못된 번호선택" 10 40
        esac
done

# 종료 전 임시 파일 삭제하기
rm -rf $temp 2> /dev/null
rm -rf $ans 2> /dev/null
rm -rf $image 2> /dev/null
rm -rf $vmname 2> /dev/null
rm -rf $flavor 2> /dev/null

Quiz

메뉴 만들기

  1. 가상머신 삭제 를 생성하고 해당 메뉴로 들어가면 생성된 가상머신들의 리스트가 보인다. 이때 리스트를 radio로 처리하고 선택된 가상머신을 삭제하는 메뉴를 생성하세요. 단, 삭제 직전에 “삭제하시겠습니까?”를 YES/NO로 물어보고 YES인 경우에 삭제 되어야 함. 삭제 시에는 디스크까지 함께 삭제되도록함

참고로 삭제 명령은 다음과 같다.

virsh destroy gildong 로 종료 후, virsh undefine gildong —remove-all-storage로 삭제(디스크 포함)

[root@sooyeon 0729]# cat lab2.sh
#!/bin/bash
# 변수 선언
temp=$(mktemp -t test.XXX) # 함수 내에서 결과를 파일로 저장하기 위해
ans=$(mktemp -t test.XXX) # 메뉴에서 선택한 번호 담기위한 변수
image=$(mktemp -t test.XXX) #템플릿 이미지를 담기위한 변수
vmname=$(mktemp -t test.XXX) # 가상머신 이름 담기위한 변수
flavor=$(mktemp -t test.XXX) # CPU/RAM 세트인 flavor 정보 담기 위한 변수

deleteans=$(mktemp -t test.XXX)
deletename=$(mktemp -t test.XXX)

namefile=$(mktemp -t test.XXX)
descriptfile=$(mktemp -t test.XXX)

# 함수 선언
# 가상머신 리스트 출력함수
vmlist(){
        virsh list --all > $temp
        dialog --textbox $temp 20 50
}

# 가상네트워크 리스트 출력함수
vmnetlist(){
        virsh net-list --all > $temp
        dialog --textbox $temp 20 50
}

# 가상머신 생성 함수
vmcreation(){
        dialog --title "이미지 선택하기" --radiolist "베이스 이미지를 아래에서 선택하세요" 15 50 5 "CentOS7" "CentOS 7 베이스 이미지" ON "Ubuntu" "우분투 20.04 베이스 이미지" OFF "RHEL" "레드햇 엔터프라이즈 리눅스 8.0" OFF 2> $image

        vmimage=$(cat $image)
        case $vmimage in
        CentOS7)
                os=/cloud/CentOS7-Base.qcow2 ;;
        Ubuntu)
                os=/cloud/Ubuntu20-Base.qcow2 ;;
        RHEL)
                os=/cloud/RHEL-Base.qcow2 ;;
        *)
                dialog --msgbox "잘못된 선택입니다" 10 40 ;;
        esac
        # OS 선택이 정상처리라면 인스턴스 이름 입력하기로 이동
        if [ $? -eq 0 ]
        then
                dialog --title "인스턴스 이름" --inputbox "인스턴스의 이름을 입력하세요 : " 10 50 2> $vmname

                # 선택된 이름을 이용해 Base 이미지로부터 새로운 볼륨 생성
                name=$(cat $vmname)
                cp $os /cloud/${name}.qcow2

                # 종료 코드가 0인 경우(OK인 경우) flavor선택으로 이동
                if [ $? -eq 0 ]
                then
                        dialog --title "스펙 선택" --radiolist "필요한 자원을 선택하세요" 15 50 5 "m1.small" "가상 CPU 1개, 메모리 1GB" ON "m1.medium" "가상 CPU 2개, 메모리 2GB" OFF "m1.large" "가상 CPU 4개, 메모리 8GB" OFF 2> $flavor
                        # flavor에 따라 변수에 cpu 개수, 메모리 사이즈 입력
                        spec=$(cat $flavor)
                        case $spec in
                        m1.small)
                                vcpus="1"
                                ram="1024"
                                dialog --msgbox "CPU: ${vcpus}core(s), RAM: ${ram}MB" 10 50 ;;
                        m1.medium)
                                vcpus="2"
                                ram="2048"
                                dialog --msgbox "CPU: ${vcpus}core(s), RAM: ${ram}MB" 10 50 ;;
                        m1.large)
                                vcpus="4"
                                ram="8192"
                                dialog --msgbox "CPU: ${vcpus}core(s), RAM: ${ram}MB" 10 50 ;;
                        esac

                        # 종료 코드가 0(OK)인 경우 설치 진행
                        if [ $? -eq 0 ]
                        then
                                virt-install --name $name --vcpus $vcpus --ram $ram --disk /cloud/${name}.qcow2 --import --network network:default,model=virtio --os-type linux --os-variant rhel7.0 --noautoconsole > /dev/null
                        fi
                                dialog --msgbox "설치가 시작되었습니다" 10 50
                fi
        fi

}

vmdelete(){
        virsh list --all  > $temp
        n=$[ $(wc -l $temp | gawk '{print $1}') - 2 ]

        word=''
        namefile=$(virsh list --all | grep -v Name | gawk '{print $2}' | sed '/^$/d')
        descriptfile=$(virsh list --all | grep -v Name | gawk '{print $3}' | sed '/^$/d')

        for line in  $namefile
        do
                word="$word $line '.' 'OFF'"
        done
        dialog --title "가상머신 선택" --radiolist "가상머신을 선택하세요" 15 50 $n $word 2> $deleteans
        deletename=$(cat $deleteans)
        dialog --title "선택하세요" --yesno "삭제하시겠습니까?" 10 20
        if [ $? -eq 0 ]
        then
                virsh destroy $deletename
                virsh undefine ${deletename} --remove-all-storage
        fi
}

# 메인 코드
while [ 1 ]
do
        # 메인메뉴 출력하기
        dialog --menu "KVM 관리 시스템" 20 40 8 1 "가상머신 리스트" 2 "가상 네트워크 리스트" 3 "가상머신 생성"  4 "가상머신 제거" 0 "종료" 2> $ans

        # 종료 코드 확인하여 cancel이면 프로그램 종료
        if [ $? -eq 1 ]
        then
                break
        fi

        selection=$(cat $ans)
        case $selection in
        1)
                vmlist ;;
        2)
                vmnetlist ;;
        3)
                vmcreation ;;
        4)
                vmdelete ;;
        0)
                break ;;
        *)
                dialog --msgbox "잘못된 번호선택" 10 40
        esac
done

# 종료 전 임시 파일 삭제하기
rm -rf $temp 2> /dev/null
rm -rf $ans 2> /dev/null
rm -rf $image 2> /dev/null
rm -rf $vmname 2> /dev/null
rm -rf $flavor 2> /dev/null

rm -rf $deleteans 2> /dev/null
rm -rf $deletename 2> /dev/null
rm -rf $namefile 2> /dev/null
rm -rf $descriptfile 2> /dev/null

0개의 댓글