base image -> key-pair/user -> instance (처음 배포시 패키지가 설치된 상태로 배포되도록 : httpd, sysstat, mariadb)
AWS -> 컨테이너 클러스터링 기술 (EKS, ECS)
for test in a b c d do echo ${test} done
for test in /root/* do done
for (( i=1; i <= 10; i++)) do echo $i done
while [ 1 ] <--- 참 do done
- 이중 루프내에서 루프를 종료하고 싶다면 break, 종료가 되지는 않지만 더 이상 실행하지않고 처음으로 돌아가도록 하고 싶다면 continue 를 사용할수 있다.
매개변수
- bash 에서도 명령어 다음은 매개변수다. ->고정일 수도, 가변일 수도 있다.
$0 $1 $2 ./test.sh 10 20
- $* : 전체를 하나의 데이터로 취급한다.
- $@ : 각각의 데이터를 구분하여 취급한다.
- $# : 2
- $? : 직전실행 명령의 결과(종료)코드
-> 0 만 참, 나머지는 거짓[ $? -eq 0 ]
사용자 입력 받기
- -z 문자열의 길이가 0인 경우 (-z $VALUE와 같이 씀)
- -n 문자열의 길이가 0이 아닌 경우 (-n $VALUE와 같이 씀)
echo -n "당신의 이름은? : " read name [ -z $name ]
read -p "당신의 이름은? : " first last read -s -p "패스워드? : " password read -n1 -p "실행할까요? [y/n] : " ans
->프로그램을 중간에 일시중지 시키고 계속 진행을 요구할 경우에 사용하면 유용하다.
- awk[unix] - 자유 소프트웨어 재단 -> improved awk -> gawk(정규 표현식, 리포트, 변수정의, 프로그래밍)
[root@yangseunghyun 0728]# gawk -F: '{print $1}' /etc/passwd | head -3 [root@yangseunghyun 0728]# echo "bt" bt [root@yangseunghyun 0728]# echo "bt" | gawk '/bt/{print $0}' bt [root@yangseunghyun 0728]# echo "bts" | gawk '/bt/{print $0}' bts [root@yangseunghyun 0728]# echo "bt" | gawk '/bet/{print $0}' [root@yangseunghyun 0728]# echo "bt" | gawk '/be?t/{print $0}' bt [root@yangseunghyun 0728]# echo "bet" | gawk '/be?t/{print $0}' bet [root@yangseunghyun 0728]# echo "beet" | gawk '/be?t/{print $0}' [root@yangseunghyun 0728]# echo "beet" | gawk '/b[ae]?t/{print $0}' [root@yangseunghyun 0728]# echo "bat" | gawk '/b[ae]?t/{print $0}' bat [root@yangseunghyun 0728]# echo "bet" | gawk '/b[ae]?t/{print $0}' bet [root@yangseunghyun 0728]# echo "bt" | gawk '/b[ae]?t/{print $0}' bt [root@yangseunghyun 0728]# echo "bt" | gawk '/be+t/{print $0}' [root@yangseunghyun 0728]# echo "bet" | gawk '/be+t/{print $0}' bet [root@yangseunghyun 0728]# echo "beet" | gawk '/be+t/{print $0}' beet [root@yangseunghyun 0728]# echo "beet" | gawk '/be{2}t/{print $0}' beet [root@yangseunghyun 0728]# echo "bet" | gawk '/be{2}t/{print $0}' [root@yangseunghyun 0728]# echo "beeet" | gawk '/be[a-z]{1,2}t/{print $0}' beeet [root@yangseunghyun 0728]# echo "beet" | gawk '/be[a-z]{1,2}t/{print $0}' beet [root@yangseunghyun 0728]# echo "beeet" | gawk '/b[a-z]{1,2}t/{print $0}' [root@yangseunghyun 0728]# echo "beet" | gawk '/be[a-z]{1,2}t/{print $0}' beet [root@yangseunghyun 0728]# echo "babt" | gawk '/be[a-z]{1,2}t/{print $0}' [root@yangseunghyun 0728]# echo "babt" | gawk '/b[a-z]{1,2}t/{print $0}' babt
[root@yangseunghyun 0728]# systemctl enable mariadb --now
- 실행 후 상태 확인
[root@yangseunghyun 0728]# mysql_secure_installation
- 패스워드 설정
[root@yangseunghyun 0728]# mysql -u root -p1234
- DB 접속
MariaDB [mytest]> GRANT INSERT,SELECT,DELETE,UPDATE,CREATE ON mytest.* TO 'testuser'@'localhost' IDENTIFIED BY '1234'; MariaDB [mytest]> GRANT INSERT,SELECT,DELETE,UPDATE,CREATE ON mytest.* TO 'testuser'@'%' IDENTIFIED BY '1234';
- testuser 에게 mytest 데이터 베이스의 모든 테이블에 대한 권한을 부여
- localhost 및 모든 Ip 에서 접속할 때에 적용
MariaDB [mytest]> FLUSH PRIVILEGES;
- 권한 수정 사항을 적용
MariaDB [mytest]> CREATE TABLE employees ( empid int not null, lastname varchar(20), firstname varchar(20), salary float, primary key(empid) );
- 테이블 생성
MariaDB [mytest]> desc employees; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | empid | int(11) | NO | PRI | NULL | | | lastname | varchar(20) | YES | | NULL | | | firstname | varchar(20) | YES | | NULL | | | salary | float | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+
MariaDB [mytest]> INSERT INTO employees VALUES (1,'홍','길동',3300); MariaDB [mytest]> INSERT INTO employees VALUES (2,'김','이동',2300); MariaDB [mytest]> INSERT INTO employees VALUES (3,'박','영동',2300);
- 테이블 데이터 추가
- mkdir /usr/test 해당 디렉토리를 PATH 변수에 포함시켜라
[root@yangseunghyun 0728]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@yangseunghyun 0728]# PATH=$PATH:/usr/test [root@yangseunghyun 0728]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/test
#!/bin/bash if [ $# -ne 4 ] then echo "잘못된 입력 발견 : (사용법) -> ./test2.sh 번호 성 이름 연봉" else # 정상 입력인 경우 mysql mytest -u root -p1234 -e "insert into employees values ($1, '$2', '$3', $4)" # 데이터의 입력 결과 확인 if [ $? -eq 0 ] then echo "데이터 입력 성공" else echo "데이터 입력 실패" fi fi
[root@yangseunghyun 0728]# ./test2.sh 4 양 승현 6000 데이터 입력 성공 [root@yangseunghyun 0728]# mysql mytest -u root -p1234 -e 'select * from employees'
- 사용자 ID는 수동으로 직접 선택하지 말고, RANDOM을 이용하여 10000~20000 사이에서 선택하도록 하고 이를 DB로 전달한다.
- 단, 처음 프로그램이 실행되면 해당 번호가 DB에 존재하는지 여부를 먼저 확인하고 존재한다면 해당 번호를 ID로 하여 DB에 추가해보자.
[root@yangseunghyun 0728]# echo $RANDOM 24107 [root@yangseunghyun 0728]# echo $((RANDOM%10+1)) 1 [root@yangseunghyun 0728]# echo $((RANDOM%11+100)) -> 100부터 110까지 108 [root@yangseunghyun 0728]# echo $((RANDOM%101+200)) 204
[풀이]
[root@instructor 0728]# cat test3.sh #!/bin/bash empid='' result='' if [ $# -ne 3 ] then echo "잘못된 입력 발견 : (사용법) -> ./test2.sh 성 이름 연봉" else while [ 1 ] do empid=$((RANDOM%10001+10000)) result=$(mysql mytest -u root -p1234 -e "select empid from employees where empid='$empid'") if [ -z $result ] then mysql mytest -u root -p1234 -e "insert into employees values ($empid, '$1', '$2', $3)" echo "FINISHED" break fi continue done fi
[root@yangseunghyun 0728]# ./test3.sh 잘못된 입력 발견 : (사용법) -> ./test2.sh 성 이름 연봉 [root@yangseunghyun 0728]# ./test3.sh 양 승현 1000 FINISHED [root@yangseunghyun 0728]# mysql mytest -u root -p1234 -e 'select * from employees'
- aws에서 인스턴스 생성시 - region(a,b,c), zone(a)
- 다른 언어와 동일하게 미리 지정된 코드를 호출하여 사용하는 것이다.
- 코드를 간결하게 할 수 있다.
- 함수는 이름을 지정하고 코드에서 다시 사용할 수 있는 스크립트 코드의 블록이다.
- 함수로 묶어 놓은 스크립트 코드의 블록을 사용해야 한다면 지정해 놓은 함수의 이름을 사용하면 된다(함수호출).
함수 생성 두가지 형식
function name { commands }
(위) 코드 블록에 함수 이름을 지정하는 키워드 함수. Name 속성은 함수에 지정할 고유한 이름을 정의한다. 스크립트에서 사용자가 정의하는 함수에는 각각 고유한 이름을 지정해야 한다. Commands 는 함수를 구성하는 하나 이상의 bash 쉘 명령이다. 함수를 호출할 때 bash 쉘은 보통의 스크립트 처럼 함수에 나타나는 순서로 각 명령을 실행한다.
(아래) 다른 프로그래밍 언어에서 함수를 정의하는 방법에 가깝다. 함수 이름 뒤에 있는 빈 괄호는 함수를 정의하는 것이다. 원래의 쉘 스크립트 함수 형식과 같은 이름 지정 규칙이 적용된다.
name( ) { commands }
function name { 필요한 명령들 }
2. name() { 필요한 명령들 }
- 함수내의 변수명과 함수 밖의 변수명이 동일하다면 이는 동일한 변수일까?
test(){ a=.... #지역변수 } echo $a
- bash 는 기본적으로 동일한 변수이다
bash 는 함수내에서 사용하는 변수와 함수 밖의 변수명이 동일한 경우 이를 동일 변수로 취급한다. (다른 언어와 반대 -> global, return )
배열은 변수 하나에 다수의 값을 포함시킬 수 있는 방법.
bash 는 1차원 배열만 지원한다.
연관배열 mytest["name"]
- 일반적인 배열
[root@yangseunghyun 0728]# mytest=(one two three four five) [root@yangseunghyun 0728]# echo $mytest one [root@yangseunghyun 0728]# echo ${mytest[0]} one [root@yangseunghyun 0728]# echo ${mytest[4]} five [root@yangseunghyun 0728]# echo ${mytest[-1]} five [root@yangseunghyun 0728]# echo ${mytest[-2]} four [root@yangseunghyun 0728]# echo ${mytest[*]}
[root@yangseunghyun 0728]# mytest[2]=seven [root@yangseunghyun 0728]# echo ${mytest[*]} one two seven four five [root@yangseunghyun 0728]# unset mytest[2] [root@yangseunghyun 0728]# echo ${mytest[*]} one two four five [root@yangseunghyun 0728]# echo ${mytest[2]} . [root@yangseunghyun 0728]# echo ${mytest[4]} five [root@yangseunghyun 0728]# echo ${mytest[*]} one two four five
[root@yangseunghyun 0728]# unset mytest [root@yangseunghyun 0728]# mytest=(one two three four five) [root@yangseunghyun 0728]# echo ${mytest[1-3]} four [root@yangseunghyun 0728]# unset mytest
[root@instructor 0728]# cat mylib test10.sh
#!/bin/bash addem(){ echo $[ $1 + $2 ] } multem(){ echo $[ $1 * $2 ] }
#!/bin/bash . ./mylib value1=10 value2=20 result1=$(addem $value1 $value2) ; echo $result1 result2=$(multem $value1 $value2) ; echo $result2
[결과]
30
200
MariaDB [mylab]> desc instance; +--------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+----------------+ | num | int(11) | NO | PRI | NULL | auto_increment | <--- NULL | instancename | varchar(20) | YES | | NULL | | | instanceip | char(15) | YES | | NULL | | | cpus | smallint(6) | YES | | NULL | | | ram | smallint(6) | YES | | NULL | | <---- GB 단위 | hostname | varchar(20) | YES | | NULL | | <--- 인스턴스가 설치된 | hostcpu | float | YES | | NULL | | +--------------+-------------+------+-----+---------+----------------+
MariaDB [mylab]> grant all privileges on mylab.* to 'testuser'@'%' identified by 'test123';
MariaDB [mylab]> grant all privileges on mylab.* to 'testuser'@'localhost' identi fied by 'test123';
MariaDB [mylab]> flush privileges;
compute, control, storage, network 접속할 DB HOST : 192.168.1.199 DB NAME : mylab TABLE : instance user : testuser/test123 +--------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+----------------+ | num | int(11) <--- NULL | instancename | varchar(20) | <-- 인스턴스 이름 | instanceip | char(15) | YES | <-- 인스턴스의 사설 주소 | cpus | smallint(6) | YES | <-- 인스턴스의 CPU 개수 | ram | smallint(6) | YES | <-- 인스턴스의 메모리사이즈 <---- GB 단위 | hostname | varchar(20) | YES | <--- 인스턴스가 설치된 리눅스의 이름 | hostcpu | float | YES | <-- 호스트의 CPU 사용량. +--------------+-------------+------+-----+---------+----------------+
- 192.168.1.199에 접속하여 테이블에 인스턴스 추가해보자
[풀이]
인스턴스 생성 프로그램 설치할 이미지를 선택하세요 1. CentOS 7 2. Ubuntu 18.04 이미지 선택 : 1 인스턴스 이름 입력 : yangSHSH 설치할 인스턴스의 개수 선택 : 1 CPU 개수 선택(1~4) : 1 메모리 사이즈 선택(1~4GB) : 잘못된 입력입니다. 다시 입력하세요 [root@yangseunghyun 0728]# 1 -bash: 1: command not found [root@yangseunghyun 0728]# ./yangtest1.sh 인스턴스 생성 프로그램 설치할 이미지를 선택하세요 1. CentOS 7 2. Ubuntu 18.04 이미지 선택 : 1 인스턴스 이름 입력 : yangSHSH 설치할 인스턴스의 개수 선택 : 1 CPU 개수 선택(1~4) : 1 메모리 사이즈 선택(1~4GB) : 1 설치가 진행됩니다 WARNING No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results. [결과 안내] pls wait for Dhcp protocol yangSHSH-1 의 Ip 주소 : 192.168.122.202 현재 호스트의 CPU 사용률 : 11.77 % 설치가 완료되었습니다. 계속 진행하시려면 아무 키나 입력하세요 [root@yangseunghyun 0728]# vim yangtest1.sh echo " 잘못된 입력입니다. 다시 입력하세요" exit fi echo -n "메모리 사이즈 선택(1~4GB) : " read tempmem if [ -z $tempmem ] then echo " 잘못된 입력입니다. 다시 입력하세요" exit fi ram=$[ $tempmem * 1024 ] echo echo "설치가 진행됩니다" echo # 프로그램 설치 시작 for(( i=1; i<=count; i++)) do cp /cloud/$name /cloud/${instancename}-$i.qcow2 virt-install --name ${instancename}-$i --vcpus $vcpus --ram $ram --network network:default,model=virtio --disk /cloud/${instancename}-$i.qcow2 --import --noautoconsole > /dev/null done echo echo "[결과 안내]" echo "pls wait for Dhcp protocol" for ((j=1; j<=count; j++)) do vip=$(virsh domifaddr ${instancename}-$j | grep -v Name | gawk '{print $4}'| sed '/^$/d' | gawk -F/ '{print $1}') while [ -z $vip ] do vip=$(virsh domifaddr ${instancename}-$j | grep -v Name | gawk '{print $4}'| sed '/^$/d' | gawk -F/ '{print $1}') done echo "${instancename}-$j 의 Ip 주소 : $vip " done hostr=$(sar 1 3 | grep -v CPU | grep Average | gawk '{print $8}') hostr=$(echo "scale=2; 100 - $hostr" | bc) echo "현재 호스트의 CPU 사용률 : $hostr %" read -n 1 -p " 설치가 완료되었습니다. 계속 진행하시려면 아무 키나 입력하세요 " echo mysql mylab -h 192.168.1.199 -u testuser -ptest123 -e "INSERT INTO instance VALUES (null,'$instancename','$vip',$vcpus,$tempmem,'seunghyun',$hostr)"
#!/bin/bash # 함수 선언 diskspace(){ clear df -h } # 디스크 공간 확인 whoseon(){ clear who } # 접속자 확인 meminfo(){ clear cat /proc/meminfo } # 메모리 정보 확인 # 변수 선언 # 메인 코드 PS3="선택하세요 : " select option in "디스크공간확인" "로그인정보확인" "메모리정보확인" "종료" do case $option in 디스크공간확인) diskspace ;; 로그인정보확인) whoseon ;; 메모리정보확인) meminfo ;; 종료) break ;; *) clear echo "잘못된 입력입니다" ;; esac done clear
- mkte
[root@yangseunghyun 0728]# yum -y install dialog
[root@yangseunghyun 0728]# dialog --title test --msgbox "hello all" 0 0
[root@yangseunghyun 0728]# dialog --title "선택해주세요" --yesno "is it OK?" 10 20
[root@yangseunghyun 0728]# dialog --title "name" --inputbox "what is your name?" 10 20
[root@yangseunghyun 0728]# dialog --title "name" --inputbox "what is your name?" 10 20 2> name.txt
[root@yangseunghyun 0728]# name=$(cat name.txt) [root@yangseunghyun 0728]# echo $name 양승현
[root@yangseunghyun 0728]# dialog --textbox name.txt 10 20
2번 선택 [root@yangseunghyun 0728]# dialog --title "test tile" --menu "what is your favorite sports?" 0 0 0 1 "baseball" 2 "football" 3 "running" 2> sports.txt [root@yangseunghyun 0728]# cat sports.txt 2
[root@yangseunghyun 0728]# dialog --title "파일선택" --fselect /root/ 5 5 2> dd.txt
#!/bin/bash
clear
echo -e "\t\t\t인스턴스 생성 프로그램 "
echo
echo "설치할 이미지를 선택하세요"
echo "1. CentOS 7"
echo "2. Ubuntu 18.04"
echo
echo -n "이미지 선택 : "
read name
if [ -z $name ]
then
echo "이미지를 선택하지 않았습니다. 프로그램이 종료됩니다"
exit
elif [ $name -eq 1 ]
then
name="CentOS7-Base.qcow2"
elif [ $name -eq 2 ]
then
name="Ubuntu1804.qcow2"
else
echo "잘못된 번호를 선택했습니다. 프로그램이 종료됩니다"
exit
fi
echo
echo -n "인스턴스 이름 입력 : "
read instancename
cp /cloud/{instancename}.qcow2
echo
echo -n "CPU 개수 선택(1~4) : "
read vcpus
echo
echo -n "메모리 사이즈 선택(1~4GB) : "
read tempmem
ram=$(expr $tempmem * 1024 )
echo
echo "설치가 진행됩니다"
virt-install --name instancename --vcpus $vcpus --ram $ram --network network:default,model=virtio --disk /cloud/{instancename}.qcow2 --import --noautoconsole > /dev/null
#확인
virsh list --all
sleep 5
while [ 1 ]
do
var1=(virsh domifaddr ${instancename} | grep -v Name | gawk '{print $4}' | sed '/^/d' | gawk -F/ '{print $1}')
if [ -z $vmip ]
then
echo -n "#"
else
echo " 설치가 완료되었습니다"
break
fi
sleep 2
done
var2=$(sar 1 3 | tail -1 | gawk '{print 100-$8}') # cpu 사용량 확인
sleep 5
mysql -h 192.168.1.199 mylab -u testuser -ptest123 -e "insert into instance values (NULL,'var1',tempmem,'var2)"
:)