Ansible playbook 재사용하는 방법

AnsibleBeginner
지금 연습하기

소개

Ansible 은 인프라 관리 및 구성을 단순화하는 강력한 오픈소스 자동화 도구입니다. 이 튜토리얼에서는 여러 환경에서 인프라를 효율적으로 관리하고 확장할 수 있도록 Ansible playbook 을 재사용 가능하게 만드는 기술을 살펴볼 것입니다.

Ansible Playbook 이해

Ansible 은 여러 시스템을 동시에 관리하고 구성할 수 있는 강력한 오픈소스 자동화 도구입니다. Ansible 의 핵심은 playbook 으로, 대상 호스트에서 실행할 작업 및 구성을 정의하는 YAML 기반 파일입니다.

Ansible Playbook 이란 무엇인가요?

Ansible playbook 은 인프라 전반의 작업 및 구성을 자동화하기 위한 설계도입니다. YAML(YAML Ain't Markup Language) 형식으로 작성되며, 사람이 읽기 쉬운 데이터 직렬화 형식입니다. Playbook 은 하나 이상의 "플레이"로 구성되며, 이는 일련의 대상 호스트에서 수행할 작업을 정의합니다.

Ansible Playbook 의 구조

Ansible playbook 은 일반적으로 다음과 같은 주요 요소로 구성됩니다.

  1. 호스트 (Hosts): 작업이 실행될 대상 시스템.
  2. 작업 (Tasks): 대상 호스트에서 수행할 개별 작업 또는 명령.
  3. 모듈 (Modules): 패키지, 파일, 서비스 등 다양한 작업을 수행하는 데 사용되는 Ansible 의 내장 또는 사용자 정의 모듈.
  4. 변수 (Variables): playbook 전체에서 사용할 수 있는 값으로, 동적이고 재사용 가능한 구성을 가능하게 합니다.
  5. 핸들러 (Handlers): 다른 작업에 의해 트리거되는 특수 작업으로, 서비스를 다시 시작하는 것과 같은 작업을 수행합니다.

Ansible Playbook 실행

Ansible playbook 을 실행하려면 ansible-playbook 명령어를 사용할 수 있습니다. 이 명령어는 playbook 파일을 읽고 정의된 작업을 대상 호스트에서 실행합니다. ansible-playbook 명령어에 다양한 옵션을 전달하여 실행을 사용자 지정할 수 있습니다. 예를 들어, 인벤토리 파일 지정, 변수 설정 등이 가능합니다.

ansible-playbook example_playbook.yml

Ansible playbook 의 기본 개념을 이해하면 인프라 자동화 및 배포, 구성 관리 프로세스를 간소화할 수 있습니다.

재사용 가능한 Playbook 기술

Ansible playbook 을 더욱 재사용하고 유지 관리하기 쉽게 하기 위해 여러 가지 기술을 활용할 수 있습니다. 다음은 주요 접근 방식입니다.

변수 사용

Playbook 에 변수를 통합하는 것은 재사용 가능한 코드를 만드는 기본적인 기술입니다. 변수를 사용하면 playbook 전체에서 사용할 수 있는 동적 값을 정의하여 다양한 환경이나 요구 사항에 더 쉽게 적응할 수 있습니다.

---
- hosts: webservers
  vars:
    app_name: myapp
    app_version: 1.2.3
  tasks:
    - name: Install application
      yum:
        name: "{{ app_name }}-{{ app_version }}"
        state: present

역할 활용

Ansible 역할은 관련 작업, 변수 및 기타 리소스를 재사용 가능한 단위로 캡슐화하는 구조적인 방법을 제공합니다. Playbook 을 역할로 구성하면 코드 재사용을 촉진하고 인프라 자동화의 전반적인 유지 관리성을 향상시킬 수 있습니다.

---
- hosts: webservers
  roles:
    - common
    - nginx
    - myapp

모듈형 Playbook 생성

단일하고 거대한 playbook 대신 자동화를 작고 모듈형 playbook 으로 분할할 수 있습니다. 이렇게 하면 특정 요구 사항에 맞게 서로 다른 playbook 을 혼합하여 사용할 수 있으므로 인프라가 더 유연하고 적응력이 강해집니다.

## common.yml
- hosts: all
  tasks:
    - name: Install required packages
      yum:
        name:
          - vim
          - git
        state: present

## app.yml
- hosts: webservers
  tasks:
    - name: Deploy application
      unarchive:
        src: myapp.tar.gz
        dest: /opt/myapp

포함 및 가져오기 사용

Ansible 은 playbook 을 작고 재사용 가능한 구성 요소로 분할할 수 있는 includeimport 지시문을 제공합니다. 이렇게 하면 자동화를 구성하고 유지 관리 및 업데이트를 더 쉽게 할 수 있습니다.

## main.yml
- import_playbook: common.yml
- import_playbook: app.yml

이러한 기술을 적용하면 더욱 모듈형, 유연하고 재사용 가능한 Ansible playbook 을 만들 수 있으므로 인프라 자동화를 더욱 효율적이고 유지 관리 가능하게 만들 수 있습니다.

실제 환경에서 재사용 가능한 Playbook 적용

재사용 가능한 Ansible playbook 을 만드는 기술을 이해했으니, 이제 실제 시나리오에서 어떻게 적용할 수 있는지 살펴보겠습니다.

시나리오: 웹 애플리케이션 배포

여러 환경 (예: 개발, 스테이징, 프로덕션) 에 걸쳐 웹 애플리케이션을 배포해야 하는 상황을 가정해 보겠습니다. 재사용 가능한 playbook 을 활용하여 배포 프로세스를 간소화할 수 있습니다.

Playbook 구조

Playbook 구조는 다음과 같을 수 있습니다.

site.yml
roles/
  common/
    tasks/
      main.yml
  nginx/
    tasks/
      main.yml
  myapp/
    tasks/
      main.yml
    vars/
      main.yml

site.yml

주 playbook 인 site.yml은 필요한 역할을 포함합니다.

---
- hosts: all
  become: true
  roles:
    - common
    - nginx
    - myapp

common 역할

common 역할은 모든 환경에서 필요한 기본 패키지를 설치합니다.

---
- name: Install required packages
  yum:
    name:
      - vim
      - git
      - epel-release
    state: present

nginx 역할

nginx 역할은 웹 서버를 설정합니다.

---
- name: Install Nginx
  yum:
    name: nginx
    state: present

- name: Start Nginx service
  service:
    name: nginx
    state: started
    enabled: true

myapp 역할

myapp 역할은 웹 애플리케이션의 배포를 처리합니다.

---
- name: Deploy application
  unarchive:
    src: "{{ app_source_url }}"
    dest: /opt/myapp
    remote_src: yes

- name: Start application
  systemd:
    name: myapp
    state: started
    enabled: true

myapp 역할은 애플리케이션 소스 URL 을 지정하기 위해 vars/main.yml에 정의된 변수를 사용합니다.

Playbook 을 재사용 가능한 역할로 구성함으로써 동일한 자동화를 서로 다른 환경에 쉽게 적용할 수 있으므로 인프라 관리에 필요한 시간과 노력을 줄일 수 있습니다.

요약

이 튜토리얼을 마치면 재사용 가능한 Ansible playbook 을 만드는 방법에 대한 확실한 이해를 얻게 되어 인프라 관리 및 DevOps 워크플로우를 간소화할 수 있을 것입니다. 모듈성과 추상화의 원리를 활용하여 다양한 환경과 사용 사례에 쉽게 적응할 수 있는 유연하고 유지 관리 가능한 Ansible playbook 을 구축하는 방법을 배우게 될 것입니다.