스크립트를 통해 MySQL,Redis 자동 설치를 진행합니다.
1) 반복 작업에 대한 자동화가 가능
스케줄 설정과 같이 주기적으로 수행하는 단순한 작업에 쉘 스크립트를 활용하면 관리자가 일일이 타이핑하지 않아도 된다.
2) 기존의 명령어를 사용자만의 명령어로 보안
쉘 스크립트를 이용하여 기존의 명령어의 결과를 원하는 형태의 결과로 표시할 수 있으며, 이를 위해 입출력 재지정(redirection)을 활용하면 된다.
3) 손쉽고 빠른 개발 및 보완이 가능
운영체제의 명령어들을 잘 알고 있다면 손쉽고 빠른 개발 및 보완이 가능하다.
직접 MySQL, Redis 자동설치 쉘 스크립트를 작성해보면서 설치를 진행합니다.
# 파일 생성
touch install_mysql.sh
# 실행파일로 변경
chmod +x install_mysql.sh
본격적으로 shell script를 작성하기 이전에,,변수명으로 mysql version 받아서 출력해주는 것 예제를 통해 연습
1️⃣ 예제 1
# get user input(version) echo "What version do you want to install?" read version echo "your version is : ${version}"
2️⃣ 예제 2
# get user input(version) echo "What version do you want to install?" read version # echo "your version is : ${version}" case $version in "8") VERSION=8;; "5") VERSION=5;; "3") VERSION=3;; *) echo "error";; esac echo "${VERSION}"
2️⃣ 예제 3
# get user input(version) sh install_mysql.sh 8.0.27 echo "$1" 8.0.27
mysql 설치 쉘 스크립트 작성
#!/bin/bash
# get user input(version)
echo "What version do you want to install?"
read version
case $version in
"8.0.27") VERSION=8
IN_VERSION=https://dev.mysql.com/get/mysql80-community-release-el7-4.noarch.rpm;;
"5") VERSION=5;;
"3") VERSION=3;;
*) echo "error";;
esac
echo "installing mysql-$VERSION"
echo "==================================="
# for division
echo "===================================" >> result.txt 2> /dev/null
# >> result.txt 2> /dev/null
# touch result text
touch result.txt
# wget download
sudo yum -y install wget
# remove default mariadb
sudo yum -y erase mariadb*
# install rpm
sudo yum -y install $IN_VERSION
# install server
sudo yum -y install mysql-community-server
# start server
sudo systemctl start mysqld 2> /dev/null
# check server
sudo systemctl status mysqld 2> /dev/null
# find rootpass
ROOTPASS="`sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost: //'`"
# start with rootpass
mysql -u root --password="$ROOTPASS"
yum 의 -y 옵션 :
-y, --assumeyes answer yes for all questions
따라서 y/n 여부를 묻지 않고 install 할 시 옵션을 꼭 붙여줍시다!
shell script 작성 시 날 수 있는 오류
Bad substitution 이라는 오류 ➡️ 본인은 끝날 구문이 없는
fi
를 써주어서 오류가 남
# >> result.txt 2> /dev/null
LOG="`>> result.txt 2> /dev/null`"
# 명령어 뒤에 $LOG 붙여주면 완료
>>
명령어 사용해서 로그를 redirection, NHN CLOUD 에서서는 /var/log/cloud-init-output
에서 로그를 저장합니다.
# 파일 생성
touch install_mysql.sh
# 실행파일로 변경
chmod +x install_mysql.sh
# start => sh mysql.sh 8.0.27
#!/bin/bash
# wget download
sudo yum -y install wget
# libaio download
sudo yum -y install libaio
# remove default mariadb
sudo yum -y erase mariadb*
# user input, version
version=$1
# change to home/centos
# NHN CLOUD는 기본적으로 루트(/) 밑에 설치해니까 (/home/centos)로 경로 이동
cd /home/centos
# zip file download
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-$version-linux-glibc2.12-x86_64.tar.xz
# upzip file
tar -xvf mysql-$version-linux-glibc2.12-x86_64.tar.xz
# name change
mv mysql-$version-linux-glibc2.12-x86_64/ mysql
# go mysql
cd mysql
# my.cnf
touch my.cnf
# vi my.cnf
echo "[client]
port=3306
socket=/home/centos/mysql/mysql.sock
[mysqld]
socket=/home/centos/mysql/mysql.sock
basedir=/home/centos/mysql
datadir=/home/centos/mysql/data
user=centos
key_buffer_size=64M
max_allowed_packet=32M
#query_cache_size=32M
max_connections=2625
max_connect_errors=2000000
wait_timeout=60
explicit_defaults_for_timestamp = 1
pid-file=/home/centos/mysql/mysqld.pid
log-error=/home/centos/mysql/logs/mysqld.log
bulk_insert_buffer_size=0" > my.cnf
# make data,logs directory
mkdir data
mkdir logs
# chown
sudo chown -R centos:centos /home/centos/mysql
# initialize
/home/centos/mysql/bin/mysqld --defaults-file=/home/centos/mysql/my.cnf --initialize
# mysql root
/home/centos/mysql/bin/mysqld --defaults-file=/home/centos/mysql/my.cnf &
# 오류 발생 이후 넣어준 명령어
# sleep
sleep 3
# rootpass
ROOTPASS="`sudo grep 'temporary password' /home/centos/mysql/logs/mysqld.log | sed 's/.*root@localhost: //'`"
# mysql start
/home/centos/mysql/bin/mysql -uroot -p$ROOTPASS -S /home/centos/mysql/mysql.sock
❗️오류발생!
/home/centos/mysql/bin/mysql -uroot -p'비밀번호' -S /home/centos/mysql/mysql.sock
명령어와 관련해서 mysql 접속 오류가 납니다.
터미널에서 입력해서 실행하면 정상동작하는데 어째서일까?
위의 내용들을 주석처리하고 스크립트를 통해 임시비밀번호로 접속해도(마지막 2줄만 실행) 정상동작한다. 실행하고 연결까지의 시간이 필요한가 싶어서sleep
명령어를 통해 잠시동안 멈춰주고 실행했더니 잘 접속되었습니다.
예약 스크립트에 아래의 스크립트(최종 코드)를 추가
#!/bin/bash # wget download sudo yum -y install wget # libaio download sudo yum -y install libaio # remove default mariadb sudo yum -y erase mariadb* # change to home/centos cd /home/centos # zip file download wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz # upzip file tar -xvf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz # name change mv mysql-8.0.27-linux-glibc2.12-x86_64/ mysql # chown sudo chown -R centos:centos ./mysql # go mysql cd mysql # my.cnf touch my.cnf # vi my.cnf echo "[client] port=3306 socket=/home/centos/mysql/mysql.sock [mysqld] socket=/home/centos/mysql/mysql.sock basedir=/home/centos/mysql datadir=/home/centos/mysql/data user=centos key_buffer_size=64M max_allowed_packet=32M #query_cache_size=32M max_connections=2625 max_connect_errors=2000000 wait_timeout=60 explicit_defaults_for_timestamp = 1 pid-file=/home/centos/mysql/mysqld.pid log-error=/home/centos/mysql/logs/mysqld.log bulk_insert_buffer_size=0" > my.cnf # make data,logs directory mkdir data mkdir logs # chown sudo chown -R centos:centos /home/centos/mysql # initialize /home/centos/mysql/bin/mysqld --defaults-file=/home/centos/mysql/my.cnf --initialize # mysql root /home/centos/mysql/bin/mysqld --defaults-file=/home/centos/mysql/my.cnf &
❗️ 작성한 스크립트를 예약 스크립트에 넣고 인스턴스를 생성하게 되면 오류발생!
my.cnf 설정을 변경하기 이전에 권한을 주어서 제대로 적용이 되지 않아 나는 오류였습니다.
# my.cnf 설정
...
# chown
# my.cnf로 mysql 설정을 변경하고 권한을 주어야 함!
sudo chown -R centos:centos /home/centos/mysql
따라서 위와 같이 스크립트를 수정하고 재실행 > 초기 비밀번호입력하면 > 접속 완료!
touch install_radis.sh
chmod +x install_radis.sh
#!/bin/bash
# get user input(version)
echo $1
# wget download
sudo yum -y install wget
# epel download
sudo yum -y install epel-release
# remi download
sudo yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
# redis install
sudo yum -y install redis
# redis start
sudo systemctl start redis
# redis enable
sudo systemctl enable redis
# redis cli
redis-cli
sh install_redis.sh 6.2.6
으로 시작!
touch install_radis.sh
chmod +x install_radis.sh
#!/bin/bash
# get user input(version)
echo $1
# wget download
sudo yum -y install wget
# gcc download
sudo yum -y install gcc
# download file
wget https://download.redis.io/releases/redis-$1.tar.gz
# unzip file
tar xzf redis-$1.tar.gz
# cd redis file
cd redis-$1
# make comfile
make
# start redis-server (daemon)
# edit redis.conf
sed -i 's/daemonize no/daemonize yes/g' redis.conf
src/redis-server ./redis.conf
# start redis-cli
src/redis-cli
sh install_redis.sh 6.2.6
으로 시작!
src/redis-cli
는 사용자가 입력/var/log/cloud-init-output.log
에서 확인 가능 => 새로운 창을 켜서 tail -f /var/log/cloud-init-output.log
를 통해 잘 설치되고 있는지 확인해보세요!yum으로 설치돼있는 패키지 확인 명령어
yum list installed | grep mysql
sed 명령어 종류
$> touch test.sh
$> chmod +x test.sh -> 내용 : sed -i 's/abcd/efgh/g'
$> a.txt
$> touch a.txt -> 내용 : abcd
$> cat a.txt
efgh
sed -i 's/기존 내용/변경할 내용/g' 파일명.txt
ROOTPASS="`sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost: //'`"
참고링크
스크립트 최종본 링크 : https://velog.io/@claraqn/%EA%B3%BC%EC%A0%9C-MySQL-Redis-%EC%9E%90%EB%8F%99%EC%84%A4%EC%B9%98-%EC%B5%9C%EC%A2%85-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8