- https://hub.docker.com/ : 도커 허브 계정
사용자 함수 만들기 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 를 선택하셨습니다"
[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
가상머신 리스트 출력하기 : 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
- 가상머신 삭제를 생성하고
해당 메뉴로 들어가면, 생성된 가상머신들의 리스트가 보인다. 이때, 리스트를 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 |