CLOUD/IaC

[Ansible/Redis] Master(3) - Slave(3) Clustering

alsruds 2023. 3. 29. 17:55

♥ 미리보기 

1. ssh-copy-id root@[managed node ip]

2. /etc/ansible/hosts

3. vi hosts

4. ansible-galaxy init [role]

5. role: master&slave : tasks - main.yml / vars - main.yml / templates

6. playbook

7. ansible-playbook -i hosts playbook

 


 

안뇽하세요 오늘은

ansible로 redis 서버의 master - slave clustering 구성을 해 볼게용

 

필요한 건..

일단 코드를 짤 control node 가 필요하겠죠?

 

managed node 역할을 할 가상머신 6대도 필요해용

3대는 master 역할!

나머지 3대는 slave 역할!

 

Control Node : 200.200.200.157
Managed Node:
> Master : 200.200.200.163 / 200.200.200.164 / 200.200.200.165
> Slave : 200.200.200.166 / 200.200.200.167 / 200.200.200.168

 


1.

Control Node 에 새로운 Managed Node 를 추가할 때에는 키를 복사해 주어야 해요

앗.. 키가 없다구요?

 

2023.03.28 - [분류 전체보기] - [Ansible] Control node & Managed node

 

[Ansible] Control node & Managed node

[ Ansible 이란? ] 》 스토리지, 서버, 네트워킹을 자동화하는 구성 관리 플랫폼 》 * 연산을 여러 번 적용하더라도 결과가 달라지지 않음 (멱등성) [ Ansible 구성요소 ] ● Control Node 》 Ansible 실행 ● M

alsrudalsrudalsrud.tistory.com

여기를 보고 오시면 키를 만드실 수 있답니당

 

사실..

ssh-keygen

명령어 한 번에 엔터 3번이면 금방 뚝딱이에요

 

이렇게 만든 키를 Managed Node에 복사해주시면 돼요~

ssh-copy-id root@[managed ip]

가상머신이 6대니까 6번 해주셔야 겠죠? 대신 키는 한 번만 만드시면 됩니당~

 

2.

두 번째로는 /etc/ansible/hosts 에 managed node 들의 ip 를 추가해주셔야 해요

# vi /etc/ansible/hosts
server:
  200.200.200.163
  200.200.200.164
  200.200.200.165
  200.200.200.166
  200.200.200.167
  200.200.200.168

저는 이렇게 파일 맨 마지막에 managed node 6대의 ip를 적어주었어요~

 

3.

다음으로는 hosts 파일을 만들어 주세용

# vi hosts
all:
  children:
    master:
      hosts:
        200.200.200.163:
        200.200.200.164:
        200.200.200.165:
    slave:
      hosts:
        200.200.200.166:
        200.200.200.167:
        200.200.200.168:

 

4.

이번에는 role 을 만들어줄거에요

playbook 에 몽땅 쓰는 것보다 role 을 만들어주면 더 보기 깔끔하답니다

ansible-galaxy init [role name]
# ansible-galaxy init master
# ansible-galaxy init slave

 

tree [role name]

role 의 구성요소에용

앗.. 지금 막 만든 척했는데 제가 이미 다 해보고 적는 거라 redis.conf.j2 파일이 다 보이네요ㅎ)ㅎ

 

원래 playbook 에 작성해주었던 module들의 정보들은 tasks - main.yml 에 적어줄거에요

일부 변경될 필요가 있는 파일들은 templates 에,

그 외의 파일들은 files 에 넣어준답니다

변수를 따로 설정해준다면 vars - main.yml 에 작성해줄 수 있어요

 

5.

혀가 길었네용 (메롱)

master 의 task - main.yml 을 적으러 가보자구요

# role: master - tasks - main.yml
- name: Install Redis	# redis 설치
  yum:
    name: redis
    state: latest

- name: File Copy	# redis 파일 설정 변경
  template:
    src: redis.conf.j2
    dest: /etc/redis.conf
    remote_src: no
  become: yes

- name: Start Redis	# redis 시작하기
  systemd:
    name: redis
    state: restarted
  become: yes

- name: Stop Firewalld	# 방화벽 해제
  systemd:
    name: firewalld
    state: stopped
  become: yes

- name: Load Vars	# 변수 폴더 불러오기
  include_vars: "/root/ansible_redis/master/tasks/main.yml"

- name: Clustering	# master node 들 clustering
  shell: |
    echo yes | redis-cli --cluster create "{{ allips[0:15] }}":6379 "{{ allips[16:31] }}":6379 "{{ allips[32:47] }}":6379
  become: yes

 

네? redis 파일 설정을 뭘 어떻게 변경해서 복사해준거냐구요??

2023.03.24 - [분류 전체보기] - [Redis] Master Clustering(3) - Slave Clustering(3)

 

[Redis] Master Clustering(3) - Slave Clustering(3)

◎ 가상머신 6대 준비 ◎ CentOS 8 → Master Server 3대 : 200.200.200.136, 200.200.200.137, 200.200.200.150 → Slave Server 3대 : 200.200.200.151, 200.200.200.152, 200.200.200.153 [ 공통 준비 ] ● 설치 yum -y install redis ● /etc/redis.

alsrudalsrudalsrud.tistory.com

이 글을 참고해주셔용

 

아차차 vars - main.yml 이 궁금하시겠네~~

# role: master - vars - main.yml
allips: |
            {% set comma = joiner(",") %}
            {% for host in groups['master'] -%}
              {{ comma() }}{{ host }}
            {%- endfor -%}

허걱 이게 머냐고요??

진자2 문법이요!!

 

이 변수를 출력하면 "200.200.200.163,200.200.200.164,200.200.200.165"

이렇게 master ip 들이 문자열처럼 출력돼용

 

그래서 위에 tasks - main.yml 에서 문자열 슬라이싱으로 뽑아준거랍니닷

( 하드 코딩 맛있다^^ (

아.. 하드 코딩 싫으시다구요? 클러스터링 구성하는 게 몇 갠데 저렇게 못하시겠다구요?>!

그렇다면..

# vars - main.yml
allips: |
                  {% set ips = '' %}
                  {% for host in groups['master'] -%}
                    {% set ips = ips ~ host ~ ','  %}
                    {{ ips }}
                  {%- endfor -%}
                  
# tasks - main.yml
- name: Execute redis-cli Command
  shell: |
    echo yes | redis-cli --cluster create {{ allips.replace(',', ':6379 ') }}
  become: yes

 

 

 

6.

이제 해당 role 을 실행할 playbook 에 적어줘볼까용?

# playbook
- hosts: [ "master" ]
  roles:
  - role: master

- hosts: [ "slave" ]
  roles:
  - role: slave

곧 slave role 도 만들거니까~ 미리 만들어줬습니다

 

자 Redis Server 의 Master Node 준비 끝~

 


Slave 레츠고

마스터랑 똑같지 머!!

 

# role: slave - tasks - main.yml
- name: Install Redis
  yum:
    name: redis
    state: latest

- name: File Copy
  template:
    src: redis.conf.j2
    dest: /etc/redis.conf
    remote_src: no
  become: yes

- name: Start Redis
  systemd:
    name: redis
    state: restarted
  become: yes

- name: Stop Firewalld
  systemd:
    name: firewalld
    state: stopped
  become: yes

- name: Execute redis-cli Command
  shell: |
    redis-cli -h {{ ansible_facts.default_ipv4.address }} --cluster add-node {{ slave_ip }}:6379 {{ groups['master'][master_idx | int] }}:6379 --cluster-slave
  become: yes
# role: slave - vars - main.yml
slave_ip: "{{ ansible_facts.default_ipv4.address }}"
master_idx: "{{ groups['slave'].index(inventory_hostname) }}"

 

다른 게 있다면..

Master - Slave 연결해주는 것~?

 

실행해봅시당

ansible-playbook -i hosts playbook

 

??? : 에러는 안났는데 된지 안된건지 어케 알아요?

 

아하~

그렇다면 아무 가상머신에 지금 바로

접속하세요!

 

Clustering! Clustering!

 

축하드립니다~^^