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

본문 바로가기

사이트 내 전체검색

뒤로가기 Ansible 자료실

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

페이지 정보

작성자 snow 작성일 25-02-07 10:16 조회 2,718 댓글 0

본문

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

1. 동적 인벤토리란 무엇인가

Ansible에서 인벤토리는 호스트와 그룹 정보를 담고 있는 핵심 요소입니다. 이때 동적 인벤토리(dynamic inventory)는 API 호출이나 외부 데이터베이스, 혹은 다양한 스크립트를 통해 인벤토리를 실시간으로 생성하여 관리할 수 있게 해주는 기능입니다. 특히 인프라 환경이 빈번하게 변하는 대규모 시스템에서 유용합니다. 기존에 static 파일로만 호스트 정보를 관리하던 방식에서 벗어나, 동적 인벤토리를 사용하면 API 연동이나 별도의 프로그램으로 호스트 정보를 자동화할 수 있어 효율적입니다.

Ansible은 inventory plugin(인벤토리 플러그인)을 권장하지만, Python 이외의 언어를 활용하거나 과거 방식의 호환성을 유지하기 위해 inventory script(인벤토리 스크립트) 또한 지원합니다. 이에 따라 사용자는 Ansible의 다양한 버전에서도 스크립트 기반 동적 인벤토리를 편리하게 적용할 수 있습니다.


1.1. 인벤토리 스크립트의 동작 방식

동적 인벤토리 스크립트는 다음과 같은 인자를 받아 동작합니다.

  • --list : 모든 그룹과 호스트 정보를 JSON 형식으로 표준 출력(stdout)에 반환합니다.
  • --host 호스트명 : 특정 호스트와 관련된 변수 정보를 JSON 형식으로 반환합니다.

스크립트가 --list 인자를 받으면, 관리해야 할 그룹과 호스트 목록을 JSON 형태로 출력해야 합니다. 여기서 각각의 그룹은 호스트 배열, 하위 그룹(children) 목록, 그룹 변수(vars) 등을 포함할 수 있습니다. 예시를 볼까요?

아래 JSON 구조는 {"group001": ...} 형태로 구성되어 있으며, 그룹에 속한 호스트 목록(hosts), 그룹 변수(vars), 그리고 자식 그룹(children)을 담고 있습니다.

```json

{

 "group001": {

  "hosts": ["host001", "host002"],

  "vars": {"var1": true},

  "children": ["group002"]

 },

 "group002": {

  "hosts": ["host003","host004"],

  "vars": {"var2": 500},

  "children": []

 }

{...}

```

위 예시에서 group001은 두 개의 호스트(host001, host002)를 가지고 있으며, group002라는 하위 그룹을 포함합니다. 또한 group002는 host003, host004 호스트와 var2라는 변수를 가지고 있습니다. 이러한 구조는 실제 인벤토리를 관리할 때 계층적인 그룹 구성을 반영하도록 도와줍니다.

한편 --host 호스트명 인자로 스크립트를 실행하면, 해당 호스트가 갖는 변수 정보를 JSON 형태로 출력해야 합니다. 예를 들어 아래와 같은 형태가 될 수 있습니다.

```json

{

 "VAR001": "VALUE",

 "VAR002": "VALUE"

}

```

여기서 호스트에 변수를 지정하지 않으려면 빈 JSON 객체({})를 출력해도 무방합니다. 즉, 필요할 때만 커스텀 변수를 반환하거나, 전혀 반환하지 않을 수도 있습니다.


2. _meta 활용

Ansible 1.3 버전부터는 인벤토리 스크립트에서 _meta Section을 활용하여 호스트 변수를 한 번에 반환할 수 있는 기능을 지원합니다. _meta의 hostvars 키에 모든 호스트 변수를 담아두면, Ansible이 --host 인자로 스크립트를 여러 번 호출할 필요 없이, 단 한 번의 호출로 전체 호스트 변수를 로딩할 수 있어 성능이 크게 향상됩니다.


2.1. 성능 최적화를 위한 hostvars

대규모 호스트를 관리할 때 --host 인자를 통해 API를 여러 번 호출하면 시간이 오래 걸립니다. 하지만 _meta에 미리 모든 호스트별 변수를 저장해두면, Ansible이 추가로 스크립트를 호출하지 않게 되어 빠른 속도를 얻을 수 있습니다. 예시는 다음과 같습니다.

```json

{

 "group001": {

  "hosts": ["host001", "host002"]

 },

 "_meta": {

  "hostvars": {

   "host001": {"var001": "value"},

   "host002": {"var002": "value"}

  }

 }

}

```

위처럼 _meta에 hostvars를 넣어주면 Ansible이 --host 인자로 다시 스크립트를 호출하지 않아도 필요한 호스트 변수들을 전부 로딩합니다. 따라서 필수는 아니지만, 많은 호스트를 다룰 때는 성능 최적화 측면에서 _meta를 적극 활용하는 것이 좋습니다.


3. 기존 static inventory 대체하기

기존에 static inventory 파일(일반 텍스트 파일 형태)로 호스트를 관리하고 있었다면, 동적 인벤토리 스크립트로 이를 대체할 수도 있습니다. 이 경우 가장 중요한 점은 모든 호스트가 속한 'all' 그룹을 정의하고, 다른 어떤 그룹에도 속하지 않은 호스트를 'ungrouped' 그룹에 포함시키는 것입니다.

즉, 아래 기본 골격처럼 모든 호스트가 'all'에 포괄되고, 'ungrouped'는 그 어떤 그룹에도 속하지 않은 호스트를 위한 공간이 됩니다.

```json

{

 "_meta": {

  "hostvars": {}

 },

 "all": {

  "children": ["ungrouped"]

 },

 "ungrouped": {

  "children": []

 }

}

```

이렇게 스크립트를 구성해두면 기존 static inventory 파일을 완전히 대체하면서도, 동적으로 생성된 호스트 정보를 사용하여 Ansible 작업을 수행할 수 있습니다.

추가로 ansible-inventory 툴을 사용하면 실제로 동적 인벤토리가 어떻게 보이는지 확인할 수 있습니다. 예를 들어 아래와 같은 명령을 터미널에서 실행해보면, 동적 인벤토리 스크립트가 반환하는 전체 구조를 확인할 수 있습니다.

```bash

ansible-inventory --inventory my_dynamic_inventory_script.py --list

```

이 명령을 실행하면 실제로 스크립트가 반환하는 JSON 구조(모든 그룹, 호스트, _meta 정보 등)를 직접 확인할 수 있으며, 문제가 있을 경우 즉시 디버깅할 수 있습니다.


4. 동적 인벤토리 스크립트 작성 시 유의 사항

1) 필수 인자 처리: 스크립트는 반드시 --list와 --host 호스트명을 인자로 처리해야 합니다.2) JSON 출력 형식: 스크립트의 출력은 꼭 JSON이어야 하며, 콤마나 따옴표 등 형식을 주의해야 Ansible에서 인식할 수 있습니다.3) _meta 활용: 많은 호스트를 다뤄야 하는 환경에서는 _meta에 hostvars를 담아 --host 호출을 최소화하는 것이 효율적입니다.4) all, ungrouped 그룹 포함: static inventory를 대체할 경우, 모든 호스트를 포함하는 all 그룹과 어떠한 그룹에도 속하지 않은 호스트가 들어가는 ungrouped 그룹을 선언해야 합니다.


5. 간단한 스크립트 예시 실행

아래는 매우 간단한 예시입니다. 파이썬 스크립트로 가정했지만, 여기서는 동작 원리만 간단히 살펴보겠습니다. 호스트 정보를 반환하는 코드를 작성하고, 이를 ansible-inventory 명령어로 호출합니다.

```bash

ansible-inventory -i my_dynamic_inventory.py --list

```

이 명령을 실행하면 my_dynamic_inventory.py 내부에서 정의한 JSON 구조가 출력되어, Ansible이 해당 정보를 이용해 플레이북을 수행합니다.

댓글목록 0

등록된 댓글이 없습니다.

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

사이트 정보

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

PC 버전으로 보기