마지막 종강 기념으로 간단한(?) 개인 프로젝트를 구상해보았다.
이전에 진행했던 과제와 비슷한 구조이지만, Ansible을 적극적으로 활용해보고자 진행해보려고 한다.
이번 경험을 하면서 내가 원하는 직무를 찾는데 도움이 되었으면 하고, 당연히 실무와 비슷한 환경은 아니겠지만, 강사님에게 어느정도 진행한 다음 피드백을 받아보거나 해서 완성도를 높여 보고자 한다!
사실 최종적으로 하고 싶은 구조는 OpenStack을 활용하여 커스터마이징된 이미지를 인스턴스로 빠르게 배포하는 구조를 만들어보고 싶은데, 이는 차차 단계를 밟아가볼 예정이다.
아래는 최종적으로 구현해보고자 하는 프로젝트 구조이다.
이는 2개의 Compute Node와 1개의 Control Node를 구성하여 최소한의 서비스들을 통해서 이미지를 통해 웹서버와 모니터링 서버를 인스턴스 형식으로 빠르게 배포가능한 환경을 목표로 구상해본 구조이다.
짬짬히 시간을 내서 최종 목표까지 구현해볼 수 있도록 노력해볼 계획이다.
프로젝트 구조
우선 다이어그램을 통해서 이번 단계에서 진행할 구조를 정의해보았다.
모든 가상머신은 CentOS7 운영체제를 사용하여 가상 머신들을 미리 생성하고, 미리 정의해둔 양식에 맞춰 Isolated Network IP 주소를 할당한다.
앤서블을 활용해보기 위해 우선은 Ansible Host에서 Key-Pair를 만들고, 이를 바탕으로 각 가상머신에 Key-Pair 방식 SSH 접속을 위한 구조를 미리 만든다.
이번 실습에선 방화벽(firewalld), SELinux, NetworkManager를 모두 제외하고 진행할 예정이다.
Ansible Host에서는 미리 구성해둔 구조를 바탕으로 우선은 Bash Script를 통해서 아래의 구조를 만들도록 자동화해볼 예정이다.
구상 단계에서 정의한 각 가상머신의 최종 역할은 아래와 같다.
LB
L4 로드밸런서의 역할을 담당한다.
http 요청이 들어올 경우, 이를 VM1 ~ VM3 가상머신에게 Round-Robin 방식으로 트래픽 분산을 수행한다.
HAProxy 패키지를 통해 위의 기능을 위한 설정을 수행한다.
VM1 ~ 3
Apache 웹서버이자 자신들의 시스템 메트릭을 수집하고 이를 Ansible Host 전달한다.
httpd 패키지를 설치하여 웹서버의 기능을 수행하고, Node Exporter를 통해서 시스템 메트릭을 Prometheus 서버로 전달한다.
Ansible Host
최초의 구성에서 Bash Script(추후에 PlayBook)을 실행했을 때, 각 가상머신들의 역할에 맞게 패키지를 설치하고, 동작시키고, 구성을 수행하는 설정 및 관리 주체이다.
Prometheus를 통해서 VM1 ~ 3의 시스템 메트릭을 관리하고, Ansible을 통해서 각 가상머신에게 구성을 실시한다.'
이러한 구성들을 사용자의 입력 없이 자동화되는 하나의 Bash Script를 작성한다. 구성이 완료되면 PlayBook를 통해 수행한다.
프로젝트 최종 구조
가상머신 최초 구성 - 최초 부팅 및 IP 할당
기본적인 구성을 실시해볼 계획이다.
OS는 CentOS-7-x86_64-DVD-2009.iso을 사용한다.
우선은 네트워크 설정만 각 가상머신들에 적용한다.
아래는 가상머신의 구성이다.
Ansible Host
- CPU: 4
- RAM: 4GM
- STG: 40GB
- NAT
- Host-Only VMnet
- Server With GPU
나머지 가상머신
- CPU: 2
- RAM: 2GM
- STG: 20GB
- NAT
- Host-Only VMnet1
- Host-Only VMnet2
- Minimal
그리고 Network IP 할당은 그냥 가상머신 최초 부팅 시에 설정해 주었다. 귀찮아서
가상머신의 최초 부팅 후 CentOS7 설치는 완료했고, IP가 정상적으로 부여되고 인터넷 접속이 가능한지 테스트하였다.
가상머신 최초 구성 - KeyPair SSH 통신
작업 도구로 XShell을 사용하고 있기 때문에, 모든 세션에 쉽게 명령어 전달이 가능하지만, 그 방법을 사용하지 않고 구성해볼 계획이다.
Ansible Host에서 통신을 위한 모든 준비를 마친 후, ansible 명령어, 인벤토리, shell 모듈을 사용해서 명령어를 전달하여 각 가상머신에게 명령을 전달하는 구조를 만들어보자.
추가적으로 Ansible Host의 공개키는 scp 파일 전송 프로토콜을 통해 전송할 것이다. 복사 붙여넣기 하면 잘 안돼서
우선 Ansible Host에서 Ansible을 설치하고 인벤토리, KeyPair 생성을 진행하자.
yum -y install epel-release
yum -y install ansible
- ansible 설치
[root@ansiblehost ~]# mkdir ~/.ssh
[root@ansiblehost ~]# chmod 700 ~/.ssh
[root@ansiblehost ~]# ssh-keyscan 192.168.2.101 >> ~/.ssh/known_hosts
# 192.168.2.101:22 SSH-2.0-OpenSSH_7.4
# 192.168.2.101:22 SSH-2.0-OpenSSH_7.4
# 192.168.2.101:22 SSH-2.0-OpenSSH_7.4
[root@ansiblehost ~]# ssh-keyscan 192.168.2.102 >> ~/.ssh/known_hosts
# 192.168.2.102:22 SSH-2.0-OpenSSH_7.4
# 192.168.2.102:22 SSH-2.0-OpenSSH_7.4
# 192.168.2.102:22 SSH-2.0-OpenSSH_7.4
[root@ansiblehost ~]# ssh-keyscan 192.168.2.103 >> ~/.ssh/known_hosts
# 192.168.2.103:22 SSH-2.0-OpenSSH_7.4
# 192.168.2.103:22 SSH-2.0-OpenSSH_7.4
# 192.168.2.103:22 SSH-2.0-OpenSSH_7.4
[root@ansiblehost ~]# ssh-keyscan 192.168.2.200 >> ~/.ssh/known_hosts
# 192.168.2.200:22 SSH-2.0-OpenSSH_7.4
# 192.168.2.200:22 SSH-2.0-OpenSSH_7.4
# 192.168.2.200:22 SSH-2.0-OpenSSH_7.4
[root@ansiblehost ~]# chmod 600 ~/.ssh/known_hosts
- Ansible Host에서 ssh-keyscan을 통해 known_hosts 미리 등록
[root@ansiblehost ~]# ssh-keygen -q -N "" -f AH.pem
[root@ansiblehost ~]# ls
AH.pem anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
AH.pem.pub Desktop Downloads Music Public Videos
- KeyPair 생성 - AH.pem & AH.pem.pub
[root@ansiblehost ~]# scp AH.pem.pub 192.168.2.101:~
root@192.168.2.101's password:
AH.pem.pub 100% 398 593.6KB/s 00:00
[root@ansiblehost ~]# scp AH.pem.pub 192.168.2.102:~
root@192.168.2.102's password:
AH.pem.pub 100% 398 824.0KB/s 00:00
[root@ansiblehost ~]# scp AH.pem.pub 192.168.2.103:~
root@192.168.2.103's password:
AH.pem.pub 100% 398 878.5KB/s 00:00
[root@ansiblehost ~]# scp AH.pem.pub 192.168.2.200:~
root@192.168.2.200's password:
AH.pem.pub 100% 398 972.8KB/s 00:00
- SCP을 이용하여 AH.pem.pub 각 호스트에게 직접 전달
[root@vm1 ~]# mkdir ~/.ssh
[root@vm1 ~]# chmod 700 ~/.ssh
[root@vm1 ~]# cat AH.pem.pub >> ~/.ssh/authorized_keys
[root@vm1 ~]# cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCx8FLL2BxhYZbQBtzqJyHeW9iKX ... 생략
[root@vm1 ~]# chmod 600 ~/.ssh/authorized_keys
- Ansible Host의 공개 키 각 호스트의 ~/.ssh/authorized_keys에 전달 및 권한 부여
추가적으로 Password를 통한 SSH 접속을 막는 것이 맞지만, 우선 혹시모를 사고를 대비해서 최초에 막고 진행하진 않았다.
가상머신 최초 구성 - Ansible 사용을 위한 구성 및 ssh 설정
이제, Ansible 구성만 완료하면 바로 사용이 가능하다.
이를 위해서 /etc/ansible/hosts에 호스트들을 추가하여 임의대로 수정한다.
[vms]
192.168.2.101
192.168.2.102
192.168.2.103
[lb]
192.168.2.200
추가적으로, Ansible Host에서 해당 호스트들에게 ssh 접속을 할 때 개인키를 사용하도록 추가적인 수정을 ~/.ssh/config 파일을 생성하면서 아래의 내용을 추가해준다.
[root@ansiblehost ~]# touch ~/.ssh/config
[root@ansiblehost ~]# chmod 600 ~/.ssh/config
[root@ansiblehost ~]# vi ~/.ssh/config
[root@ansiblehost ~]# mkdir MGNT && chmod 700 MGMT && mv AH.pem MGMT/
[root@ansiblehost ~]# cat ~/.ssh/config
Host 192.168.2.*
User root
Identityfile /root/MGMT/AH.pem
Port 22
[root@ansiblehost ~]# systemctl restart sshd
- 이를 통해서 Ansible Host가 192.168.2.* 로 접속할 때 /root/MGMT/AH.pem을 이용하도록 설정한다.
- 이 수정을 진행하고 ssh 서비스 데몬을 재시작해준다.
이제 ansible 명령어와 ping 모듈을 통해서 통신이 원할하게 되는지 all 그룹을 이용하여 적용해보자.
이제 Ansible Host에서 Ansible을 이용하여 VM1 ~ VM3, LB에게 명령을 전달할 수 있는 기본 구조를 완성했다.
글이 너무 길어지기도 하기 때문에 나머지는 내일 이어 작성해보자.
구성 순서 정리
이 글의 내용을 따라가면 정상적으로 SSH Key-Pair 방식이 동작할 테지만, 만약 안되는 분들에게 도움을 드리고자..
- 현재 상태에선 모든 가상머신의 방화벽은 동작중이다.
- SELinux 또한 정상적으로 동작중이다.
- 모든 가상머신의 접속은 root 계정으로 이루어진다.
- 최초에 ~/.ssh 디렉토리는 존재하지 않을 수 있다.
- ~의 의미는 현재 사용자의 홈 디렉토리 위치이다. 즉, 이 글에선 root 사용자로의 접속을 위한 구성만 진행한 상태이다. 위 상황에서 user1으로 ssh 접속을 하면 ~/.ssh 설정이 되어있지 않기 때문에 비밀번호를 요구한다.
- 공개키를 ~/.ssh/authorized_keys에 넣을 때 복사 붙여넣기로 하면 잘 안될 가능성이 높다. - scp 같은 방법으로 파일을 직접 전달하고 cat 명령어로 직접 넣어주자.
SSH 접속부터 Ansible 구성까지 이어지는 흐름을 순서대로 표현하면 아래와 같다.
- SSH 접속을 시도할 가상머신에서 Key-Pair 생성 + ~/.ssh/known_hosts 각 가상머신의 공개키 붙여넣기 + chmod를 통한 권한 설정. ~/.ssh 디렉토리 생성
- scp를 이용하여 각 가상머신에게 공개키 전달(root의 홈디렉토리에 전달). 이때는 비밀번호를 입력해서 일일히 진행해야함.
- 각 가상머신에서 공개 키를 ~/.ssh/authorized_keys에 내용 전달. 최초에는 ~/.ssh 폴더가 존재하지 않으므로 디렉토리 생성 - 이 단계를 거치면 Key-Pair를 통한 SSH 접속 가능
- /etc/ansible/hosts에 원하는 그룹 및 호스트 등록
- ~/.ssh/config 파일을 생성하여 해당 파일에 항상 개인키를 사용하여 SSH 접속을 시도할 호스트 정의
- sshd 재시작 - ansible 사용 가능
이번 구성을 진행할 때 딱 저정도만 수행해도 Ansible을 통해 정상적으로 통신이 가능해진다.
'Infra > Linux' 카테고리의 다른 글
도커 없이 컨테이너 만들기 - 2 (3) | 2023.11.18 |
---|---|
도커 없이 컨테이너 만들기 - 1 (0) | 2023.11.17 |
Docker Swarm Cluster 환경에서 Fast-API & MongoDB 연결 - Docker Compose & Secret 사용 (0) | 2023.08.06 |
종강 기념 프로젝트 Step 3 - WPM 자동화 프로젝트 - Prometheus & Grafana 설치 및 DB Replication 설정 자동화(CentOS7) (7) | 2023.06.25 |
종강 기념 프로젝트 Step 2 - WPM 자동화 프로젝트 - 방향 수정 & WPM 설치 및 LB 구성 자동화(CentOS7) (0) | 2023.06.20 |