Post

앤서블 사용해보기

앤서블 사용해보기

Ansible이란?

Ansible은 에이전트가 필요 없는(Agentless) 오픈소스 자동화 도구이다 SSH 프로토콜을 통해 원격 서버에 접속하여 소프트웨어 설치, 설정 변경, 서비스 관리 등 다양한 작업을 수행 YAML 형식의 플레이북(Playbook)을 사용하여 복잡한 작업들을 순서대로 쉽게 정의하고 실행할 수 있다

 

1. 기본 프로젝트 구조

1
2
3
4
5
6
7
8
ansible_project/
├── inventory/
│   └── hosts.ini         # 관리할 서버(호스트) 목록 정의
├── roles/
│   └── docker/           # 도커 설치 역할
│       └── tasks/
│           └── main.yml  # 도커 설치 작업 정의
└── playbook.yml          # 전체 작업을 지시하는 메인 플레이북
  • inventory/: 어떤 서버를 관리할 것인지 정의하는 인벤토리 파일이 위치
  • roles/: 관련된 작업들의 묶음인 ‘역할(Role)’을 정의하는 곳 역할 단위로 작업을 분리하면 재사용성이 높아지고 관리가 편해짐
  • playbook.yml: 어떤 호스트 그룹에 어떤 역할을 적용할지 정의하는 최상위 실행 파일

 

2. 핵심 파일 작성 방법

1) 인벤토리 (Inventory)

inventory/hosts.ini 파일은 Ansible이 접속하고 관리할 서버들의 목록을 정의한다

  • 목적: 관리 대상 서버를 그룹으로 묶고, 그룹별 또는 호스트별 변수를 설정
  • 작성법:
    • [그룹이름] 형식으로 서버 그룹을 정의
    • 그룹 아래에 서버의 IP 주소나 도메인 이름을 나열
    • [그룹이름:vars] 형식으로 해당 그룹에만 적용될 변수를 정의할 수 있다

예시: inventory/hosts.ini

1
2
3
4
5
6
7
8
9
10
# 도커를 설치할 서버 그룹
[docker_hosts]
192.168.1.10
192.168.1.11

# 모든 호스트에 공통으로 적용될 변수
[all:vars]
ansible_user=adminuser # SSH 접속 시 사용할 사용자 이름
ansible_ssh_private_key_file=~/.ssh/id_rsa # SSH 개인 키 경로
ansible_python_interpreter=/usr/bin/python3

2) 역할 (Roles)

roles/ 디렉터리 안에는 각 기능별로 독립된 하위 디렉터리가 있다

  • 목적: 특정 기능(예: 도커 설치)과 관련된 모든 작업을 하나의 단위로 묶어 재사용성을 높인다
  • 주요 하위 디렉터리:
    • tasks/main.yml: (필수) 해당 역할이 수행할 실제 작업 목록을 정의
    • handlers/main.yml: (선택) 특정 조건에서만 실행될 작업을 정의 (예: 서비스 재시작)
    • templates/: (선택) 설정 파일의 원본 템플릿(.j2 확장자)을 저장
    • vars/main.yml: (선택) 해당 역할에서만 사용할 변수를 정의
    • defaults/main.yml: (선택) 역할의 기본 변수 값을 정의

예시: roles/docker/tasks/main.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 이 파일은 도커를 설치하고 실행하는 작업을 정의합니다.
- name: Install prerequisite packages for Docker
  apt:
    name:
      - apt-transport-https
      - ca-certificates
      - curl
      - software-properties-common
    state: present
    update_cache: yes

- name: Add Docker's official GPG key
  apt_key:
    url: https://download.docker.com/linux/ubuntu/gpg
    state: present

- name: Add Docker repository
  apt_repository:
    repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu  stable
    state: present

- name: Install Docker Engine
  apt:
    name:
      - docker-ce
      - docker-ce-cli
      - containerd.io
    state: present
    update_cache: yes

- name: Ensure Docker service is started and enabled
  service:
    name: docker
    state: started
    enabled: yes

3) 플레이북 (Playbook)

playbook.yml 파일은 프로젝트의 최상위에서 모든 것을 조립하고 실행 순서를 결정하는 지휘자 역할

  • 목적: 어떤 호스트 그룹에 어떤 역할을 적용할지 매핑
  • 작성법:
    • hosts: 인벤토리에 정의된 호스트 그룹 이름을 지정
    • become: yes: 작업을 일반 사용자로 접속한 뒤 sudo와 같은 권한 상승을 통해 root 권한으로 실행하도록 설정
    • roles: 해당 호스트 그룹에 적용할 역할 목록을 나열

예시: playbook.yml

1
2
3
4
5
6
# docker_hosts 그룹에 도커 설치 역할을 적용
- name: Install Docker on servers
  hosts: docker_hosts
  become: yes
  roles:
    - docker  # docker 역할을 적용

 

3. 실행 방법

모든 파일 작성이 완료되면, 터미널에서 ansible-playbook 명령어를 사용하여 플레이북을 실행

  1. 프로젝트의 최상위 디렉터리로 이동합니다.

  2. 아래 명령어를 실행합니다.

    1
    
    ansible-playbook -i inventory/hosts.ini playbook.yml
    
    • -i inventory/hosts.ini: 사용할 인벤토리 파일을 명시적으로 지정
    • playbook.yml: 실행할 메인 플레이북 파일을 지정
  3. 실행 결과 확인: Ansible은 플레이북에 정의된 작업들을 순서대로 실행하며, 각 작업의 성공, 실패, 변경 여부를 색상으로 표시해 준다

This post is licensed under CC BY 4.0 by the author.