Ansible 역할 테스트 방법

AnsibleBeginner
지금 연습하기

소개

Ansible 은 IT 환경을 손쉽게 관리할 수 있는 강력한 인프라 자동화 도구입니다. Ansible 의 주요 기능 중 하나는 관련된 작업과 구성을 캡슐화하는 역할 (roles) 을 사용하는 것입니다. Ansible 인프라의 안정성과 유지보수성을 확보하기 위해 Ansible 역할을 철저히 테스트하는 것이 필수적입니다. 이 튜토리얼에서는 인기 있는 테스트 프레임워크인 Molecule 을 사용하여 Ansible 역할을 테스트하는 과정을 안내하고, Ansible 역할 테스트 관행을 향상시키는 고급 기술을 살펴볼 것입니다.

Ansible 역할 이해

Ansible 역할은 Ansible 코드를 구성하고 재사용하는 방법입니다. 복잡한 구성 및 배포를 관리하는 구조적인 접근 방식을 제공하여 Ansible 자동화를 유지 관리하고 공유하기 쉽게 합니다.

Ansible 역할이란 무엇인가요?

Ansible 역할은 작업, 변수, 핸들러 및 기타 Ansible 요소를 캡슐화하는 자체 포함 Ansible 코드 단위입니다. 모듈식이고 재사용 가능하도록 설계되어 여러 시스템이나 프로젝트에 동일한 구성을 쉽게 적용할 수 있습니다.

Ansible 역할 사용의 이점

  • 모듈성: 역할은 Ansible 코드를 더 작고 관리하기 쉬운 조각으로 분할하여 이해, 유지 관리 및 공유를 용이하게 합니다.
  • 재사용성: 역할은 여러 프로젝트에서 공유 및 재사용할 수 있어 시간과 노력을 절약합니다.
  • 일관성: 역할은 다양한 시스템이나 환경에서 구성을 일관되게 적용하도록 보장합니다.
  • 확장성: 역할은 인프라가 성장함에 따라 Ansible 자동화를 확장하기 쉽게 합니다.

Ansible 역할의 구조

일반적인 Ansible 역할은 다음 디렉토리로 구성됩니다.

  • tasks: 역할이 수행하는 주요 작업이 포함됩니다.
  • handlers: 작업에서 알림을 받을 수 있는 핸들러를 정의합니다.
  • templates: 구성 파일을 생성하는 데 사용할 수 있는 Jinja2 템플릿을 저장합니다.
  • vars: 역할에서 사용되는 변수를 정의합니다.
  • defaults: 변수의 기본값을 설정합니다.
  • files: 대상 시스템에 복사할 수 있는 파일을 저장합니다.

다음은 간단한 Ansible 역할 구조의 예입니다.

my-role/
├── tasks/
│   └── main.yml
├── handlers/
│   └── main.yml
├── templates/
│   └── config.j2
├── vars/
│   └── main.yml
├── defaults/
│   └── main.yml
└── files/
    └── file.txt

Ansible 역할 사용

Ansible 역할을 사용하려면 roles 지시문을 사용하여 playbook 에 포함할 수 있습니다. 예를 들어:

- hosts: webservers
  roles:
    - my-role

이렇게 하면 webservers 그룹에 my-role 디렉토리에 정의된 작업, 핸들러 및 기타 요소가 적용됩니다.

Molecule 을 이용한 Ansible 역할 테스트

Molecule 은 Ansible 역할을 위한 강력한 테스트 프레임워크입니다. 다양한 환경과 플랫폼에서 Ansible 코드가 예상대로 작동하는지 확인하여 Ansible 역할을 일관되고 안정적으로 테스트하는 방법을 제공합니다.

Molecule 이란 무엇인가요?

Molecule 은 Ansible 역할을 개발 및 테스트하는 데 도움이 되는 오픈소스 프로젝트입니다. Ansible 자동화를 생성, 테스트 및 공유하기 쉽게 하는 도구와 유틸리티 세트를 제공합니다.

Molecule 사용의 이점

  • 일관된 테스트: Molecule 은 다양한 환경에서 역할이 동일한 방식으로 테스트되도록 보장하여 예기치 않은 동작의 위험을 줄입니다.
  • 자동화된 테스트: Molecule 은 테스트 환경 설정, 테스트 실행 및 결과 보고를 자동화하여 시간과 노력을 절약합니다.
  • 개선된 협업: Molecule 은 테스트를 역할의 저장소에 포함할 수 있도록 Ansible 역할을 공유하고 협업하기 쉽게 합니다.
  • 신뢰도 향상: Molecule 은 개발 프로세스 초기에 문제를 발견하여 Ansible 자동화의 전반적인 품질과 신뢰성을 향상시킵니다.

Molecule 시작하기

Molecule 을 시작하려면 시스템에 Ansible 과 Molecule 이 설치되어 있어야 합니다. 새 Ansible 역할을 설정하고 Molecule 을 구성하는 방법의 예는 다음과 같습니다.

## 새 Ansible 역할 생성
ansible-galaxy init my-role

## 새 역할에 대한 Molecule 초기화
cd my-role
molecule init scenario -r my-role -d docker

## Molecule 테스트 실행
molecule test

이렇게 하면 my-role이라는 새 Ansible 역할이 생성되고 Docker 기반 테스트 시나리오로 Molecule 이 초기화됩니다. 그런 다음 특정 요구 사항에 맞게 Molecule 구성 및 테스트를 사용자 지정할 수 있습니다.

Molecule 테스트 시나리오

Molecule 은 Docker, Podman 및 Vagrant 와 같은 다양한 테스트 시나리오를 지원합니다. 개발 및 테스트 요구 사항에 가장 적합한 시나리오를 선택할 수 있습니다.

다음은 Docker 를 사용하는 Molecule 테스트 시나리오의 예입니다.

## molecule/default/molecule.yml
---
dependency:
  name: galaxy
driver:
  name: docker
platforms:
  - name: instance
    image: ubuntu:22.04
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible

이 구성은 ubuntu:22.04 이미지를 사용하여 Docker 기반 테스트 환경을 설정합니다.

고급 Ansible 역할 테스트 기법

Molecule 은 Ansible 역할 테스트를 위한 훌륭한 기반을 제공하지만, 테스트 기능을 향상시키기 위해 추가적인 기법과 도구를 사용할 수 있습니다.

코드 스타일 검사 및 정적 코드 분석

코드 스타일 검사 및 정적 코드 분석은 Ansible 코드에서 일반적인 문제와 권장 사항 위반 사항을 식별하는 데 도움이 될 수 있습니다. ansible-lintyamllint와 같은 도구를 Molecule 테스트에 통합하여 역할이 코딩 표준을 준수하는지 확인할 수 있습니다.

## molecule/default/molecule.yml
---
## ...
provisioner:
  name: ansible
  lint:
    name: ansible-lint
verifier:
  name: ansible
  lint:
    name: yamllint

Testinfra 를 이용한 통합 테스트

Testinfra 는 Python 기반 테스트 프레임워크로, Ansible 적용 후 시스템 상태에 대한 테스트를 작성할 수 있습니다. 복잡한 구성이나 역할의 동작을 검증하는 데 특히 유용합니다.

## molecule/default/tests/test_default.py
import os

import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')


def test_hosts_file(host):
    f = host.file('/etc/hosts')

    assert f.exists
    assert f.user == 'root'
    assert f.group == 'root'

GitHub Actions 를 이용한 지속적 통합 (CI)

Ansible 역할이 일관되게 테스트되도록 하려면 GitHub Actions 와 같은 도구를 사용하여 지속적 통합 (CI) 파이프라인을 설정할 수 있습니다. 이렇게 하면 역할 저장소에 변경 사항이 있을 때마다 Molecule 테스트가 자동으로 실행됩니다.

## .github/workflows/molecule.yml
name: Molecule Tests

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: "3.x"
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install molecule[docker] ansible-lint yamllint
      - name: Run Molecule tests
        run: molecule test
        env:
          MOLECULE_DISTRO: ubuntu2204

이러한 고급 테스트 기법을 결합하여 Ansible 역할에 대한 강력하고 신뢰할 수 있는 테스트 프레임워크를 구축하여 다양한 환경과 시나리오에서 예상대로 작동하는지 확인할 수 있습니다.

요약

이 포괄적인 튜토리얼에서는 강력한 테스트 프레임워크인 Molecule 을 사용하여 Ansible 역할을 효과적으로 테스트하는 방법을 배웁니다. Ansible 역할의 기본 사항을 탐색하고 Molecule 테스트를 설정하고 실행하는 과정에 대해 자세히 알아봅니다. 또한, Ansible 인프라의 품질과 일관성을 보장하기 위한 고급 Ansible 역할 테스트 기법을 발견할 것입니다. 이 튜토리얼을 마치면 Ansible 역할을 자신감 있게 테스트하고 유지 관리하며, Ansible 기반 환경의 전반적인 안정성과 확장성에 기여할 수 있는 지식과 기술을 갖추게 될 것입니다.