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

본문 바로가기

사이트 내 전체검색

뒤로가기 Ansible 자료실

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

페이지 정보

작성자 snow 작성일 25-01-31 09:55 조회 2,663 댓글 0

본문

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


1. Ansible 동적 인벤토리 플러그인이란

Ansible을 다뤄본 분들이라면 정적 인벤토리를 사용하는 경험이 많으실 것입니다. 하지만 시스템 규모가 커지고 동적으로 서버나 호스트 목록이 바뀌는 환경에서는 매번 인벤토리를 수정하기가 번거롭습니다. 이런 상황에서 동적 인벤토리 플러그인을 사용하면 실시간으로 호스트 정보를 가져올 수 있어 유연하고 효율적인 환경 구성이 가능합니다.

동적 인벤토리 플러그인은 기본적으로 파이썬 기반으로 작성되며, Ansible 실행 시 특정 소스(파일, API, 데이터베이스 등)에서 호스트 정보를 동적으로 읽어와 인벤토리를 생성합니다. 이 글에서는 verify_file 메서드와 parse 메서드 같은 핵심 함수를 어떻게 구현하고 활용하는지 살펴보겠습니다.


1.1. verify_file 메서드

verify_file 메서드는 Ansible이 해당 플러그인 파일(혹은 경로)이 실제로 이 플러그인을 통해 처리 가능한 것인지 신속하게 판별하는 역할을 합니다. 예를 들어 특정 확장자를 가진 YAML 파일일 때만 참으로 판별하도록 설정하거나, 콤마(,)가 포함된 문자열만 체크하도록 만드는 등 다양한 조건을 사용할 수 있습니다.

기본적으로 Ansible이 이 메서드를 통해 "이 소스가 내 플러그인을 위한 파일인지 아닌지"를 빠르게 가려낸 뒤, 맞다고 판단되면 실제 parse 과정으로 넘어가는 방식입니다. 여러 가지 동적 인벤토리 플러그인이 동시에 활성화돼 있을 수 있으므로, 불필요하게 자신과 무관한 파일을 처리하지 않도록 필터링하는 데 유용합니다.

다음은 Ansible 공식 문서에서 소개된 예시 코드입니다. virtualbox_inventory 플러그인의 코드 일부이며, 특정 파일 확장자(virtualbox.yaml, virtualbox.yml, vbox.yaml, vbox.yml)에만 반응하도록 설계되었습니다.

```python

def verify_file(self, path):

  valid = False

  if super(InventoryModule, self).verify_file(path):

    if path.endswith(('virtualbox.yaml', 'virtualbox.yml', 'vbox.yaml', 'vbox.yml')):

      valid = True

  return valid

```

위 예시에서는 먼저 부모 클래스의 verify_file 메서드를 호출해 파일이 실제로 존재하는지, 현재 사용자 권한으로 읽기가 가능한지를 확인합니다. 이후 파일명이 특정 패턴으로 끝나는지를 검사해 조건을 만족할 경우 True를 반환합니다. 이렇게 확장자 검사를 통해 필요 없는 파일은 처리 대상에서 제외하고, 실제로 원하는 설정 파일만 가져오도록 한 것입니다.

반대로 다음 예시는 파일 경로 자체가 아닌 단순 문자열(예: 호스트 리스트)을 처리하는 플러그인에서 가져온 코드입니다. 여기서는 경로가 존재하지 않으면서 콤마가 포함된 경우(즉 단순 문자열이며 쉼표로 구분된 호스트 리스트라고 가정)에만 유효하다고 판별하는 방식입니다.

```python

def verify_file(self, path):

  host_list = path

  valid = False

  b_path = to_bytes(host_list, errors='surrogate_or_strict')

  if not os.path.exists(b_path) and ',' in host_list:

    valid = True

  return valid

```

위 코드처럼 verify_file 메서드는 꼭 파일만을 대상으로 하는 것이 아니라, 인벤토리 소스로 입력된 어떤 문자열이나 조건에도 적용 가능합니다. 이는 Ansible이 불필요한 소스를 미리 걸러내는 역할을 하며, 플러그인 동작을 더욱 빠르고 정확하게 만들어줍니다.


1.2. parse 메서드

parse 메서드는 실제 인벤토리를 생성하는 핵심 로직을 담당합니다. 이 메서드는 inventory, loader, path, cache 네 가지 인자를 받습니다. 여기서 inventory는 Ansible이 관리하는 인벤토리 객체이며, loader는 Ansible의 DataLoader 객체입니다. path는 대개 플러그인이 사용할 인벤토리 소스의 경로이지만, 앞서 본 것처럼 단순 문자열일 수도 있습니다. cache 인자는 캐시 사용 여부를 결정합니다.

parse 메서드에서는 플러그인 이름(예: myplugin)을 정의하고, super 함수를 통해 부모 클래스의 parse를 먼저 호출하여 필요한 속성을 세팅합니다. 이후 _read_config_data(path) 메서드나 set_options 등을 사용해 YAML 설정 파일을 읽거나, 플러그인에 정의된 옵션을 불러옵니다. 그리고 나서 외부 API나 시스템에 접속해 필요한 정보를 가져온 뒤, 이를 Ansible 인벤토리에 등록합니다.

대표적인 과정은 다음과 같습니다.

```python

NAME = 'myplugin'

def parse(self, inventory, loader, path, cache=True):

  super(InventoryModule, self).parse(inventory, loader, path, cache)

  config = self._read_config_data(path)

  mysession = apilib.session(user=self.get_option('api_user'),

    password=self.get_option('api_pass'),

    server=self.get_option('api_server'))

  mydata = mysession.getitall()

  for colo in mydata:

    for server in mydata[colo]['servers']:

      self.inventory.add_host(server['name'])

      self.inventory.set_variable(server['name'], 'ansible_host', server['external_ip'])

```

위 코드에서 보듯, 외부 API로부터 가져온 데이터(mydata)에 대해 반복문을 돌면서 Ansible이 관리할 호스트(서버)들을 동적으로 추가해나가는 방식입니다. 각 호스트에 필요한 변수를 설정하거나, 그룹에 호스트를 배치하는 등 다양한 동작을 이 parse 메서드에서 처리할 수 있습니다.

만약 인벤토리 소스가 잘못되어 있거나, API 호출 중 에러가 발생했다면 AnsibleParserError와 같은 오류를 명시적으로 raise 해 문제 상황을 Ansible에 알릴 수 있습니다. 이렇게 하면 Ansible이 해당 인벤토리 소스를 무효 처리하거나, 적절한 오류 메시지를 표시할 수 있습니다.


2. 개발 및 테스트 예시

동적 인벤토리 플러그인을 작성했다면, 아래처럼 ansible-inventory 명령어를 통해 직접 테스트해볼 수 있습니다. 작성한 플러그인을 예를 들어 myplugin.yaml이라는 파일로 저장했다고 가정해보겠습니다. 실제 환경에서 파일명이나 경로는 자유롭게 구성할 수 있습니다.

```bash

ansible-inventory -i myplugin.yaml --list

```

위 명령을 실행할 시, 우리가 만든 myplugin.yaml 파일을 Ansible이 로드하여 현재 플러그인이 반환하는 전체 호스트와 그룹 정보를 JSON 형태로 출력해줍니다. 이를 통해 플러그인이 제대로 동작하는지 빠르게 파악할 수 있습니다.

추가로 더 세부적인 정보를 보고 싶다면, -v 옵션을 사용하거나 --graph 옵션을 붙여서 호스트와 그룹의 계층 구조를 시각화할 수도 있습니다.

```bash

ansible-inventory -i myplugin.yaml --graph

```

이 명령을 실행할 시 그룹과 호스트 간의 트리를 그래프 형태로 확인할 수 있어, 플러그인이 반환하는 구조를 시각적으로 점검하는 데 도움이 됩니다.


3. 플러그인 코드 구조와 참고 자료

Ansible의 동적 인벤토리 플러그인은 일반적으로 다음과 같은 구조를 갖습니다.

1) 플러그인 문서화(DOCUMENTATION, 참조용 변수 등)
2) 플러그인 초기화(클래스 상속, 플러그인 이름 설정)
3) verify_file 메서드: 파일(또는 문자열 등) 유효성 판별
4) parse 메서드: 인벤토리 생성 로직(실제 호스트 등록, 그룹 할당 등)

Ansible 공식 GitHub 저장소에는 이미 구현된 다양한 동적 인벤토리 플러그인 예시가 존재합니다. 개별 플러그인의 구조나 작성 방식이 조금씩 다르므로, 여러 사례를 살펴보면서 자신만의 플러그인에 어떻게 적용할지 고민해보는 것도 좋습니다.

또한 parse 과정에서 Loader나 Templar 같은 객체를 어떻게 활용하고, 캐시를 어떤 식으로 사용하며, AnsibleParserError 같은 예외처리를 어디에서 하는지도 꼼꼼히 살펴보세요. 복잡한 환경에서 동적으로 많은 호스트를 가져올 경우, 성능을 고려해 캐시를 잘 활용하는 것이 관건이 됩니다.


3.1. 추가 팁 및 주의사항

1) YAML이나 JSON 파일을 이용하는 경우, 파일 확장자 검사만으로는 충분하지 않을 수도 있습니다. verify_file에서 특정 키값 존재 여부 등을 함께 확인하여 보다 정교하게 필터링할 수 있습니다.
2) 만약 외부 API나 DB에서 데이터를 가져올 때 네트워크 지연이나 인증 문제가 발생하면, Ansible 실행 시간이 지연될 수 있습니다. 이럴 경우 실패 처리를 위한 예외처리 코드를 반드시 parse나 그 내부에 넣어두는 것이 좋습니다.
3) 여러 개의 동적 인벤토리 플러그인을 동시에 사용한다면, 어떤 소스가 먼저 처리되는지 순서를 파악해야 예측 불가능한 충돌을 방지할 수 있습니다. Ansible 설정에서 플러그인 우선순위를 정하거나, 소스 별로 명확히 구분하여 사용하는 방법을 추천합니다.


4. 마무리

이렇게 verify_file과 parse 메서드를 중심으로 Ansible 동적 인벤토리 플러그인을 개발하는 과정을 알아보았습니다. 실제로는 각 환경마다 필요한 API 호출 방식이나 인벤토리 구성 로직이 다르기 때문에, 기본 뼈대만 이해한 뒤 요구 사항에 맞춰 커스터마이징하는 것이 핵심입니다.

동적 인벤토리 플러그인은 서버 스케일링이 잦은 환경이나 클라우드 프로비저닝 툴과의 연동에서 빛을 발합니다. 특히 대규모 환경을 관리하는 시니어 Ansible 개발자분들께서는 플러그인을 만들어두면 운영 효율성을 대폭 높일 수 있습니다. 또한 유지보수가 간편해지고, 팀 내 인프라 관리 표준을 확립하는 데에도 큰 도움이 됩니다.

마지막으로, Ansible 공식 문서와 GitHub 저장소를 적극적으로 참고하시길 권장드립니다. 이미 잘 작성된 다양한 예시가 있으므로, 이를 기반으로 학습하고 필요한 부분만 수정해 사용하는 방식이 가장 빠른 지름길이 될 것입니다.

댓글목록 0

등록된 댓글이 없습니다.

Copyright © 소유하신 도메인. All rights reserved.

사이트 정보

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

PC 버전으로 보기