인벤토리 구축하기

인벤토리 구축하기 (Building an inventory)

인벤토리는 관리 노드를 중앙 파일에 정리해서 Ansible에 시스템 정보와 네트워크 위치를 제공해요. 인벤토리 파일을 사용하면 단일 명령으로 많은 수의 호스트를 관리할 수 있어요. 이 글에서는 호스트 그룹을 만들고, 검증하고, ping까지 보내는 과정을 따라가 볼게요.

출처: 문서

본문

다음 단계를 완료하려면 하나 이상의 호스트 시스템의 IP 주소나 정규화된 도메인 이름(FQDN)이 필요해요. 데모 목적이라면 호스트가 로컬에서 컨테이너나 가상 머신으로 실행 중이어도 돼요. 또한 각 호스트의 authorized_keys 파일에 공개 SSH 키가 추가되어 있는지 확인해야 해요.

인벤토리를 다음과 같이 구축해 볼게요:

  1. 이전 단계에서 만든 ansible_quickstart 디렉터리에 inventory.ini라는 파일을 만들어요.
  2. inventory.ini 파일에 새 [myhosts] 그룹을 추가하고 각 호스트 시스템의 IP 주소나 FQDN을 지정해요.
[myhosts]
192.0.2.50
192.0.2.51
192.0.2.52
  1. 인벤토리를 검증해요.
ansible-inventory -i inventory.ini --list
  1. 인벤토리에서 myhosts 그룹에 ping을 보내요.
ansible myhosts -m ping -i inventory.ini

Note 컨트롤 노드와 관리 노드의 사용자 이름이 다르다면 ansible 명령에 -u 옵션을 전달하세요.

그러면 다음과 같은 성공 출력을 볼 수 있어요.

192.0.2.50 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
192.0.2.51 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
192.0.2.52 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

축하해요! 인벤토리를 성공적으로 구축했어요. 이제 플레이북을 만들면서 Ansible 시작을 이어가 볼게요.

INI 형식 또는 YAML 형식의 인벤토리

인벤토리는 INI 파일이나 YAML로 만들 수 있어요. 관리 노드 수가 적을 때는 앞서 본 예시처럼 INI 파일이 간단하고 읽기 쉬워요. 관리 노드 수가 늘어날수록 YAML 형식으로 인벤토리를 만드는 것이 합리적인 선택이 돼요.

예를 들어 다음은 관리 노드에 고유한 이름을 선언하고 ansible_host 필드를 사용하는 inventory.ini의 YAML 등가물이에요.

myhosts:
  hosts:
    my_host_01:
      ansible_host: 192.0.2.50
    my_host_02:
      ansible_host: 192.0.2.51
    my_host_03:
      ansible_host: 192.0.2.52

인벤토리 구축을 위한 팁

그룹 이름은 의미 있고 고유하게 만들고, 대소문자도 구분되므로 주의하세요. 그룹 이름에 공백, 하이픈, 앞자리 숫자는 피하세요(19th_floor 대신 floor_19 사용). 인벤토리의 호스트는 What(무엇), Where(어디), When(언제)에 따라 논리적으로 그룹화해요.

  • What — 토폴로지에 따라 호스트를 그룹화해요. 예: db, web, leaf, spine
  • Where — 지리적 위치에 따라 호스트를 그룹화해요. 예: datacenter, region, floor, building
  • When — 단계에 따라 호스트를 그룹화해요. 예: development, test, staging, production

메타그룹 사용하기

다음 문법으로 인벤토리에서 여러 그룹을 정리하는 메타그룹(metagroup)을 만들 수 있어요.

metagroupname:
  children:

다음 인벤토리는 데이터 센터의 기본 구조를 보여줘요. 이 예시 인벤토리는 모든 네트워크 장치를 포함하는 network 메타그룹과, network 그룹과 모든 웹서버를 포함하는 datacenter 메타그룹을 담고 있어요.

leafs:
  hosts:
    leaf01:
      ansible_host: 192.0.2.100
    leaf02:
      ansible_host: 192.0.2.110

spines:
  hosts:
    spine01:
      ansible_host: 192.0.2.120
    spine02:
      ansible_host: 192.0.2.130

network:
  children:
    leafs:
    spines:

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
    webserver02:
      ansible_host: 192.0.2.150

datacenter:
  children:
    network:
    webservers:

그룹은 여러 메타그룹에 속할 수 있어요. 예를 들어 network 그룹은 datacenterops 메타그룹 아래 모두 나타날 수 있어요.

leafs:
  hosts:
    leaf01:
      ansible_host: 192.0.2.100
    leaf02:
      ansible_host: 192.0.2.110

spines:
  hosts:
    spine01:
      ansible_host: 192.0.2.120
    spine02:
      ansible_host: 192.0.2.130

network:
  children:
    leafs:
    spines:

datacenter:
  children:
    network:

ops:
  children:
    network:

부모 그룹의 group_vars에 정의된 변수는 자식 그룹의 호스트에 적용되지만, 자식 그룹의 group_vars에 정의된 값은 부모 값을 덮어써요. 여러 부모가 허용되더라도 예측 가능한 상속을 위해 각 그룹은 하나의 부모 메타그룹 아래에만 정의하는 것이 좋아요.

변수 만들기

변수는 IP 주소, FQDN, 운영체제, SSH 사용자와 같은 관리 노드의 값을 설정해서, Ansible 명령을 실행할 때마다 그 값을 전달하지 않아도 되게 해 줘요. 변수는 특정 호스트에 적용될 수 있어요.

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
      http_port: 80
    webserver02:
      ansible_host: 192.0.2.150
      http_port: 443

변수는 그룹의 모든 호스트에 적용될 수도 있어요.

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
      http_port: 80
    webserver02:
      ansible_host: 192.0.2.150
      http_port: 443
  vars:
    ansible_user: my_server_user

더 알아보기 (Learn more)

  • How to build your inventory — YAML 또는 INI 형식의 인벤토리에 대해 더 배우기
  • Adding variables to inventory — 인벤토리 변수와 그 문법 알아보기
  • Ansible Vault — 비밀번호·키 같은 민감 콘텐츠를 인벤토리에서 암호화하는 방법