[과제] MySQL 설치 자동화 스크립트

버버니야·2022년 3월 8일
0
#!/bin/bash

# mysql_8.0.28 version install
sudo apt-get remove --purge mysql* 
# library install
sudo apt install libncurses5 -y


# group & user add
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql

# mysql install file download & decompress
cd /home/ubuntu/
sudo mkdir db
cd db
sudo wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz
sudo tar xvf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz

# symbolic link : mysql-version-os -> mysql
sudo ln -s /home/ubuntu/db/mysql-8.0.28-linux-glibc2.12-x86_64 mysql


# create my.cnf 
echo '[mysqld]
character-set-client-handshake=FALSE 
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server = utf8
collation-server = utf8_general_ci
datadir=/home/ubuntu/db/mysql/data
socket = /home/ubuntu/db/mysql/mysql.sock


[mysqldump] 
default-character-set = utf8

[mysql]
default-character-set = utf8

[mysqld_safe]
log-error=/home/ubuntu/db/mysql/mysqld.log
pid-file=/home/ubuntu/db/mysql/mysqld.pid
' >> /home/ubuntu/db/mysql/my.cnf

cd /home/ubuntu/db/mysql
mkdir mysqld

# directory setting
cd /home/ubuntu/db/mysql
echo '' >> /home/ubuntu/db/mysql/mysqld.log
mkdir mysql-files 
sudo chmod 750 mysql-files
mkdir data

sudo chown -R mysql /home/ubuntu/db/mysql
sudo chgrp -R mysql /home/ubuntu/db/mysql

# mysql --initialize : installin
sudo bin/mysqld --initialize --user=mysql --basedir=/home/ubuntu/db/mysql --datadir=/home/ubuntu/db/mysql/data 2> /install.log

#create RSA files
sudo bin/mysql_ssl_rsa_setup --datadir=/home/ubuntu/db/mysql/data

# mysql start & access
cd /home/ubuntu/db
sudo chmod -R 777 mysql
cd mysql
sudo bin/mysqld_safe --defaults-file=/home/ubuntu/db/mysql/my.cnf --user=mysql &
sleep 3
TEMP_PASS=`sudo grep 'temporary password' /install.log | sed -e "s/.*root@localhost: //"`

/home/ubuntu/db/mysql/bin/mysql -u root -p"${TEMP_PASS}"
vagrant@ubuntu-focal:/home/ubuntu$ 

1. 스크립트 파일

#!/bin/bash

스크립트 파일을 bash로 실행시킨다.

#!/bin/sh

sh가 bash의 심볼릭 링크로 되어있어 상기한 것과 같이 작성해도 같은 의미이다.

2. 기존에 mysql이 설치되어있을 경우를 위해 먼저 삭제 진행

sudo apt-get remove --purge mysql* 

기존에 설치되어 있으면 설치시 오류가 발생할 수 있기 때문에
mysql을 미리 삭제하고 시작한다.

group & user add

sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql

mysql용 로그인 사용자와 그룹 추가
mysql 그룹을 만들고 mysql 유저 추가

Useradd Option

  • /bin/false는 로그인은 허용하지만 shell이나 홈 디렉토리 제공은 하지 않는다.
  • /sbin/nlogin은 로그인이 되지 않는 계정이다.

설치할 버전 파일 다운 후 압축해제

mysql install file download & decompress

cd /home/ubuntu/
sudo mkdir db
cd db
sudo wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz
sudo tar xvf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz

관리에 용이하도록 모든 관련 파일을 /home/ubuntu/db 에서 작업.
db 디렉토리를 생성하고 mysql 설치 파일 다운로드 및 압축 해제

심볼릭 링크 생성

sudo ln -s /home/ubuntu/db/mysql-8.0.28-linux-glibc2.12-x86_64 mysql

압축을 해제하면 폴더 이름이 설치 파일 이름과 동일해 길어진다.
좀 더 쉽게 진행하기 위해 심볼릭 링크를 mysql이라는 이름으로 생성한다.

MySQL 설정 파일 my.cnf 생성하기

create my.cnf

echo '[mysqld]
character-set-client-handshake=FALSE 
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server = utf8
collation-server = utf8_general_ci
datadir=/home/ubuntu/db/mysql/data
socket = /home/ubuntu/db/mysql/mysql.sock


[mysqldump] 
default-character-set = utf8

[mysql]
default-character-set = utf8

[mysqld_safe]
log-error=/home/ubuntu/db/mysql/mysqld.log
pid-file=/home/ubuntu/db/mysql/mysqld.pid
' >> /home/ubuntu/db/mysql/my.cnf

echo 명렁어를 사용해 쉘 스크립트가 파일 생성.
character-set 설정과 더불어 데이터가 저장될 경로등을 지정

또한
log가 기록될 경로 및
pid가 저장될 파일 경로 설정등을 해준다.

pid 는 pid 들을 저장하고 있는 파일이다.

my.cnf 파일도 마찬가지로 /home/ubuntu/db/mysql 안에 생성해 설치 디렉토리 내에서 관리한다.

디렉토리 권한 설정

directory setting

cd /home/ubuntu/db/mysql
mkdir mysqld

# directory setting
cd /home/ubuntu/db/mysql
echo '' >> /home/ubuntu/db/mysql/mysqld.log
mkdir mysql-files 
sudo chmod 750 mysql-files
mkdir data

sudo chown -R mysql /home/ubuntu/db/mysql
sudo chgrp -R mysql /home/ubuntu/db/mysql

새로 추가한 user mysql로 설치를 진행하다보면 접근 권한 문제로 오류가 발생할 수 있기 때문에
디렉토리에 접근할 수 있도록 설정

MySQL 설치

mysql --initialize : installing

sudo bin/mysqld --initialize --user=mysql --basedir=/home/ubuntu/db/mysql --datadir=/home/ubuntu/db/mysql/data 2> /install.log

mysql을 설치한다.
base directory - /home/ubuntu/db/mysql
data directory - /home/ubuntu/db/mysql/data
로 설정해서 같은 디렉토리 안에서 관리할 수 있도록 한다.

2> <- 를 사용해서 해당 명령의 결과를 저장한다.
mysql을 설치할 때 임시비밀번호가 생성되고 출력되는데 임시비밀번호를 얻기 위함이다.

쉘 스크립트의 출력을 저장하는 명령
0 - 표준 입력
1 - 표준 출력
2 - 표준 에러
& - 백그라운드로 실행

  • > : 출력 (overwrite) - 파일이 있어도 덮어쓴다.
  • >> : 출력 (append) - 파일이 있으면 뒤에 붙여서 기록.
  • 1> : 표준 출력을 파일 디스크립터에 전달한다. -> 커맨드가 콘솔에 출력하는 내용을 파일로 저장
  • 2> : 표준 에러를 파일 디스크립터에 전달. -> 쉘 스크립트의 표준 에러를 파일로 저장할 수 있다.
  • >&2 : 모든 출력을 강제로 쉘 스크립트의 표준 에러로 출력한다.
  • 2>&1 : 표준 에러를 표준 출력으로 리다이렉트한다.

MySQL을 사용해 SSL, RSA 인증서 & 키 생성

create RSA files

sudo bin/mysql_ssl_rsa_setup --datadir=/home/ubuntu/db/mysql/data

MySQL 보안접속을 위한 ssl, rsa 세팅

MySQL 실행 및 접속

mysql start

cd /home/ubuntu/db
sudo chmod -R 777 mysql
cd mysql
sudo bin/mysqld_safe --defaults-file=/home/ubuntu/db/mysql/my.cnf --user=mysql &

my.cnf 를 defaults-file로 지정하고 user는 mysql로
MySQL을 실행한다. 이 작업을 백그라운드로 실행해 다음 sleep 문에 영향을 받지 않도록 한다.

sleep 3
TEMP_PASS=`sudo grep 'temporary password' /install.log | sed -e "s/.*root@localhost: //"`

/home/ubuntu/db/mysql/bin/mysql -u root -p"${TEMP_PASS}"
vagrant@ubuntu-focal:/home/ubuntu$ 

3초 sleep을 한 이유는
mysql를 실행시키고 바로 접속을하려고 하면 아직 실행이 완료되지 않은 상태에서 접속을 시도한다.
그렇게되면 정상적으로 접속을 할 수 없기 때문에 실행 후 3초 뒤에 접속을 시도한다.

임시비밀번호 로그가 mysqld.log에 기록되지 않는 문제가 있어
MySQL 설치 단계에서 출력되는 것들을 홈 디렉토리의 install.log에 리다이렉트해 저장했다.
설치할 때 나오는 임시 비밀번호를 사용해 접속 해야 해
TEMP_PASS라는 변수를 임시 비밀번호를 파싱해 선언한다.

sed 옵션

  • -n : 작업한 부분만 억제해서 출력하는 옵션
  • p : 프린트
  • , : 범위 설정 ex) 1,3 -> 1부터 3번 라인
  • $ : 끝 라인
  • s : 치환
  • -e : 여러 조건
    e 옵션과 함께 사용되는 옵션들
    • / : / 사이에 들어있는 부분
    • d : 삭제 delete
    • ^ : 행의 시작
    • $ : 행의 끝
    • /* : 앞의 문자를 0개 이상 찾음
sudo grep 'temporary password' /install.log | sed -e "s/.*root@localhost: //"

install.log 에서 root@localhost: 를 포함한 앞부분을 ''빈문자로 치환해 출력하도록해 임시 비밀번호를 저장했다.

/home/ubuntu/db/mysql/bin/mysql -u root -p"${TEMP_PASS}"

mysql -u root -p {임시 비밀번호} 를 이용해 접속.

접속에 성공한 모습

profile
안녕하세요

0개의 댓글