1. IaC(Infrastructure as Code)란?
- IaC는 인프라(서버, 네트워크, 스토리지 등)를 코드로 관리하는 방법론입니다.
- 대표적인 장점은 서버 설정, 애플리케이션 설치 등의 작업을 스크립트(코드)로 자동화하여 재현 가능성, 일관성, 확장성을 확보할 수 있다는 점입니다.
- 멱등성(Idempotency): 여러 번 코드를 실행해도 동일한 결과(상태)를 유지하도록 해주는 성질을 의미합니다.
2. Ansible 소개
- Ansible은 에이전트(Agent) 설치가 필요 없는 툴로, SSH를 사용해 원격 서버를 관리합니다.
- Inventory 파일(호스트 목록)과 Playbook(실행할 작업 정의) 두 요소를 중심으로 동작합니다.
- 별도의 대화형 명령(콘솔 상에서 추가 입력을 계속 요구하는 명령어)을 지양하며, 자동화된 방식으로 명령을 실행합니다.
3. Ansible 설치
우분투/데비안 기준 설치 예시:
apt update
apt install -y ansible-core
4. SSH 키 기반 접속 설정
Ansible이 비밀번호 없이 원격 서버에 접속하려면 SSH 키 기반 인증이 필요합니다.
- SSH 키 생성일반적으로 ~/.ssh/id_rsa와 ~/.ssh/id_rsa.pub가 생성됩니다.
-
키 생성 명령어 ssh-keygen
- 원격 서버에 공개키 복사
- ssh-copy-id <사용자>@<원격 서버 IP 또는 호스트명>
- yes를 입력해 호스트를 추가하고, 해당 계정의 비밀번호를 입력하면 공개키가 복사됩니다.
- 이후에는 ssh <사용자>@<원격 서버 IP>로 접속해도 비밀번호 입력 없이 로그인이 가능해집니다.
5. Inventory 파일(호스트 목록) 구성
서버들을 그룹화하여 관리할 수 있는 파일입니다.
all:
hosts:
10.10.10.211:
10.10.10.212:
10.10.10.213:
children:
master:
hosts:
10.10.10.211
data01:
hosts:
10.10.10.212
data02:
hosts:
10.10.10.213
- all 아래에 전체 호스트를 명시하고, 그 하위에 master, data01, data02 등의 그룹을 구성했습니다.
6. Playbook 작성 및 실행
Playbook은 Ansible에서 실제 작업을 정의하는 YAML 파일입니다. 여러 tasks로 구성되어 있고, 실행 순서대로 원격 서버에서 작업을 수행합니다.
6.1 간단 예시: 특정 파일 생성
- hosts: front
tasks:
- name: Test Task
file:
path: /home/test/abcd
state: touch
owner: test
group: test
mode: '0600'
- name: Test2 Task
become: yes # root 권한이 필요한 경우
file:
path: /root/abcd
state: touch
owner: root
group: root
mode: '0600'
- become: yes를 사용하면 sudo를 통해 root 권한으로 작업을 수행합니다.
- Playbook을 실행할 때 --ask-become-pass 옵션을 주면 sudo 비밀번호를 물어봅니다.
실행 명령어
ansible-playbook -i inventory.yml playbook.yml -u <사용자명> --ask-become-pass
6.2 Nginx 설치 예시
- hosts: front
become: yes
tasks:
- name: Install Nginx Server
apt:
name: nginx
state: present
update_cache: yes
- name: Start and Enable Nginx
service:
name: nginx
state: started
enabled: yes
- apt 모듈을 이용해 패키지를 설치하고, service 모듈로 서비스 실행/부팅 시 자동실행 설정을 합니다.
7. Ansible Galaxy
- Ansible Galaxy는 다양한 역할(Roles)을 미리 만들어 공유하는 저장소입니다.
- 필요한 서비스를 Ansible Galaxy에서 찾으면, 설치 후 재사용이 가능합니다.
예: Elasticsearch를 설치하기 위한 elastic.elasticsearch Role
ansible-galaxy install elastic.elasticsearch,v7.17.0
이 후 Playbook에서 해당 롤을 사용할 수 있습니다.
8. Elasticsearch 설치 예시
8.1 사전 준비: Java 설치
ElasticSearch는 Java가 필요합니다. 먼저 모든 노드에 Java를 설치하는 Playbook 예시 java.yml:
- hosts: all
become: yes
tasks:
- name: Install JDK 11
apt:
update_cache: yes
name: openjdk-11-jdk
state: present
실행:
ansible-playbook -i inventory.yml java.yml -u test --ask-become-pass
8.2 Elasticsearch Playbook 작성
playbook.yml 예시:
- hosts: master
roles:
- role: elastic.elasticsearch
vars:
es_heap_size: "1g"
es_config:
cluster.name: "test-cluster"
cluster.initial_master_nodes: "10.10.10.211"
discovery.seed_hosts: ["es1:9300", "es2:9300", "es3:9300"]
http.host: 0.0.0.0
http.port: 9200
node.data: false
node.master: true
transport.host: 0.0.0.0
transport.port: 9300
bootstrap.memory_lock: false
- hosts: data01
roles:
- role: elastic.elasticsearch
vars:
es_data_dirs:
- "/opt/elasticsearch"
es_config:
cluster.name: "test-cluster"
cluster.initial_master_nodes: "10.10.10.211"
discovery.seed_hosts: ["es1:9300", "es2:9300", "es3:9300"]
http.host: 0.0.0.0
http.port: 9200
node.data: true
node.master: false
transport.host: 0.0.0.0
transport.port: 9300
bootstrap.memory_lock: false
- hosts: data02
roles:
- role: elastic.elasticsearch
vars:
es_config:
cluster.name: "test-cluster"
cluster.initial_master_nodes: "10.10.10.211"
discovery.seed_hosts: ["es1:9300", "es2:9300", "es3:9300"]
http.host: 0.0.0.0
http.port: 9200
node.data: true
node.master: false
transport.host: 0.0.0.0
transport.port: 9300
bootstrap.memory_lock: false
주의
- cluster.initial_master_nodes는 실제 마스터 노드 IP나 호스트명을 적어야 합니다.
- discovery.seed_hosts 역시 실제 호스트명 혹은 IP:포트로 적절히 수정해야 합니다.
8.3 /etc/hosts 편집(호스트명 -> IP 매핑)
서버 간 도메인 이름(호스트명)으로 통신 가능하도록 /etc/hosts를 편집할 수 있습니다.
이걸 매니지 노드 3대에 설정 해주어야 합니다.
vi /etc/hosts
아래 내용 추가
10.10.10.211 es1
10.10.10.212 es2
10.10.10.213 es3
이제 es1, es2, es3로 통신할 수 있으므로, Playbook에 discovery.seed_hosts: ["es1:9300", "es2:9300", "es3:9300"] 를 사용 가능합니다.
8.4 플레이북 실행
ansible-playbook -i inventory.yml playbook.yml -u test --ask-become-pass
- Java 설치가 제대로 끝났는지, OS 버전과 ElasticSearch 호환성 등을 먼저 확인해야 합니다.
- 오류 발생 시 주석 처리 혹은 해당 역할(버전 호환성) 설정을 재검토합니다.
9. 자주 겪는 문제와 해결
- SSH 비밀번호를 계속 물어봄
- SSH 키 생성 및 ssh-copy-id가 제대로 완료되었는지 확인합니다.
- Inventory 파일에서 사용자 이름이 맞는지 확인합니다.
- Ubuntu/Debian 버전 호환성 문제
- Elasticsearch Role이 특정 OS 버전과 호환되지 않을 수 있습니다.
- meta/main.yml 혹은 Role 문서를 확인해 현재 OS에서 지원되는지 확인합니다.
- 호스트명을 찾을 수 없음
- /etc/hosts에 설정이 누락되었거나, DNS가 제대로 설정되지 않은 경우입니다.
- IP 주소를 직접 사용하거나 /etc/hosts를 수정합니다.
10. 정리
- Ansible은 SSH 키 기반 인증으로 원격 서버에 명령을 자동화합니다.
- Inventory와 Playbook을 구성해 멱등성 있는 작업을 쉽게 배포할 수 있습니다.
- Ansible Galaxy를 사용하면 자주 쓰이는 서비스(예: Elasticsearch, Nginx, MySQL, etc.)에 대한 Role을 재활용할 수 있어 생산성을 높일 수 있습니다.
- 작업 실행 시에는 -i 옵션으로 Inventory, -u 옵션으로 사용자명, --ask-become-pass로 sudo 비밀번호 입력을 받아 root 권한으로 작업을 진행할 수 있습니다.
- 오류가 발생하면 원인 파악(OS 버전, 패키지 버전, network 설정, 호스트명 등)을 통해 플레이북을 수정 또는 조건을 조정하면 됩니다.
위 과정을 바탕으로 Ansible을 이용한 자동화 및 IaC 구성을 체계적으로 적용해보시기 바랍니다. 필요에 따라 Role, Task, Handler 등을 잘 분리하면 유지보수와 확장에 큰 도움이 됩니다.
'Cloud' 카테고리의 다른 글
[Docker-compose] (0) | 2025.03.10 |
---|---|
[Docker] Docker 란? (0) | 2025.03.10 |
Amazon S3 (0) | 2025.02.16 |
aws ec2 Ubuntu의 systemd에 Java application을 Service로 등록 (0) | 2023.08.02 |