소개
Ansible 은 시스템 구성 및 관리 프로세스를 단순화하는 강력한 IT 자동화 도구입니다. 이 튜토리얼에서는 Ansible 모듈을 활용하여 인프라를 효율적으로 배포 및 유지 관리하는 방법을 살펴볼 것입니다. 이 가이드를 마치면 Ansible 의 기능에 대한 확실한 이해를 얻고 시스템 구성 작업을 자동화할 준비가 될 것입니다.
Ansible 기본 이해
Ansible 이란 무엇인가?
Ansible 은 오픈소스 소프트웨어 프로비저닝, 구성 관리 및 애플리케이션 배포 도구입니다. 수동 프로세스 대신 구성 파일을 정의하고 버전 관리하여 IT 인프라를 관리하는 인프라 코드 (Infrastructure as Code) 를 가능하게 합니다.
주요 Ansible 개념
- 인벤토리 (Inventory): Ansible 은 관리할 호스트 (서버, 네트워크 장치 등) 를 정의하는 인벤토리 파일을 사용합니다.
- 모듈 (Modules): Ansible 은 파일, 패키지, 서비스 등 다양한 작업을 수행할 수 있는 다수의 내장 모듈을 제공합니다.
- 플레이북 (Playbooks): Ansible 플레이북은 YAML 형식의 파일로, 관리 대상 호스트에서 실행될 작업을 포함하여 인프라의 원하는 상태를 정의합니다.
- 롤 (Roles): Ansible 롤은 관련 작업, 변수, 파일 및 템플릿을 재사용 가능한 패키지로 묶는 방법입니다.
Ansible 아키텍처
Ansible 은 제어 노드 (Ansible 명령을 실행하는 머신) 가 SSH 를 통해 관리 노드 (구성 대상 호스트) 와 통신하는 클라이언트 - 서버 아키텍처를 사용합니다.
graph TD
A[제어 노드] --> B[관리 노드 1]
A[제어 노드] --> C[관리 노드 2]
A[제어 노드] --> D[관리 노드 3]
Ansible 설치 및 구성
Ubuntu 22.04 시스템에 Ansible 을 설치하려면 다음 명령어를 사용할 수 있습니다.
sudo apt update
sudo apt install -y ansible
설치 후 관리 대상 호스트를 정의하기 위해 Ansible 인벤토리 파일 (/etc/ansible/hosts) 을 구성할 수 있습니다.
Ansible 플레이북 기본
Ansible 플레이북은 YAML 형식의 파일로 인프라의 원하는 상태를 정의합니다. 다음은 관리 대상 호스트에 Apache 웹 서버를 설치하는 예시 플레이북입니다.
- hosts: webservers
tasks:
- name: Apache 설치
apt:
name: apache2
state: present
- name: Apache 서비스 시작
service:
name: apache2
state: started
enabled: yes
이 플레이북은 webservers 그룹의 호스트에 Apache 웹 서버를 설치하고 서비스가 실행되고 활성화되도록 합니다.
Ansible 모듈로 시스템 구성
Ansible 모듈 이해
Ansible 모듈은 Ansible 플레이북의 구성 요소입니다. 파일, 패키지, 서비스 등 다양한 작업을 수행하기 위해 원격 호스트에서 실행되는 특정 코드 단위입니다.
Ansible 은 다양한 내장 모듈을 제공하며, 사용자 정의 모듈을 통해 Ansible 의 기능을 확장할 수도 있습니다.
일반적인 Ansible 모듈
다음은 가장 일반적으로 사용되는 Ansible 모듈입니다.
| 모듈 | 설명 |
|---|---|
apt |
Debian/Ubuntu 시스템의 패키지 관리 |
file |
파일 및 디렉토리 상태 관리 |
service |
시스템 서비스 관리 |
user |
사용자 계정 관리 |
cron |
cron 작업 관리 |
copy |
원격 호스트로 파일 복사 |
template |
원격 호스트에서 템플릿 파일 렌더링 |
플레이북에서 Ansible 모듈 사용
플레이북에서 Ansible 모듈을 사용하려면 모듈 및 매개변수를 지정하는 작업을 정의합니다. 다음은 Ubuntu 22.04 시스템에서 nginx 패키지를 설치하는 apt 모듈을 사용하는 예입니다.
- hosts: webservers
tasks:
- name: Nginx 설치
apt:
name: nginx
state: present
이 작업은 webservers 그룹의 호스트에 nginx 패키지가 설치되도록 합니다.
Ansible 모듈에 인수 전달
Ansible 모듈은 종종 동작을 사용자 지정하기 위한 다양한 인수를 받습니다. 예를 들어, file 모듈은 특정 권한을 가진 디렉토리를 생성하는 데 사용할 수 있습니다.
- hosts: all
tasks:
- name: 디렉토리 생성
file:
path: /opt/myapp
state: directory
owner: myapp
group: myapp
mode: "0755"
이 작업은 /opt/myapp 디렉토리를 생성하고 소유자 및 그룹을 myapp으로 설정하며 권한을 0755로 설정합니다.
오류 처리 및 항상성
Ansible 모듈은 항상성을 갖도록 설계되어 있습니다. 즉, 동일한 작업을 여러 번 실행해도 한 번 실행한 것과 동일한 효과를 냅니다. 이는 작업이 여러 번 실행되더라도 원하는 상태가 달성되도록 하는 데 도움이 됩니다.
또한 Ansible 모듈은 오류를 적절하게 처리하여 작업 실패 시 작업 건너뛰기 또는 전체 플레이북 실패와 같은 방법으로 처리하는 방식을 정의할 수 있습니다.
Ansible 모듈 배포 실습
환경 준비
Ansible 모듈을 사용하기 전에 제어 노드와 관리 노드가 제대로 구성되어 있는지 확인해야 합니다. 이미 제어 노드에 Ansible 이 설치되어 있다고 가정하고, 인벤토리 파일을 구성해 보겠습니다.
- Ansible 인벤토리 파일 (
/etc/ansible/hosts) 을 열고 관리 호스트를 추가합니다.
[webservers]
web01 ansible_host=192.168.1.100
web02 ansible_host=192.168.1.101
[databases]
db01 ansible_host=192.168.1.200
- 다음 명령어를 실행하여 관리 호스트에 대한 연결을 확인합니다.
ansible all -m ping
이 명령어는 인벤토리의 모든 호스트에 ping 을 보내 Ansible 이 호스트와 통신할 수 있는지 확인합니다.
apt 모듈을 사용한 패키지 배포
apt 모듈을 사용하여 webservers 그룹에 Apache 웹 서버를 배포해 보겠습니다.
- hosts: webservers
tasks:
- name: Apache 설치
apt:
name: apache2
state: present
- name: Apache 서비스 시작
service:
name: apache2
state: started
enabled: yes
이 플레이북을 apache.yml로 저장하고 다음 명령어로 실행합니다.
ansible-playbook apache.yml
이 플레이북은 Apache 패키지를 설치하고 webservers 호스트에서 서비스가 실행되고 활성화되도록 합니다.
copy 및 template 모듈을 사용한 파일 배포
Ansible 은 copy 모듈을 사용하여 제어 노드에서 관리 호스트로 파일을 복사하고, template 모듈을 사용하여 관리 호스트에서 Jinja2 템플릿을 렌더링합니다.
파일 복사 및 템플릿 렌더링 예시는 다음과 같습니다.
- hosts: webservers
tasks:
- name: 파일 복사
copy:
src: files/index.html
dest: /var/www/html/index.html
- name: 템플릿 렌더링
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/conf.d/default.conf
이 플레이북을 실행하기 전에 제어 노드에 files/index.html 및 templates/nginx.conf.j2 파일을 생성해야 합니다.
오류 처리 및 항상성
Ansible 모듈은 항상성을 갖도록 설계되어 있습니다. 즉, 동일한 작업을 여러 번 실행해도 한 번 실행한 것과 동일한 효과를 냅니다. 이는 작업이 여러 번 실행되더라도 원하는 상태가 달성되도록 하는 데 도움이 됩니다.
또한 Ansible 모듈은 오류를 적절하게 처리하여 작업 실패 시 작업 건너뛰기 또는 전체 플레이북 실패와 같은 방법으로 처리하는 방식을 정의할 수 있습니다.
오류 처리 예시는 다음과 같습니다.
- hosts: all
tasks:
- name: 디렉토리 생성
file:
path: /opt/myapp
state: directory
owner: myapp
group: myapp
mode: "0755"
ignore_errors: yes
- name: 메시지 출력
debug:
msg: "디렉토리 생성 실패, 하지만 플레이북은 계속됩니다."
이 예제에서 디렉토리 생성 작업이 실패하면 플레이북은 다음 작업 (메시지 출력) 을 계속 실행합니다.
요약
Ansible 은 IT 인프라 관리 방식을 혁신할 수 있는 다재다능하고 강력한 도구입니다. Ansible 모듈을 활용하여 시스템 구성을 간소화하고, 반복적인 작업을 자동화하며, 환경 전반에 걸쳐 일관성을 보장할 수 있습니다. 이 튜토리얼은 시스템 구성 요구 사항에 Ansible 을 효과적으로 사용하기 위한 지식과 실습 경험을 제공했습니다.


