Ansible을 이용한 동적 및 정적 인벤토리 관리 가이드

이 종합 가이드를 통해 Ansible 인벤토리 관리를 숙달하세요. 정적 INI/YAML 파일과 동적 인벤토리 소스를 모두 사용하여 호스트를 정의하고, 그룹화하고, 확인하는 방법을 배우세요. 자동화가 올바른 시스템을 효과적으로 대상으로 하는지 확인하기 위해 실용적인 예제와 `--graph`, `--host`, `--list`와 같은 필수 `ansible-inventory` 명령어 플래그를 살펴보세요.

Ansible로 동적 및 정적 인벤토리 관리 가이드

Ansible 인벤토리는 한 가지 실용적인 질문에 답합니다: 이 자동화가 어떤 시스템을 대상으로 해야 하는가? 인벤토리가 잘못되면, 좋은 플레이북이라도 잘못된 호스트를 대상으로 하거나, 새 서버를 건너뛰거나, 잘못된 연결 변수를 사용할 수 있습니다.

이 가이드는 정적 인벤토리 파일, 동적 인벤토리 소스, 그리고 Ansible이 예상한 인프라를 올바르게 인식하는지 확인하는 데 도움이 되는 ansible-inventory 검사를 다룹니다.

Ansible 인벤토리 이해하기

핵심적으로, Ansible 인벤토리는 호스트와 그룹의 목록입니다. Ansible은 이 정보를 사용하여 연결하고 작업을 실행할 머신을 결정합니다. 기본 인벤토리 파일 위치는 /etc/ansible/hosts이지만, -i 플래그를 사용하여 모든 Ansible 명령 또는 플레이북에 대해 다른 인벤토리 파일을 지정할 수 있습니다.

인벤토리를 관리하는 두 가지 주요 방법이 있습니다:

  • 정적 인벤토리: 파일(INI 또는 YAML 형식)에서 호스트와 그룹을 수동으로 정의합니다.
  • 동적 인벤토리: 스크립트나 플러그인을 사용하여 클라우드 제공업체(AWS, Azure, GCP), 가상화 플랫폼(VMware) 또는 CMDB와 같은 외부 소스에서 호스트 인벤토리를 동적으로 생성합니다.

정적 인벤토리 파일

정적 인벤토리는 안정적인 서버 세트가 있는 환경에 적합합니다. 일반적으로 INI 유사 형식 또는 YAML로 작성됩니다.

INI 형식

INI 형식에서는 호스트가 나열되고 그룹으로 구성될 수 있습니다. 호스트 또는 그룹에 대한 변수를 정의할 수도 있습니다.

예시 /etc/ansible/hosts (INI 형식):

[webservers]
web1.example.com
web2.example.com ansible_user=deployer

[databases]
db1.example.com
db2.example.com

[all:vars]
ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_python_interpreter=/usr/bin/python3

이 예시에서:

  • [webservers][databases]는 그룹을 정의합니다.
  • web1.example.comweb2.example.comwebservers 그룹 내의 호스트입니다.
  • ansible_user=deployerweb2.example.com에 대한 특정 SSH 사용자를 설정합니다.
  • [all:vars]는 인벤토리의 모든 호스트에 적용되는 변수를 정의합니다.

YAML 형식

YAML 형식은 복잡한 인벤토리 구조와 변수 정의에 더 많은 유연성을 제공합니다.

예시 /etc/ansible/hosts (YAML 형식):

all:
  children:
    webservers:
      hosts:
        web1.example.com:
        web2.example.com:
          ansible_user: deployer
    databases:
      hosts:
        db1.example.com:
        db2.example.com:
  vars:
    ansible_ssh_private_key_file: ~/.ssh/id_rsa
    ansible_python_interpreter: /usr/bin/python3

이 YAML 구조는 INI 예시와 동일한 그룹화 및 변수 할당을 달성합니다.

동적 인벤토리

동적 인벤토리는 서버가 자주 프로비저닝 및 프로비저닝 해제되는 클라우드 네이티브 환경에 필수적입니다. Ansible은 플러그인과 사용자 정의 스크립트를 통해 동적 인벤토리를 지원합니다.

동적 인벤토리 플러그인 사용

Ansible은 인기 있는 클라우드 제공업체 및 서비스를 위한 다양한 내장 동적 인벤토리 플러그인과 함께 제공됩니다. 이를 사용하려면 일반적으로 플러그인과 해당 매개변수를 지정하는 인벤토리 구성 파일(종종 YAML)을 생성합니다.

예시: AWS EC2 동적 인벤토리 구성 (aws_ec2.yml)

plugin: amazon.aws.aws_ec2
regions:
  - us-east-1
  - us-west-2
keyed_groups:
  # EC2 인스턴스 태그별로 인스턴스 그룹화
  - key: tags
    prefix: tag
filters:
  # 실행 중인 인스턴스만 포함
  instance-state-name: running
compose:
  # ansible_host를 개인 IP 주소로 설정
  ansible_host: private_ip_address

이것을 Ansible과 함께 사용하려면 다음과 같은 명령을 실행합니다:

ansible-inventory -i aws_ec2.yml --graph

이 명령은 지정된 리전에서 실행 중인 인스턴스를 AWS에 쿼리하고 태그 및 기타 속성을 기반으로 계층적 그래프로 표시합니다.

많은 클라우드 인벤토리 플러그인에는 적절한 컬렉션이 설치되어 있어야 합니다. AWS EC2의 경우 일반적으로 amazon.aws와 환경, 프로필 또는 인스턴스 역할에 작동하는 AWS 자격 증명이 필요합니다.

사용자 정의 동적 인벤토리 스크립트

내장 플러그인이 요구 사항을 충족하지 못하는 경우, 인벤토리 데이터를 JSON 형식으로 출력하는 고유한 스크립트(예: Python)를 작성할 수 있습니다. 이 스크립트는 실행 가능해야 하며 인벤토리를 나타내는 JSON 객체를 반환해야 합니다.

예시 Python 스크립트 (my_dynamic_inventory.py):

#!/usr/bin/env python

import json

# 인벤토리 데이터 가져오기 시뮬레이션
hosts_data = {
    "_meta": {
        "hostvars": {
            "host1.example.com": {"ansible_user": "admin"},
            "host2.example.com": {"ansible_user": "user"}
        }
    },
    "webservers": {
        "hosts": ["host1.example.com", "host2.example.com"]
    },
    "databases": {
        "hosts": ["db1.example.com"]
    }
}

print(json.dumps(hosts_data))

스크립트를 실행 가능하게 만듭니다:

chmod +x my_dynamic_inventory.py

그런 다음 Ansible과 함께 사용합니다:

ansible-inventory -i my_dynamic_inventory.py --list

ansible-inventory로 인벤토리 관리

ansible-inventory 명령은 인벤토리를 검사하고 관리하기 위한 강력한 유틸리티입니다. 다양한 인벤토리 소스를 구문 분석하고 호스트 및 관련 변수를 표시할 수 있습니다.

활성 호스트 보기

인벤토리의 모든 호스트의 플랫 목록을 보려면:

ansible-inventory -i /path/to/your/inventory --list

이 명령은 그룹 및 호스트 변수를 포함한 전체 인벤토리를 나타내는 JSON 구조를 출력합니다.

시스템 그룹화

정적 인벤토리 예시에서 설명한 것처럼, 그룹화는 특정 머신 세트를 대상으로 지정하는 데 필수적입니다. 다양한 역할(웹 서버, 데이터베이스, 앱 서버), 환경(프로덕션, 스테이징) 또는 인프라에 적합한 논리적 분류에 대한 그룹을 만들 수 있습니다.

Ansible은 인벤토리 파일을 기반으로 자동으로 그룹을 생성합니다. all(모든 호스트 포함) 및 ungrouped(특정 그룹에 할당되지 않은 호스트)와 같은 특수 그룹을 정의할 수도 있습니다.

내장 인벤토리 명령 플래그 사용

ansible-inventory 명령은 자세한 검사를 위한 여러 플래그를 제공합니다:

  • --graph: 인벤토리를 계층적 트리 형식으로 표시하여 그룹과 해당 구성원을 보여줍니다.

    ansible-inventory -i /etc/ansible/hosts --graph
    

    예시 출력:

    @all
    ├──@databases
    │  ├──db1.example.com
    │  └──db2.example.com
    └──@webservers
       ├──web1.example.com
       └──web2.example.com
    
  • --host <hostname>: 특정 호스트와 관련된 모든 변수를 표시합니다.

    ansible-inventory -i /etc/ansible/hosts --host web2.example.com
    

    예시 출력:

    {
        "ansible_user": "deployer",
        "ansible_ssh_private_key_file": "~/.ssh/id_rsa",
        "ansible_python_interpreter": "/usr/bin/python3"
    }
    
  • --list: 전체 인벤토리를 JSON 형식으로 출력합니다. 디버깅하거나 다른 도구와 통합하는 데 유용합니다.

    ansible-inventory -i /etc/ansible/hosts --list
    

팁 및 모범 사례

  • 설명적인 그룹 이름 사용: 그룹 이름을 직관적으로 만드세요(예: production-webservers, staging-appservers).
  • 변수 중앙화: 반복을 피하기 위해 그룹 또는 모든 수준의 vars 섹션에서 공통 변수를 정의하세요.
  • 동적 인벤토리 활용: 클라우드 또는 자주 변경되는 환경의 경우 동적 인벤토리는 필수입니다. 사용 가능한 플러그인을 탐색하세요.
  • 정기적으로 인벤토리 확인: ansible-inventory -i inventory.yml --graph를 사용하여 인벤토리가 예상대로 구성되었는지 확인하세요.
  • 인벤토리 버전 관리: 정적 인벤토리 파일과 동적 인벤토리 구성 스크립트를 코드처럼 취급하고 버전 관리에 저장하세요.

핵심 내용

좋은 인벤토리 관리는 Ansible을 예측 가능하게 유지합니다. 안정적인 호스트에는 정적 파일을, 변화하는 인프라에는 동적 플러그인을 사용하고, 위험한 실행 전에 ansible-inventory -i <source> --graph를 사용하여 잘못된 그룹화나 누락된 호스트를 조기에 발견하세요.