Ansible을 사용할 것이니 managed Node와 controll node 2개가 기본 필요하고,
MySQL HA를 구성하기 위해 controll node를 2개 구성하여 총 3개의 vm을 생성하였습니다.
우선 MySQL HA를 구성하기 위해
1. Ansible 설치 후 서버와 통신시키기
2. MySQL 설치 및 세팅
3. MySQL MHA 구성하기
로 단계를 나눠서 진행해보겠습니다.
기본적으로 모든 서버의 python 버전이 일치해야하므로 일치하는지 확인합니다.
python3 --version
Managed Node 역할을 할 서버에만 Ansible을 설치합니다.
sudo apt install ansible
# 설치 확인
ansible --version
자신의 pc os에 따라 설치 방법이 다르니 이곳을 참고하여 자신의 운영체제에 맞게 설치하세요.
대부분의 작업이 Root 권한이 필요하여 sudo로 작업하게 됩니다.
sshpass 설치
앤서블 명령어 옵션중 --ask-pass 를 사용할 경우 sshpass 설치가 필요하다.
sudo apt install sshpass
/etc/ansible이 ansible의 홈입니다.
ansible.cfg의 ansible 환경 설정 일부를 수정합니다.
hosts에 ansible inventory로 스크립트 날릴 원격서버를 정의합니다.
ansible 환경변수를 정의한 후
export ANSIBLE_HOME='/etc/ansible'
ehco $ANSIBLE_HOME
4. ssh 연결 키 세팅
host에 정의한 서버와 통신이 잘되는지 확인해봅니다.
ansible all -m ping
지금 진행해보면 다음처럼 연결이 안된다고 뜰 것입니다.
이는 서로 통신하는 데 필요한 key값이 없어서 그러한 것인데요.
key-gen으로 키값을 미리 생성 후 각 서버에 복사하여 해결해보도록 하겠습니다.
# 키 생성
ssh-keygen
# 계속 엔터를 누릅니다.
# 각 서버에 키 복사
scp $HOME/.ssh/id_rsa.pub 복사할 서버:id_rsa.pub
scp $HOME/.ssh/id_rsa.pub 복사할 서버:id_rsa.pub
이후 다시 접속 확인을 해보면 잘 접속되는 것을 확인할 수 있습니다.
이를 playbook으로 실행해봅시다.
---
- name: Test connectiong
hosts: all
tasks:
- name: test connection
ping:
ansible-playbook test-playbook.yml
잘 실행되는 것을 확인할 수 있습니다.
MySQL를 controll node에도 함께 설치하기 위해 앞선 과정에서 hosts파일에 controll node 서버 주소를 작성했습니다.
이 2 controll node를 그룹으로 지정하여 쉽게 다루게 하기 위하여 hosts파일을 다시 수정해보겠습니다.
이 둘은 결국 MySQL-replica가 될 서버이므로 mysql-replicas라는 그룹명으로 지정하겠습니다.
db-server-playbook.yml 파일에 MySQL 설치 세팅 시작 파일을 작성해보겠습니다.
---
- hosts: mysql-replicas
vars:
mysql_root_password: "1234"
mysql_mha_username: "mha_user"
mysql_mha_password: "1234"
tasks:
- name: apt update
become: yes
apt: update_cache=yes
- name: install mysql
become: yes
apt: name=mysql-server update_cache=yes cache_valid_time=3600 state=present
- name: start up the mysql service
service: name=mysql
enabled=yes
state=started
#shell: "systemctl start mysql"
- name: ensure mysql is enabled to run on startup
service: name=mysql state=started enabled=true
- name: Install required software
apt: name={{ item }} state=present
become: yes
with_items:
- python-mysqldb
- name: find temporary pwd
shell: "sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $13}'"
register: temporary_password
- name: debug temporary pwd
debug:
msg: "{{ temporary_password.stdout }}"
- name: check mha user created
shell: sudo MYSQL_PWD={{ temporary_password.stdout }} mysql -u root --connect-expired-password -se "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = '{{ mysql_mha_username }}')"
register: CREATED
- name: create mha/replicator user
shell: sudo MYSQL_PWD={{ temporary_password.stdout }} mysql -u root -e "create user '{{ mysql_mha_username }}'@'%' identified by '{{ mysql_mha_password }}'"
when: CREATED.stdout|int == 0
- name: grant privileges to mha user
shell: sudo MYSQL_PWD={{ temporary_password.stdout }} mysql -u root -e "grant all on *.* to '{{ mysql_mha_username }}'@'%'; flush privileges;"
- name: create a new database
mysql_db: name=testdb state=present login_user="{{ mysql_mha_username }}" login_password="{{ mysql_root_password }}"
- name: add sample data to database
copy: src=dump.sql dest=/tmp/dump.sql
전체 코드는 위와 같습니다.
한번 위 코드를 조각조각 잘라서 각 코드가 무엇을 의미하는지 설명해보겠습니다.
- hosts: mysql-replicas
vars:
mysql_root_password: "1234"
mysql_mha_username: "mha_user"
mysql_mha_password: "1234"
tasks:
- name: apt update
become: yes
apt: update_cache=yes
- name: install mysql
become: yes
apt: name=mysql-server update_cache=yes cache_valid_time=3600 state=present
- name: start up the mysql service
service: name=mysql
enabled=yes
state=started
#shell: "systemctl start mysql"
- name: ensure mysql is enabled to run on startup
service: name=mysql state=started enabled=true
- name: Install required software
apt: name={{ item }} state=present
become: yes
with_items:
- python-mysqldb
- name: find temporary pwd
shell: "sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $13}'"
register: temporary_password
- name: debug temporary pwd
debug:
msg: "{{ temporary_password.stdout }}"
- name: check mha user created
shell: MYSQL_PWD={{ temporary_password.stdout }} mysql -u root --connect-expired-password -se "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = '{{ mysql_mha_username }}')"
register: CREATED
become: yes
- name: create mha/replicator user
shell: MYSQL_PWD={{ temporary_password.stdout }} mysql -u root -e "create user '{{ mysql_mha_username }}'@'%' identified by '{{ mysql_mha_password }}'"
when: CREATED.stdout|int == 0
become: yes
- name: grant privileges to mha user
shell: MYSQL_PWD={{ temporary_password.stdout }} mysql -u root -e "grant all on *.* to '{{ mysql_mha_username }}'@'%'; flush privileges;"
become: yes
- name: create a new database
mysql_db: name=testdb state=present login_user="{{ mysql_mha_username }}" login_password="{{ mysql_root_password }}"
- name: add sample data to database
copy: src=dump.sql dest=/tmp/dump.sql
CREATE TABLE IF NOT EXISTS test (
message varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO test(message) VALUES('Ansible To Do List');
INSERT INTO test(message) VALUES('Get ready');
INSERT INTO test(message) VALUES('Ansible is fun')
ansible-playbook db-server-playbook.yml
우리가 생성한 값들이 잘 들어가 있는지 확인해봅시다.
mysql -u mha_user -p
비밀번호 입력을 원할 시, 우리가 생성 시 지정한 비밀번호 1234를 입력하면 로그인됩니다.
use testdb
우리가 생성한 testdb가 잘 생성된것을 볼 수 있습니다.
dump.sql이 잘 실행되었음을 볼 수 있습니다.
여기까지 Control node와 manage node를 만들고 유저 생성 후 테이블 생성 데이터 입력까지 해보았습니다.
이제 MySQL MHA를 구성해봅시다.
사용할 변수값을 hosts파일안에 한번에 정의해두겠습니다.