리눅스 쉘 기본 정리 5

양승현·2022년 7월 29일
0

linux

목록 보기
13/20
bash 에서의 함수
사용자 함수 만들기
function name {
	명령
}

name() {
	명령
}
  • 함수는 반드시 입력과 출력이 있는 것은 아니다.

  • $? -> 직전 명령의 실행 결과 코드

  • bash 에서는 함수내에서의 변수와 함수 밖에서의 변수가 동일한 이름을 사용하면 이는 동일한 변수다. 기본이 전역이다.
  • 만약 이를 지역으로 전환하고자 한다면 local 을 앞에 붙인다.
    (다른 언어와는 반대로 생각해야 함)

/tmp 디렉토리에 임시파일 만들기 -> mktemp

메뉴 만들기

  • dialog --menu "select one# menu -> 1. 2. 3. " 10 20 1 "test1" 2 "test2" 3 "test3" 2> result.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
  • 가상머신 만들기를 한다면 while 내에서 메뉴를 띄운다.
spec 을 선택하세요
[ * ]  m1.small       1 vcpu , 1 GB RAM
[   ]  m1.medium   2 vcpus, 2 GB RAM

m1.small  

case 
m1.small)
	vcpu=1
	ram=1024
	dialog --msgbox "CPU : $vcpu 개, RAM : $ram MB 를 선택하셨습니다"

[ lab1 > 간단한 메뉴로 파일 내용 보여주기 ]

[root@yangseunghyun 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

[KVM 관리 매니저]

  • 가상머신 리스트 출력하기 : virsh list --all => file 에 저장

  • 가상네트워크 리스트 출력하기 : virsh net-list --all => file 에 저장

  • 가상머신 만들기 => OS 선택 -> VM 이름 -> flavor 선택 (cpu/memory 세트) -> 변수 받아서 인스턴스 설치되도록 한다.

[기본틀]

#!/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" "센토스 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 $vmnet 2> /dev/null
rm -rf $flavor 2> /dev/null

설치 :
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

Quzi. 메뉴만들기

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

  • 참고로 삭제 명령은 다음과 같다.
    virsh destroy gildong 로 종료후,
    virsh undefine gildong --remove-all-storage 로 삭제(디스크 포함)

rmlist=$(mktemp -t test.XXX)
rmnumber=$(mktemp -t test.XXX)

rmvm() {
		echo "" > $rmlist
		vmlist=$(virsh list --all | grep -v "Name" | gawk '{print $2}' | sed '/^$/d')
      
        for i in $vmlist
        do
        	echo "$i '$i' OFF" >> $rmlist
        done
		loglist=$(cat $rmlist)
     
        dialog --title "가상머신 삭제하기" --radiolist "삭제할 가상머신을 선택하세요." 0 0 0 $loglist 2>$rmnumber

        if [ $? -eq 0 ]
        then
		dialog --yesno "가상머신을 삭제하시겠습니까?" 0 0
        	 if [ $? -eq 0 ]
             then
             		rmvm=$(cat $rmnumber)
             		virsh destroy $rmvm
                    virsh undefine $rmvm --remove-all-storage
                   
                    if [ $? -eq 0 ]
                    then
               				dialog --msgbox "가상머신을 삭제하였습니다" 0 0
                    fi
			 fi
        fi
}
rm -rf $rmlist 2> /dev/null
rm -rf $rmnumber 2> /dev/null


구분					|		KVM1				|		KVM2			|		KVM3			|
용도					|		compute				|		compute			|		Storage			|
CPU					|		4cores				|		4cores			|		2cores			|
RAM					|		4GB					|		4GB				|		2GB				|
외부(vmnet10)		|		211.183.3.101	    |		211.183.3.102	|		211.183.3.100	|
마이그레이션(vmnet10)	|		172.16.1.101		|		172.16.1.102	|		172.16.1.100	|
storage연결			|		172.16.2.101		|		172.16.2.102	|		172.16.2.100	|
관리용(vmnet10)		|		172.16.3.101		|		172.16.3.102	|		172.16.3.100	|
디스크용량			|		20GB				|		20GB			|		120GB			|

0개의 댓글