과제 : MySQL/Redis 자동설치 스크립트 생성

호밀빵 굽는 쿼카·2022년 1월 14일
0

NHN Cloud 인턴

목록 보기
8/48

what? 무엇을 진행할 예정인가요?

스크립트를 통해 MySQL,Redis 자동 설치를 진행합니다.

why? 왜 Script를 통한 설치인가?

1) 반복 작업에 대한 자동화가 가능
스케줄 설정과 같이 주기적으로 수행하는 단순한 작업에 쉘 스크립트를 활용하면 관리자가 일일이 타이핑하지 않아도 된다.
2) 기존의 명령어를 사용자만의 명령어로 보안
쉘 스크립트를 이용하여 기존의 명령어의 결과를 원하는 형태의 결과로 표시할 수 있으며, 이를 위해 입출력 재지정(redirection)을 활용하면 된다.
3) 손쉽고 빠른 개발 및 보완이 가능
운영체제의 명령어들을 잘 알고 있다면 손쉽고 빠른 개발 및 보완이 가능하다.

How? 어떻게?

직접 MySQL, Redis 자동설치 쉘 스크립트를 작성해보면서 설치를 진행합니다.




목차

1.1 yum을 통한 MySQL 설치

1.2 압축파일을 통한 MySQL 설치

2.1 yum을 통한 Redis 설치

2.2 압축파일을 통한 Redis 설치


1.1 MySQL(yum) 자동설치 스크립트 생성

1. 파일 생성하고(확장자 .sh) 실행파일로 변경

# 파일 생성
touch install_mysql.sh
# 실행파일로 변경
chmod +x install_mysql.sh

2. shell script 작성

본격적으로 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 를 써주어서 오류가 남

3. mysql 설치,접속 완료!✌️

4. 실행결과를 터미널에 보여주는 것이 아니라 파일에 저장하기

# >> result.txt 2> /dev/null
LOG="`>> result.txt 2> /dev/null`"

# 명령어 뒤에 $LOG 붙여주면 완료

>> 명령어 사용해서 로그를 redirection, NHN CLOUD 에서서는 /var/log/cloud-init-output 에서 로그를 저장합니다.


1.2 MySQL(압축파일) 자동설치 스크립트 생성

1. 파일 생성하고(확장자 .sh) 실행파일로 변경

# 파일 생성
touch install_mysql.sh
# 실행파일로 변경
chmod +x install_mysql.sh

2. shell script 작성

# 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명령어를 통해 잠시동안 멈춰주고 실행했더니 잘 접속되었습니다.

3. mysql 설치,접속 완료!✌️

4. NHN CLOUD 환경에서 실행해보기

예약 스크립트에 아래의 스크립트(최종 코드)를 추가

#!/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

따라서 위와 같이 스크립트를 수정하고 재실행 > 초기 비밀번호입력하면 > 접속 완료!

2.1 Redis(yum) 자동설치 스크립트 생성

1. 실행파일 생성

touch install_radis.sh
chmod +x install_radis.sh

2. shell script 작성

#!/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

3. Redis 설치,접속 완료✌️

sh install_redis.sh 6.2.6 으로 시작!

2.2 Redis(압축파일) 자동설치 스크립트 생성

1. 실행파일 생성

touch install_radis.sh
chmod +x install_radis.sh

2. shell script 작성

#!/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

3. Redis 설치,접속 완료✌️

sh install_redis.sh 6.2.6 으로 시작!

4. NHN CLOUD 환경에서 실행해보기!

  • NHN CLOUD 예약 스크립트를 통해 실행해봅니다 => 인스턴스를 생성할 때 예약 스크립트를 작성
  • 스크립트를 통해 자동으로 Redis 설치를 진행하기 때문에 사용자의 입력을 받지않고 버전을 수동입력
  • 마지막 src/redis-cli 는 사용자가 입력
  • 스크립트 설치중인 로그는 /var/log/cloud-init-output.log 에서 확인 가능 => 새로운 창을 켜서 tail -f /var/log/cloud-init-output.log 를 통해 잘 설치되고 있는지 확인해보세요!


해당과제를 진행하면서 공부한 추가내용

1. \033[47;31m

'\033['

  • Escape sequences 중에서 Control Sequence Introduce (CSI) 를 나타내는 코드
  • Terminal 창에 뭔가 특수한 역할을 하는 명령을 주는 시작 코드

숫자m

  • m : 그냥 가장 뒤에 붙이는 문자
  • 숫자에 따라 배경색이나 text색이 변경
  • 47;31 : 배경색 회색, text색 빨강

2. file유무 체크하는 방법

  • -b FILE : 파일이 존재하고 특별한 파일인지 체크
  • -c FILE : 파일이 존재하고 특수문자 있는지 체크
  • -d FILE : 파일이 존재하고 그 파일이 폴더인지 체크
  • -e FILE : 파일 존재하는지 체크
  • -f FILE : 파일이 존재하고 보통 파일인지 체크
  • -g FILE : 파일이 존재하고 groupID로 설정돼었는지 체크

3. yum으로 설치돼있는 패키지 확인

yum으로 설치돼있는 패키지 확인 명령어
yum list installed | grep mysql

4. 리눅스의 sed 옵션

sed 란?

  • 비 대화형 모드의 줄 단위 편집기. vi 편집기처럼 직접 파일을 열어 고치지 않고 커맨드 창 또는 스크립트에서 동작을 해 원하는 부분만 변경해준다는 특징
  • 주의할 점 : 정규표현식을 사용하기 때문에 특수문자 앞에 역슬래시 붙여줘야 함

    sed 명령어 종류

  • -d : 출력
  • -p : 출력
  • -s : 치환
  • 콤마(,) : 범위 지정
  • -e : 다중편집
  • -r : 파일에서 읽기
  • -w : 파일에 쓰기
  • -a : 추가
  • -i : 삽입
  • -c : 변경
  • -n : 다음
  • -y : 변환
  • -q : 종료

예제를 통해 알아보기

$> 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

해당 스크립트에서의 -sed 사용

ROOTPASS="`sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost: //'`"

sed 명령어를 더 알고 싶으면 클릭하세요! 참고링크



참고링크

profile
열심히 굽고 있어요🍞