Ansible - 동적 인벤토리 플러그인 개발 - 1 > Ansible 자료실

본문 바로가기
사이트 내 전체검색

Ansible 자료실

실습 Ansible - 동적 인벤토리 플러그인 개발 - 1

페이지 정보

profile_image
작성자 snow
댓글 0건 조회 2,650회 작성일 25-01-24 09:23

본문

이 게시글에서는 Ansible 동적 인벤토리 개발 가이드에 대한 문서를 살펴보고, 예시만 안내드리는 글입니다.


1. 동적 인벤토리의 개념

Ansible은 클라우드 환경 등 다양한 외부 소스에서 인벤토리 정보를 가져올 수 있도록 해주는 강력한 도구입니다. 이를 위해 inventory plugins(동적 인벤토리 플러그인)을 사용하면, 기존에 정적으로 호스트를 관리하던 방식에서 벗어나, 동적인 환경 변화에 쉽게 대응할 수 있습니다. inventory plugins에 대한 일반적인 내용은 inventory_plugins라는 Ansible 문서를 통해 확인할 수 있습니다. 동적 인벤토리는 Ansible이 플레이북을 실행할 때 필요한 호스트 정보(예: 호스트 이름, 그룹, 변수 등)를 자동으로 수집하고 업데이트해 줍니다.

이러한 특징 덕분에, 수십 혹은 수백 대 이상의 서버가 빠르게 증감하는 환경에서도 효율적으로 호스트와 인벤토리를 관리할 수 있습니다. 특히 클라우드 환경에서처럼 호스트의 생성과 소멸이 빈번하게 이뤄지는 경우, 동적 인벤토리를 통해 각종 환경 설정이나 소프트웨어 배포를 자동화하기가 훨씬 수월해집니다.


2. Ansible이 동적 소스에서 인벤토리를 가져오는 방법

Ansible에서는 여러 가지 방법으로 동적 인벤토리를 구성할 수 있습니다. 대표적으로 inventory plugins을 사용하거나 script inventory plugin을 이용할 수 있는데, 이때 사용되는 프로그래밍 언어에는 제한이 없습니다. 다만 plugin으로 개발할 경우에는 일반적으로 Python을 사용하는 것이 권장됩니다. 기존 문서에 따르면, 동적 인벤토리는 Ansible이 다음과 같은 순서로 가져옵니다:

1) 플레이북 실행 시 -i 옵션 등에 지정된 인벤토리 소스(파일, 경로, 스크립트 등) 확인
2) 해당 소스가 inventory plugins 중 어떤 것과 연결되는지 확인
3) 해당 plugin(또는 inventory script)이 제공하는 JSON 또는 다른 포맷의 호스트 정보를 인벤토리로 변환
4) 캐싱 옵션을 켜둔 경우, 외부 호출 비용 절감을 위해 캐싱된 데이터를 활용

이 과정에서 Ansible은 cloud 소스, YAML/INI 파일 등 다양한 형식을 자동으로 이해할 수 있으며, plugin이 제공하는 핵심 기능(그룹 구성, 변수 적용, 캐싱 등)을 재활용하여 편의성을 극대화합니다.


3. 이전 버전과의 호환성: 스크립트 사용

과거 Ansible 버전에서는 동적 인벤토리를 만들기 위해 직접 스크립트를 작성하고, -i 옵션으로 실행 가능한 파일을 지정하곤 했습니다. 이 스크립트가 올바른 JSON 형식을 출력하면 Ansible이 이를 읽어 들여 인벤토리 정보로 사용했습니다. 현재도 script inventory plugin 형태로 기존 스크립트를 그대로 쓸 수 있으며, Ansible에서 역호환이 보장됩니다.

그러나 직접 스크립트를 작성할 경우, 캐시 기능이나 구성 관리(예: Ansible 설정 파일과의 연동), 동적 변수 및 그룹 구성 등의 기능을 개발자가 직접 구현해야 하는 부담이 있습니다. 반면, inventory plugins 방식을 쓰면 Ansible의 표준 기능을 바로 활용할 수 있어 개발 생산성과 유지 보수 측면에서 훨씬 편리합니다.


4. Inventory plugins의 특징

동적 인벤토리를 Ansible에서 편리하게 다루기 위해서는 inventory plugins을 활용하는 방법이 가장 일반적입니다. inventory plugins는 제어 노드(Ansible이 동작하는 호스트)에서 실행되며, Python으로 작성되어야 합니다. Ansible 문서에서는 "control_node_requirements"를 준수할 것을 권장하고 있습니다. 이는 제어 노드에서 plugin이 실행되기에 필요한 Python 환경 설정 등을 의미합니다.

또한 inventory plugins는 실행 시점이 정해져 있어서, 일반적으로 플레이북 혹은 플레이가 로드되기 전에 인벤토리를 로드해 둡니다. 하지만 "meta: refresh_inventory" 태스크를 통해 인벤토리를 새로고침하면, 플러그인을 다시 실행하여 최신 인벤토리 정보를 다시 받아올 수도 있습니다. 이는 동적으로 변화가 잦은 환경에서 매우 유용합니다.

추가적으로, persistent cache를 사용하면, plugin이 가져온 인벤토리 데이터를 Ansible cache plugin에 저장해두었다가, 필요할 때 빠르게 꺼내 쓸 수 있습니다. 이를 통해 외부 API나 다른 서비스에 잦은 요청을 보내지 않아도 되므로 성능 최적화와 비용 절감에 효과적입니다.


4.1. Inventory sources

"Inventory sources"는 inventory plugins에서 작업할 때 입력으로 주어지는 문자열(소스)입니다. 예를 들어, -i 옵션에 건네주는 인벤토리 파일의 경로나 호스트 리스트, 또는 raw data 등이 여기에 해당합니다. 다음 표는 Ansible에서 제공하는 일부 plugin과 그 plugin이 해석할 수 있는 인벤토리 소스의 예시를 보여줍니다.

 

Plugin 예시 Source 예시
host list inventory plugin 쉼표로 구분된 호스트 목록
yaml inventory plugin YAML 포맷 인벤토리 파일 경로
constructed inventory plugin 구성 정보를 담은 YAML 형식 파일
ini inventory plugin INI 포맷 인벤토리 파일 경로
virtualbox inventory plugin 가상 머신 정보를 담은 YAML 파일 경로
script plugin JSON 형식을 출력하는 실행 파일 경로

위 표에서 보이듯, 단순한 쉼표 구분 호스트 목록부터 YAML, INI, 실행 가능한 스크립트까지 다양한 형태를 인벤토리 소스로 취급할 수 있습니다. 이렇게 유연한 입력 방식을 통해 Ansible은 더 많은 환경에서 인프라 자동화를 손쉽게 적용하도록 지원합니다.


5. 인벤토리 플러그인 개발 방법

Inventory plugins를 직접 개발하려면 Python을 사용해야 합니다. 이는 Ansible에서 plugin이 동작하는 방식과 호환되기 위함입니다. Ansible이 제공하는 다른 plugin 개발 방식(예: "developing_plugins" 문서 참조)과 마찬가지로, inventory plugins를 만들 때도 기본적으로는 비슷한 패턴을 따릅니다. 여기서는 동적 인벤토리를 위한 plugin을 만들 때 주의해야 할 사항을 좀 더 구체적으로 살펴봅니다.

기본적으로 plugin은 Ansible이 플레이북을 시작하기 전에 한 번 실행되어 호스트와 그룹 정보를 읽어들입니다. 만약 실행 중간에 인벤토리를 다시 불러와야 할 때는 "meta: refresh_inventory" 태스크를 활용할 수 있습니다. 또한, plugin에 캐싱 기능을 추가하면, 외부 서비스 호출을 최소화하고 빠른 응답성을 제공할 수 있습니다.


5.1. Python 기반 플러그인 코드 예시

인벤토리 플러그인을 개발할 때 가장 먼저 해야 할 일은 BaseInventoryPlugin 클래스를 상속받는 것입니다. 이는 Ansible이 해당 파일을 플러그인으로 인식하고, 필요한 메서드를 호출할 수 있도록 하기 위함입니다.

다음 예시는 가장 기본적인 형태의 Python 코드 스니펫입니다. 터미널에선 아래 코드를 작성한 파일을 적절한 경로에 배치하고, Ansible 설정에서 inventory plugin path를 지정하면 플러그인을 불러올 수 있습니다.

```python

from ansible.plugins.inventory import BaseInventoryPlugin

class InventoryModule(BaseInventoryPlugin):

  NAME = 'myplugin'# Ansible 내부에서 사용되는 이름

```

위 코드는 plugin의 뼈대를 정의한 것으로, 'myplugin'이라는 이름을 사용합니다. 이는 파일 이름과 일치할 필요는 없지만, 보통은 관리의 편의를 위해 동일하게 맞추는 경우가 많습니다.


5.2. 추가 기능 상속

기본 골격만 가지고는 인벤토리 정보를 실제로 파싱하거나 캐싱하는 등의 기능이 부족합니다. 이를 위해 BaseInventoryPlugin 외에도 Constructable, Cacheable 같은 클래스를 추가로 상속받을 수 있습니다. 예시를 보면 다음과 같습니다.

```python

from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable

class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):

  NAME = 'myplugin'

```

이렇게 다중 상속을 하면, Constructable을 통해 호스트 및 그룹 정보를 더 풍부하게 생성할 수 있고, Cacheable을 이용해 Ansible의 캐시 메커니즘과 연동하여 인벤토리 정보를 효율적으로 저장하고 재사용할 수 있습니다.


5.3. 핵심 메서드: verify_file와 parse

직접 플러그인을 개발할 때 가장 많이 사용하는 메서드는 verify_file, parse 두 가지입니다. verify_file은 이 플러그인이 특정 인벤토리 소스를 처리할 수 있는지(예: 파일 확장자나 특정 형식 여부)를 확인합니다. parse는 실제 인벤토리 정보를 읽어들여 Ansible이 이해하는 형태로 변환하고, add_host, add_group 등의 기능을 통해 인벤토리에 등록하는 역할을 합니다.

예시를 들어, YAML 파일의 확장자가 .yaml이면 parse 메서드를 통해 YAML 파일을 파싱하고, 그 내용을 읽어들여 Ansible에 호스트나 그룹 정보를 전달하는 방식입니다. 이때 필요한 로직을 직접 구현해야 합니다. 만약 외부 API를 통해 호스트 정보를 가져온다면, parse 메서드 내에서 requests 라이브러리 등을 써서 API 응답을 받고, 적절히 파싱한 뒤 add_host 등을 호출하면 됩니다.


6. 실제 예시 실행 및 효과

플러그인을 작성해 두었다면, 실제로 Ansible에서 사용하는 모습을 살펴보는 것이 중요합니다. 다음은 단순한 예시로, -i 옵션에 플러그인 파일을 지정하여 플레이북을 실행하는 명령입니다.

```bash

ansible-playbook -i myplugin_inventory_plugin.yaml my_playbook.yml

```

위 명령을 실행할 시 myplugin_inventory_plugin.yaml 내부의 설정대로 플러그인이 동작하여, 동적 소스로부터 호스트 정보를 가져온 후 캐싱 기능이 활성화되어 있다면 요청 비용을 절감하면서 Ansible이 플레이북을 수행하게 됩니다. 이를 통해 기존 정적 파일 기반 인벤토리 관리보다 훨씬 유연하고 자동화된 인프라 구성이 가능해집니다.


7. 결론

정리하자면, Ansible 동적 인벤토리 개발 가이드는 클라우드 환경 등에서 급격히 변화하는 서버 인프라를 자동화하기 위한 핵심 기능을 제공합니다. 이전 버전에서 사용하던 스크립트 방식도 여전히 유효하지만, inventory plugins를 사용하면 표준화된 Ansible 코드베이스를 통해 캐싱, 설정 관리, 동적 그룹 구성 등 다양한 혜택을 자동으로 누릴 수 있습니다.

또한 Python 기반으로 확장할 수 있으므로, 특정 환경이나 API에 맞는 맞춤형 동적 인벤토리를 작성하기도 쉽습니다. Ansible이 제공하는 BaseInventoryPlugin, Constructable, Cacheable 등을 적절히 상속하고, verify_file, parse 같은 핵심 메서드를 구현함으로써 복잡한 환경에서도 효과적으로 호스트 정보를 수집하고 배포 작업을 수행할 수 있습니다.

따라서 시니어 Ansible 관련 개발자분들은, 기존 정적 인벤토리 방식에 익숙하더라도 동적 인벤토리로 전환함으로써 인프라 자동화 효율을 극대화할 수 있으리라 생각합니다. 실제 사용 환경에 따라 다양한 inventory plugins를 직접 작성하거나, 이미 제공되는 plugin을 활용해 빠르게 결과물을 얻으시길 바랍니다.

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : (주)리눅스데이타시스템
대표이사 : 정정모
본사 : 강남구 봉은사로 114길 40 홍선빌딩 2층
- tel : 02-6207-1160
대전지사 : 유성구 노은로174 도원프라자 5층
- tel : 042-331-1161

접속자집계

오늘
1,165
어제
2,542
최대
8,445
전체
2,035,917
Copyright © www.linuxdata.org All rights reserved.