첫 Playbook 작성하기

AnsibleBeginner
지금 연습하기

소개

이전 실습에서는 단일 명령 (ansible ... -m ping) 을 실행했습니다. 빠른 확인에는 유용하지만 Ansible 의 진정한 강점은 Playbook에 있습니다.

playbook은 자동화 지침을 담은 텍스트 파일입니다. 일반적인 셸 스크립트와 달리, playbook 은 보통 각 하위 명령 단계를 모두 지정하기보다 원하는 최종 상태에 초점을 맞춥니다.

이러한 원하는 상태 모델은 Ansible 의 가장 중요한 개념 중 하나입니다. "이 명령들을 정확히 실행하라"고 지시하는 대신, 자동화가 완료되었을 때 충족되어야 하는 조건을 설명합니다.

Playbook 은 사람이 읽기 쉬운 데이터 형식인 YAML로 작성합니다. 따라서 자동화 구성을 검토하고 공유하고 유지 관리하기가 더 쉽습니다.

이 실습에서는 다음 작업을 수행하여 서버를 웹 서버로 구성하는 playbook 을 작성합니다.

  1. 인기 있는 웹 서버인 Nginx를 설치합니다.
  2. Nginx 서비스가 실행 중인지 확인합니다.

그런 다음 이 playbook 을 실행하여 로컬 머신을 구성합니다.

Playbook 파일 만들기

먼저 playbook 파일을 만듭니다. 일반적으로 기본 playbook 의 이름은 site.yml로 지정합니다.

먼저 프로젝트 디렉터리에 있는지 확인합니다.

cd ~/project

이제 nano 텍스트 편집기를 사용하여 site.yml이라는 새 파일을 만들고 엽니다.

nano site.yml

파일의 맨 위에 하이픈 3 개를 입력합니다. 이 표시는 YAML 문서의 시작을 나타냅니다.

---

기억해야 할 YAML 규칙:

  • 들여쓰기가 매우 중요합니다! 탭이 아니라 공백을 사용해야 합니다. 일반적으로 공백 2 개를 사용합니다. 들여쓰기가 잘못되면 Ansible 에서 오류가 발생합니다.
  • 파일을 자주 저장합니다. nano에서는 Ctrl+O를 누른 다음 Enter를 눌러 저장합니다. 다음 단계를 위해 파일은 계속 열어 둡니다.

Play 정의하기

Playbook 은 하나 이상의 "play"로 구성됩니다. play는 작업을 실행할 호스트 그룹과 실행할 작업을 연결합니다.

호스트 그룹과 작업을 연결하기 때문에 하나의 playbook 을 한 대의 머신부터 여러 대의 머신까지 확장할 수 있습니다. 로직은 한 곳에 유지하고, 인벤토리가 적용 대상을 결정합니다.

site.yml 파일에서 --- 아래에 다음 줄을 추가합니다.

---
- hosts: webservers
  become: yes

코드 이해하기:

  • - hosts: webservers: Ansible 에 인벤토리의 [webservers] 그룹에 등록된 모든 서버에서 이 지침을 실행하라고 지정합니다.
  • become: yes: 명령 앞에 sudo를 입력하는 것과 같습니다. 소프트웨어 설치에 필요한 root 권한을 Ansible 에 부여합니다.

- hosts가 줄의 맨 처음에서 시작하는지 확인합니다. 하이픈 앞에 공백을 넣지 않습니다.

파일을 저장합니다 (Ctrl+O, Enter).

설치 작업 추가하기

이제 Ansible 에 무엇을 할지 지정해야 합니다. 작업 (tasks) 목록을 추가하여 지정합니다. 각 작업은 **모듈 (module)**을 사용합니다.

현재 Ubuntu 환경이므로 apt 모듈을 사용하여 Nginx 를 설치합니다.

site.yml이 다음과 같이 보이도록 수정합니다.

---
- hosts: webservers
  become: yes
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

코드 이해하기:

  • tasks:: 작업 목록을 시작합니다.
  • - name: ...: 사람이 이해하기 위한 설명입니다. playbook 을 실행하면 이 내용이 화면에 표시됩니다.
  • apt:: apt 모듈을 호출합니다.
  • name: nginx: 설치할 패키지를 지정합니다.
  • state: present: 핵심적인 "선언적" 부분입니다. "지금 설치하라"고 지시하는 것이 아니라 "해당 패키지가 존재하도록 보장하라"고 지정합니다.
    • 패키지가 없으면 Ansible 이 설치합니다.
    • 이미 설치되어 있으면 Ansible 은 아무 작업도 하지 않습니다. 이 특성을 **멱등성 (Idempotency)**이라고 합니다.

멱등성은 구성 관리의 핵심 개념입니다. 동일한 자동화를 반복해서 실행해도 부작용이 중복되지 않고 일관된 결과를 안전하게 얻을 수 있다는 뜻입니다.

들여쓰기를 확인합니다.

  • tasks는 become과 같은 위치에 있어야 합니다.
  • - name은 들여써야 합니다 (공백 2 개).
  • apt는 name과 같은 위치에 있어야 합니다.
  • name과 state는 apt 아래에서 한 단계 더 들여써야 합니다.

파일을 저장합니다.

서비스 작업 추가하기

소프트웨어를 설치하는 것만으로는 충분하지 않습니다. 프로그램이 실행 중인지 확인해야 합니다. 이를 위해 service 모듈을 사용합니다.

이 과정에서는 playbook 이 시스템 상태를 여러 계층으로 표현하는 방법도 확인할 수 있습니다. 한 작업은 패키지가 존재하도록 보장하고, 다른 작업은 서비스가 활성 상태인지 보장합니다. 두 작업이 함께 호스트가 도달해야 하는 최종 상태를 정의합니다.

site.yml의 작업 목록에 두 번째 작업을 추가합니다.

---
- hosts: webservers
  become: yes
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

    - name: Start nginx
      service:
        name: nginx
        state: started

코드 이해하기:

  • service:: systemctl과 같은 시스템 서비스를 관리하는 모듈입니다.
  • state: started: 서비스가 실행 중인지 확인합니다. 서비스가 중지되어 있으면 Ansible 이 시작합니다.

중요: 두 번째 작업의 -는 첫 번째 작업의 -와 정확히 같은 위치에 있어야 합니다.

nano에서 저장하고 종료합니다 (Ctrl+X, Y, Enter 순서).

Playbook 실행하기

이제 자동화를 실행합니다.

ansible-playbook 명령을 사용합니다. 실행할 playbook(site.yml) 과 사용할 인벤토리 (hosts.ini) 를 지정해야 합니다.

다음 명령을 실행합니다.

ansible-playbook site.yml -i hosts.ini

출력을 확인합니다. 다음 항목이 표시됩니다.

  1. Gathering Facts: 먼저 Ansible 이 시스템 정보를 확인합니다.
  2. Install nginx: 패키지를 설치해야 하므로 changed(노란색) 가 표시됩니다.
  3. Start nginx: 서비스를 시작해야 했다면 changed(노란색) 가 표시됩니다.

정확히 같은 명령을 두 번째로 실행하면 출력이 녹색으로 표시되고 ok가 나타납니다. 이는 "모든 항목이 이미 원하는 상태이므로 아무것도 변경하지 않았다"는 뜻입니다.

마지막으로 다음 명령을 실행하여 Nginx 가 실행 중인지 직접 확인합니다.

systemctl status nginx

Active: active (running)이 표시되어야 합니다.

요약

이 실습에서는 첫 Ansible Playbook을 작성했습니다. 다음 내용을 배웠습니다.

  1. YAML 구문: 올바른 들여쓰기로 playbook 을 구성하는 방법
  2. Play: hosts(실행 위치) 와 become(sudo 사용) 정의하기
  3. 작업: apt(설치) 와 service(시작) 같은 모듈 사용하기
  4. 멱등성: playbook 을 여러 번 실행해도 안전하고 일관된 상태를 유지하는 개념

이제 수동으로 명령을 실행하는 방식에서 벗어나 "코드로서의 인프라 (Infrastructure as Code)"를 정의하는 단계로 나아갔습니다.