[Ansible] directory 구조
ansible 은 배포 자동화 툴이다. 여러 서버에 동일한 행동을 해야하는 경우, 귀찮기도 하고~ 빼먹은 부분이 있으면 문제가 될 수 있기에 유의해야 한다. 배포 자동화 툴은 여러 가지가 있다고 하지만 나는 ansible 을 통해 구축해보려 한다.
아무것도 모르기에 기초부터 알아보기 위해서 chatGPT 에게 물어보며 공부한 것을 정리해 볼 것이다.
아래는 기본적인 directory 구조라고 한다. 나는 어떤 것을 시작할 때, 기본적인 diretory 구조를 먼저 알아야 이해하기 좋다고 생각하기 때문에 이것을 먼저 물어봤다.
ansible-project/
├── inventory/
│ ├── production
│ └── staging
├── roles/
│ └── <role_name>/
│ ├── tasks/
│ │ └── main.yaml
│ ├── handlers/
│ │ └── main.yaml
│ ├── files/
│ ├── templates/
│ ├── vars/
│ │ └── main.yaml
│ ├── defaults/
│ │ └── main.yaml
│ └── meta/
│ └── main.yaml
├── group_vars/
│ ├── all.yaml
│ └── production.yaml
├── host_vars/
│ └── api1.yaml
├── playbook.yaml
└── ansible.cfg
위 directory 의 의미를 알아보자.
1. inventory/
- 관리 대상의 서버를 관리하는 디렉터리
- control node: ansible 이 설치된 서버
- managed node: 자동화를 통해 배포가 이루어지는 서버
- 예제
# inventory/production
[web] <- [group]
web1 ansible_host=192.168.1.10 <- [host]
web2 ansible_host=192.168.1.11 <- [host]
[db] <- [group]
db1 ansible_host=192.168.1.20 <- [host]2. roles/
- 재사용 가능한 단위 묶음 (nginx 설치, docker 설치 등)
▶ roles/tasks/
- 메인 작업 정의
- 패키지 설치, 사용자 생성, 서비스 시작 등
▶ roles/handlers/
- notify 로 한 번만 호출되는 작업 정의
- 보통 서비스 재시작을 정의한다.
▶ roles/files/
- 설정파일 등 서버에 복사할 파일을 저장하는 directory
▶ roles/templates/
- jinja2 파일을 저장하는 directory
▶ roles/vars/
- 일반 변수 저장 (우선순위 낮음)
▶ roles/vars/
- 디폴트 변수 저장 (우선순위 낮음)
▶ roles/meta/
- 의존 역할(
dependencies) 등 메타데이터 정의
3. group_vars/
- 그룹 단위 변수
- inventory 에서 정의한 그룹에 적용되는 변수를 정의한다.
4. host_vars/
- host 에 적용하는 변수 정의
5. playbook.yaml
- ansible 의 실행 단위
- 어떤 호스트에 어떤 역할을 적용할지 결정
6. ansible.cfg
[defaults]
inventory = ./inventory/production # 인벤토리 경로
remote_user = ubuntu # 원격 접속 사용자
private_key_file = ~/.ssh/my_key.pem # SSH 키
host_key_checking = False # 호스트키 확인 끄기
retry_files_enabled = False # 실패한 호스트 기록 파일 생성 방지
timeout = 30 # SSH 타임아웃
forks = 10 # 동시에 처리할 호스트 수
interpreter_python = auto_silent # python 버전 자동 감지 (권장)
roles_path = ./roles # 역할 경로
[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False
[ssh_connection]
pipelining = True # 성능 향상 옵션
기본 디렉터리 구조는 이쯤에서 알아두고 어떻게 작성하면 될지는 차차 알아가보려고 한다.