앤서블(Ansible)은 구성 관리, 응용 프로그램 배포, 태스크 자동화 등을 위해 사용되는 오픈 소스 자동화 플랫폼입니다. 기본적으로 앤서블을 사용하면 인프라와 애플리케이션 설정을 자동화할 수 있으며, 복잡한 태스크와 워크플로우를 단순화할 수 있습니다.
사전 준비: Ansible이 동작할 AWS EC2 Instance
디렉토리 구성 전략
ansible/
├── ansible.cfg # 앤서블의 기본 설정 파일. SSH 설정, 기본 인벤토리 파일 위치 등을 지정.
├── hosts # 인벤토리 파일. 관리할 호스트의 주소나 그룹 정보가 들어 있음.
├── main.yml # 메인 플레이북 파일. 어떤 역할이 어느 호스트에 적용될지 정의.
├── roles # 재사용 가능한 태스크 모음인 '역할'을 포함하는 디렉토리.
│ └── nginx # 모든 서버에 공통적으로 적용될 설정을 담당하는 역할.
│ ├── handlers
│ │ └── main.yml # 태스크 수행 후 특정 이벤트에 의해 트리거되는 핸들러들을 정의함 (예: 서비스 재시작).
│ ├── tasks
│ │ └── main.yml # 이 역할에 필요한 실제 작업을 담고 있는 태스크 리스트.
│ ├── templates
│ │ └── nginx.conf.j2 # 설정 파일의 템플릿. Jinja2 형식으로 변수를 포함해 동적으로 파일 생성 가능.
│ └── vars
│ └── main.yml # 역할에 필요한 변수들을 정의. 이 변수들은 해당 역할의 태스크와 템플릿에서 참조 가능.
└── vars
└── main.yaml # 플레이북 전역에서 사용할 변수를 정의하는 파일. 이 변수들은 모든 역할, 태스크에 걸쳐 사용됨.
메인 플레이북 파일: 어떤 역할이 어느 호스트에 적용될지 정의
경로: main.yml
메인 플레이북 파일로서, 다른 역할들을 포함하고 실행 순서, 조건부 실행 등을 제어합니다. 여기에는 어떤 역할이 어떤 호스트 그룹에 적용될지를 정의합니다.
- name: Create AWS AMI with Packer
vars_files:
- vars/main.yml
hosts:
- jeff # all
become: yes
roles:
- nginx
인벤토리 파일: 관리할 호스트의 주소나 그룹 정보가 들어 있음
경로: hosts
앤서블이 태스크를 실행할 대상 호스트들을 지정하는 파일입니다. 여기서 호스트는 개별 서버를 의미하며, 이 파일에서 호스트를 그룹으로 구성하여 관리할 수 있습니다.
[jeff]
10.77.121.161 ansible_ssh_private_key_file=/key.pem
pem key를 이용하여 접속하는 경우 hosts 주소 뒤에 ansible_ssh_private_key_file 항목을 작성합니다. 앤서블 설정 파일에서도 작성할 수 있습니다.
앤서블의 기본 설정 파일 : SSH 설정, 기본 인벤토리 파일 위치 등을 지정
경로: ansible.cfg
[defaults]
inventory = ./hosts # 기본 인벤토리 파일 경로를 지정합니다.
roles_path = ./roles # 사용할 역할의 경로를 지정합니다.
설정 파일 참고
## 아래는 예시[defaults]
inventory = ./hosts # 기본 인벤토리 파일 경로를 지정합니다.
roles_path = ./roles # 사용할 역할의 경로를 지정합니다.
remote_user = ubuntu # 원격 서버에 접속할 때 사용할 기본 사용자 이름입니다.
private_key_file = /path/to/private/key # SSH 키 기반 인증을 사용할 때의 키 파일 경로입니다.
host_key_checking = False # SSH 호스트 키 검증을 비활성화합니다. (처음 접속 시 호스트 키를 수락할지 묻는 것을 생략합니다.)
retry_files_enabled = False # 태스크 실패 시 재시도 파일 생성을 비활성화합니다.
[privilege_escalation]
become = True # 필요시 sudo를 사용하여 권한 상승을 활성화합니다.
become_method = sudo # 권한 상승 방식으로 sudo를 사용합니다.
become_user = root # 권한 상승 시 전환할 사용자입니다.
become_ask_pass = False # sudo 실행 시 비밀번호 입력을 묻지 않습니다.
[persistence]
retry_files_save_path = ~/.ansible-retry # 재시도 파일을 저장할 경로를 지정합니다.
[ssh_connection]
scp_if_ssh = True # SSH 연결 시 scp를 사용하여 파일을 복사합니다.
pipelining = False # 성능 향상을 위해 SSH 파이프라이닝을 사용합니다.
전역 변수 설정
경로: vars/main.yaml
플레이북의 모든 역할과 태스크에서 사용될 수 있는 전역 변수를 정의합니다. 이 파일은 플레이북 전반에 걸쳐 공통적으로 적용되는 변수 값을 지정하는 데 사용됩니다.
---
username: jeff
태스크 정의: 역할에 필요한 실제 작업을 담고 있는 태스크
경로: roles/nginx/tasks/main.yml
Nginx 역할에 필요한 실제 태스크들을 정의합니다. 이 파일에는 패키지 설치, 파일 복사, 서비스 시작과 같은 작업이 정의됩니다.
---
- name: apt update
apt:
update_cache: yes
- name: Add User for Nginx
user:
name: "{{ username }}"
shell: /bin/bash
home: /home/{{ username }}
createhome: yes
- name: Install Nginx
apt:
name: nginx
state: present
- name: Copy Nginx Configuration
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: # 헨들러 호출
- Daemon reload
- Restart nginx
핸들러 정의: 태스크 수행 후 특정 이벤트에 의해 트리거함 (예: 서비스 재시작)
경로: roles/nginx/handlers/main.yml:
서비스 재시작, 설정 파일 재로드와 같이 특정 태스크 실행 후에 트리거되어야 하는 액션을 정의하는 핸들러들의 리스트를 포함합니다. 예를 들어, nginx 설정 파일이 변경되었을 때 nginx 서비스를 재시작하는 핸들러가 여기에 포함될 수 있습니다.
---
- name: Daemon reload
systemd:
daemon_reload: yes
- name: Restart nginx
service:
name: nginx
state: restarted
템플릿 정의: 설정 파일의 템플릿. Jinja2 형식으로 변수를 포함해 동적으로 파일 생성 가능
경로: roles/common/templates/nginx.conf.j2
nginx 서비스를 위한 설정 파일의 템플릿입니다. .j2 확장자는 Jinja2 템플릿 엔진을 사용하여 작성되었음을 나타냅니다. 이 파일을 통해 각 호스트의 특정 변수에 따라 동적으로 설정 파일을 생성할 수 있습니다.
다음과 같은 형식으로 변수를 설정하고 사용할 수 있습니다: {{ nginx_worker_connections }}
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections {{ nginx_worker_connections }};
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # SSL 설정 (필요에 따라 변경 가능)
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
# 여기에 추가적인 서버 블록(예: virtual hosts)을 추가할 수 있습니다.
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
}
지역 변수 정의: 이 변수들은 해당 역할의 태스크와 템플릿에서 참조 가능
경로: roles/common/vars/main.yml
Nginx 역할에 특화된 변수들을 정의하는 파일입니다. 이 변수들은 Nginx 역할의 태스크들과 템플릿 파일에서 참조됩니다.
---
nginx_worker_connections: 1024
EC2 인스턴스에 Ansible 플레이북 실행하기
Dry Run 실행하기 (check 모드)
실제로 변경을 적용하기 전에 예상되는 변경 사항을 확인하려면 check 모드를 사용합니다.
ansible-playbook -i hosts -u ubuntu main.yml --check
Ansible Playbook 실행하기
➜ ansible-playbook -i hosts -u ubuntu main.yml -v
아래와 같이 Task에 단계별 성공 여부와 결과를 확인할 수 있습니다.
'IaC > Ansible' 카테고리의 다른 글
[Ansible]CLI 사용법: Ansible을 활용한 서버 관리 기초 (0) | 2023.11.04 |
---|