๋ธ๋ก๊ทธ๋ฅผ ๋ฐฉ์นํด๋์ง ๋๋ฌ์ด ์ง๋ฌ์ต๋๋ค.
์ต๊ทผ์๋ ์ธํ๋ฐ ๊ฐ์๋ฅผ ๊ฒฐ์ ํด์ ๋ฃ๊ณ ์๋๋ฐ์,
์ฌ๊ธฐ์ Ansible์ด๋ผ๋ ์ฝ๋ ๊ธฐ๋ฐ ์ธํ๋ผ ๊ฐ์๋๊ตฌ์ ๋ํด ๋ฐฐ์ ์ต๋๋ค.
Ansible์ ์๋ฒ ์ค์ , ๋ฐฐํฌ, ๊ด๋ฆฌ ์์ ์ ์ฝ๋๋ก ์๋ํํ ์ ์๊ฒ ๋์์ฃผ๋ ๋๊ตฌ์ ๋๋ค.
์ฆ, ์ฌ๋์ด ์ผ์ผ์ด ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ ๋์ , ๋ฏธ๋ฆฌ ์ ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ฌ๋ฌ ์๋ฒ๋ฅผ ํ ๋ฒ์ ์ ์ดํ ์ ์์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋
- ๊ธฐ๋ณธ ๊ฐ๋ (Playbook, Inventory ๋ฑ)์ ๋ํ ๊ฐ๋จํ ์ดํด
- ์ค์ ์๋ฒ ํ๊ฒฝ์์์ ์ฌ์ฉ ํ๊ธฐ
์ด ๋ ๊ฐ์ง๋ฅผ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํ๋ ค ํฉ๋๋ค.
์๋ํ ๋๊ตฌ๋ฅผ ์ฒ์ ์ ํ๋ ๋ถ๋ค์๊ฒ ๋์์ด ๋๋ฉด ์ข๊ฒ ์ต๋๋ค.
Ansible ๊ธฐ๋ณธ ๊ฐ๋
Ansible์ ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ์ ์ดํ๋ ์๋ํ ๋๊ตฌ๋ก, Infrastructure as Code (IaC) ๊ฐ๋ ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์๋ฒ ์ค์ , ํจํค์ง ์ค์น, ์๋น์ค ๋ฐฐํฌ ๋ฑ ๋ฐ๋ณต์ ์ธ ์์ ์ ‘์คํฌ๋ฆฝํธ(Playbook)’๋ก ์ ์ํ๋ฉด, ์ฌ๋ฌ ์๋ฒ์ ๋์์ ๋ช ๋ น์ ์ ์กํ๊ณ ์ ์ดํ ์ ์์ต๋๋ค.
- Infrastructure as Code (IaC) ๊ตฌํ
→ ์๋ฒ ๊ด๋ฆฌ์ ๋ฐฐํฌ ๊ณผ์ ์ ์ฝ๋๋ก ๋ฒ์ ๊ด๋ฆฌํ ์ ์์ - Python ๊ธฐ๋ฐ ๋์
→ ๋ด๋ถ์ ์ผ๋ก Python์ ์ด์ฉํ์ง๋ง, ์ฌ์ฉ์๊ฐ Python ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ ๊ฒ์ ์๋ - ์ค์ ์ ์ด ๊ตฌ์กฐ
→ ํ๋์ ์ ์ด ์๋ฒ(Control Node)์์ ์ฌ๋ฌ ๋์ ์๋ฒ(Managed Node)๋ฅผ ์ ์ด
๊ตฌ์ฑ ๊ฐ์
Ansible์ Control Node ํ ๋๋ง ์ค์นํ๋ฉด ๋ฉ๋๋ค.
๋ช
๋ น์ ๋ฐ๋ Managed Node์๋ Python 2.6 ์ด์๋ง ์ค์น๋์ด ์์ผ๋ฉด ๋ฉ๋๋ค.
์ ๊ฐ ์งํ ์ค์ธ ํ๋ก์ ํธ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํ์ต๋๋ค.
| ์ญํ | ์๋ฒ ์ด๋ฆ | ์ค๋ช |
| Control Node | public-nat | Ansible์ด ์ค์น๋์ด ๋ช ๋ น์ ๋ด๋ฆฌ๋ ์๋ฒ |
| Managed Node | kafka01, kafka02, kafka03 | ์ ์ด ๋์ Kafka ์๋ฒ๋ค |
์ค์ ์๋ฒ ํ๊ฒฝ์์์ ์ฌ์ฉ ํ๊ธฐ
AWS EC2์๋ฒ๋ฅผ ๋ฐ์ ์ฌ์ฉํด๋ณด์์ต๋๋ค.
์ ๋ ๋ฏธ๋ฆฌ kafka ์๋ฒ๋ค๊ณผ public-nat ์๋ฒ๊ฐ ํต์ ๋ ์ ์๋๋ก AWS์์ VPC์ค์ ์ ํ ์ํ์์ ์์ ์ ์์ํ์ต๋๋ค.
๐ /etc/hosts ์ค์
๋จผ์ public-nat(Control Node)์๋ฒ์์ /etc/hosts ํ์ผ์ ๋ฑ๋กํฉ๋๋ค.
์ด ํ์ผ์ DNS ์๋ฒ ์์ด๋ ์๋ฒ ์ด๋ฆ์ผ๋ก IP๋ฅผ ์๋ณํ ์ ์๊ฒ ํด์ฃผ๋ ๋ก์ปฌ ๋ฃฉ์
ํ์ผ์
๋๋ค.
$ sudo vi /etc/hosts
172.31.27.133 kafka01
172.31.32.153 kafka02
172.31.48.244 kafka03
๊ฐ ์๋ฒ์ ์ฌ์คIP๋ฅผ ๋ฑ๋กํด์ฃผ์์ต๋๋ค.
์ด๋ ๊ฒ ์ค์ ํด๋๋ฉด, ์ดํ ๋ช ๋ น์์ kafka01์ฒ๋ผ ์๋ฒ๋ช ์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
Ansible ์ค์น
๊ทธ๋ฆฌ๊ณ ์ด์ด์ ๋ค์ ๋ช ๋ น์ผ๋ก ์ค์นํฉ๋๋ค.
ec2-user$ pip install ansible==8.7.0
ec2-user$ ansible --version
๋ฒ์ ์ด ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋๋ฉด ์ค์น ์๋ฃ์ ๋๋ค.
์ธ๋ฒคํ ๋ฆฌ(Inventory) ์์ฑ
Ansible์ด ์ ์ดํ ์๋ฒ ๋ชฉ๋ก์ ์ ์ํ๋ ํ์ผ์
๋๋ค.
๊ธฐ๋ณธ ๊ฒฝ๋ก๋ /etc/ansible/hosts ์
๋๋ค.
ec2-user$ cd /etc
ec2-user$ sudo mkdir ansible
ec2-user$ sudo vi /etc/ansible/hosts
์ด ํ์ผ ์์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ดํ ์๋ฒ๋ฅผ ๊ทธ๋ฃนํํด ์์ฑํฉ๋๋ค.

- kafka01 ~03 -> /etc/hosts ํ์ผ์ ์จ๋์๋ ์ด๋ฆ์ ์ธ์ํด์ IP๋ฅผ ๋งคํ
- [kafka:vars] : variable ๊ด๋ จํด ๋ช๊ฐ์ง ๋ณ์ ๋ฑ๋ก
- ansible_user : ๋ช ๋ น์ ์ ๋ฌ๋ฐ์ ์ํํ๋ ๊ณ์
- ansible_ssh_private_key_file : ์ ์์ ํ์ํ ํค ์ง์
Ansible ๊ธฐ๋ณธ ์ค์ — ansible.cfg
Ansible์ ๊ธฐ๋ณธ ์ค์ ์ ansible.cfg ํ์ผ์์ ๊ด๋ฆฌํฉ๋๋ค.
์ด ํ์ผ์๋ ์ ์ญ์ ์ผ๋ก ์ ์ฉ๋๋ ํ๊ฒฝ ์ค์ (๋ํดํธ ๊ฒฝ๋ก, ํค ๊ฒ์ฆ ์ฌ๋ถ, ์์ ํ์ผ ๊ถํ ๋ฑ)์ ์ง์ ํ ์ ์์ต๋๋ค.
ec2-user$ sudo vi /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False
allow_world_readable_tmpfiles = True
| ์ต์ | ์ค๋ช | ๊ฐ |
| host_key_checking | Ansible์ด ์ฒ์ ์๊ฒฉ ์๋ฒ์ ์ ์ํ ๋, SSH ํธ์คํธ ํค๋ฅผ ๋ฑ๋กํ ์ง ๋ฌป๋ ๋ฉ์์ง๋ฅผ ๋์ธ์ง ์ฌ๋ถ๋ฅผ ์ค์ ํฉ๋๋ค. ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋งค๋ฒ ์ ๋ ฅ์ด ๋ฒ๊ฑฐ๋ก์ฐ๋ฏ๋ก False๋ก ๋นํ์ฑํํฉ๋๋ค. | False |
| allow_world_readable_tmpfiles | ์์ ๋๋ ํฐ๋ฆฌ์ ์์ฑ๋๋ ํ์ผ์ ๋๊ตฌ๋ ์ฝ์ ์ ์๋๋ก ํ์ฉํ ์ง ์ฌ๋ถ์ ๋๋ค. ์ผ๋ถ ํ๊ฒฝ์์๋ ๊ถํ ๋ฌธ์ ๋ก ์ธํด ์์ ํ์ผ ์ ๊ทผ์ด ์ ํ๋ ์ ์๋๋ฐ, ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด True๋ก ์ค์ ํ์ต๋๋ค. | True |
Ping ํ ์คํธ
Ansible์ด ์ ์ดํ ์๋ฒ์ ์ ๋๋ก ํต์ ํ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ping ๋ชจ๋์ ์ฌ์ฉํฉ๋๋ค.
์ด ํ
์คํธ๋ ์ค์ ๋คํธ์ํฌ ping์ด ์๋๋ผ, SSH ์ ์ ํ Ansible ๋ชจ๋์ด ์ ์ ์๋ํ๋์ง๋ฅผ ํ์ธํ๋ ๊ณผ์ ์
๋๋ค.
ํน์ ๊ทธ๋ฃน ๋์ ํ ์คํธ
ansible kafka -m ping
→ kafka ๊ทธ๋ฃน(์: kafka01, kafka02, kafka03)์ ํฌํจ๋ ์๋ฒ๋ค์ ping ๋ช ๋ น ์คํ
Ansible Playbook์ด๋?
Ansible์์ Playbook์ ์ฌ๋ฌ ๊ฐ์ ๋ช ๋ น์ด๋ ๋ชจ๋์ ํ๋์ ์์ ๋จ์๋ก ๋ฌถ์ด ์๋ํ ์คํฌ๋ฆฝํธ์ฒ๋ผ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ํต์ฌ ๊ธฐ๋ฅ์ ๋๋ค.
| ์์ฑ ํ์ | YAML ํ์ผ๋ก ์์ฑ (.yml ํ์ฅ์ ์ฌ์ฉ) |
| ์ญํ | ์ฌ๋ฌ ๋ชจ๋์ ์กฐํฉํด ํ๋์ ‘์์ ์๋๋ฆฌ์ค’๋ฅผ ๊ตฌ์ฑ |
| ์คํ ๋ช ๋ น | ansible-playbook [ํ์ผ๋ช ].yml |
| ๋ํ ํน์ง | ๋ฉฑ๋ฑ์ฑ(Idempotency) — ๊ฐ์ ๋ช ๋ น์ ์ฌ๋ฌ ๋ฒ ์คํํด๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์์ |
์๋ฅผ ๋ค์ด ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ๋ ์์
์ด Playbook์ ํฌํจ๋์ด ์๋ค๋ฉด,
์ด๋ฏธ ํด๋น ๋๋ ํฐ๋ฆฌ๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์ด๋ฏธ ์กฐ๊ฑด์ด ๋ง์กฑ๋จ์ผ๋ก ํ๋จํ๊ณ ์๋ฌ ์์ด ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋๋ค.
์ด๋ฌํ ๋ฉฑ๋ฑ์ฑ ๋๋ถ์, Playbook์ ์ฌ์คํ ์์๋ ์์คํ
์ํ๋ฅผ ์์ ์ ์ผ๋ก ์ ์งํ ์ ์์ต๋๋ค.
Playbook ์ฌ์ฉ ์์
์๋๋ AWS CodeDeploy Agent๋ฅผ ์ค์นํ๋ Playbook์ ์คํํ๋ ์์์ ๋๋ค.
์ด ๋ช
๋ น์ ์คํํ๋ฉด install_codedeploy-agent.yml์ ์ ์๋ ๋ชจ๋ ์์
์ด ์์ฐจ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
๋จ ํ ์ค์ ๋ช
๋ น์ผ๋ก ์ฌ๋ฌ ์๋ฒ์ ๋์ผํ ์ค์ ์ ์๋์ผ๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค.
ansible-playbook install_codedeploy-agent.yml

์๋๋ ์คํ yaml ํ์ผ ๋ด์ฉ์ ๋๋ค.
---
- name: install codeDeploy Agent
hosts: kafka
tasks:
- name: install packages
apt:
update_cache: true # update_cache -> apt update ์ ๋์ผ
pkg:
- 'ruby-full'
- 'wget'
become: yes
- name: create directory
file:
path: /src/code-deploy
state: directory
owner: ubuntu
group: ubuntu
become: yes
- name: download codedeploy install file from S3
get_url:
url: 'https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install'
dest: /src/code-deploy
- name: add execute privilege # ์คํ ๊ถํ ์ถ๊ฐ
file:
path: /src/code-deploy/install
state: file
mode: u+x
- name: run install
command:
cmd: /src/code-deploy/install auto
become: yes
- name: start code deploy service
systemd_service:
state: started
name: codedeploy-agent
enabled: true
์ด๋ฒ ๊ธ์์๋ Ansible์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ์ค์ , ๊ทธ๋ฆฌ๊ณ Playbook์ ๊ธฐ์ด๊น์ง ์ดํด๋ดค์ต๋๋ค.
์ง์ ์ฌ์ฉํด๋ณด๋ ๋จ์ํ ๋ช
๋ น์ ์๋ํํ๋ ๋๊ตฌ๋ฅผ ๋์ด, ์ธํ๋ผ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๊ธฐ๋กํ๋ ์ต๊ด์ ๋ง๋ค์ด์ฃผ๋ ๋๊ตฌ๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
์์ผ๋ก๋ ์ด๋ฐ ์๋ํ์ ํ์ ๋ ๊น์ด ์ดํดํ๊ณ ์ค๋ฌด์ ๋ น์ฌ๊ฐ๊ณ ์ถ์ต๋๋ค.
๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ ์ถ์ฒ : https://www.inflearn.com/course/kafka-spark-realtime-datalake/dashboard
'๊ธฐ๋ก์ ์ต๊ดํํ๋ ๊ฐ๋ฐ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ฆฌํธํ๋ธ ๊นํ๋ธ ์ ์ฅ ํด๋ ๊ฒฝ๋ก ์์ ํ๊ธฐ (0) | 2025.10.24 |
|---|---|
| ํด๋ก๋์ AWS MCP Servers ๋ฑ๋กํ๊ธฐ (0) | 2025.05.14 |
| ํด๋ก๋ MCP ์๋ฒ ์ฌ์ฉํด๋ณด๊ธฐ (์ด๊ธฐ์ธํ ) (1) | 2025.05.12 |
| github๋ก ํ์ ํ๋ ๋ฐฉ๋ฒ (git-flow) (0) | 2025.05.09 |
| ๊นํ๋ธ ๊พธ๋ฏธ๊ธฐ (๊น๊พธ) (1) | 2025.05.05 |