2 min read

[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                                # 성능 향상 옵션

기본 디렉터리 구조는 이쯤에서 알아두고 어떻게 작성하면 될지는 차차 알아가보려고 한다.