Profile picture

[Ansible] Ansible 변수(Variable) 더 자세하게 알아보기 - 인벤토리부터 매직 변수까지 🧙‍♂️

JaehyoJJAng2025년 05월 25일

개요

오늘은 앤서블을 더욱 강력하고 유연하게 만들어주는 핵심 기능,

바로 **변수(Variables)**에 대해 깊이 파고드는 시간을 갖겠습니다.


각기 다른 환경과 수많은 서버를 관리해야 할 때, 변수는 우리를 하드코딩의 늪에서 구해줄 동아줄과 같습니다.


이번 게시글에서는 앤서블의 다양한 변수를 하나씩 살펴보고, 어떤 상황에서 어떤 변수를 사용해야 하는지 시나리오별 예제와 함께 실습해보겠습니다.


1. 인벤토리 변수 (Inventory Variable)

인벤토리 변수는 관리 대상 호스트(서버)의 고유한 정보를 정의할 때 사용됩니다.

가장 기본적인 방법은 인벤토리 파일에 직접 작성하는 것입니다.


아래와 같은 인벤토리 파일(inventory.ini)이 있다고 가정해볼게요.

[webservers]
web1.example.com http_port=80
web2.example.com http_port=8080

[webservers:vars]
nginx_version = 1.20.1

web1.example.com 또는 web2.example.com처럼 나열된 호스트와 동일한 라인에 선언한 변수가 바로 인벤토리 호스트 변수 입니다.


그리고 webservers 그룹 아래에 위치한 nginx_version인벤토리 그룹 변수 라고 하죠.


위의 인벤토리를 바탕으로 플레이북을 실행했을 때 http_port를 확인하면 web1에서는 80, web2에서는 8080이 될 것입니다.


그리고 두 호스트 모두 nginx_version 변수 값을 확인하면 1.20.1이 출력될 겁니다. image


하지만 앤서블의 플레이북 작성 권고 사항 중에는 Inventory 및 Playbook 등은 최대한 깔끔하고 간결하게 만드는 것을 권장하고 있습니다.

따라서 인벤토리 변수를 선언할 때에는 인벤토리 파일에 직접 작성하는 것이 아닌,

다음 챕터에서 배울 group_varshost_vars를 활용하여 디렉토리로 구분지어야 합니다.


✨ 더 깔끔하게! group_vars와 host_vars 활용하기

이 방법은 변수를 인벤토리에서 완전히 분리하여 별도의 파일로 관리하는 방식입니다.


  • group_vars: 인벤토리 그룹별로 변수 파일을 만들어 관리하는 디렉토리입니다.
  • host_vars: 특정 호스트만을 위한 변수 파일을 만들어 관리하는 디렉토리입니다.

앤서블은 플레이북을 실행할 때,

인벤토리 파일과 동일한 경로에 있는 group_varshost_vars 디렉토리를 자동으로 인식하고 해당 파일들을 읽어 변수를 적용합니다.


디렉토리 구조 예시

/my_ansible_project
├── ansible.cfg
├── inventory.ini      # <- 여기엔 서버 목록만 깔끔하게!
├── my_playbook.yml
├── group_vars/
│   ├── webservers.yml   # <- webservers 그룹을 위한 변수
│   └── databases.yml  # <- databases 그룹을 위한 변수
└── host_vars/
    └── web1.yml # <- web1 호스트만을 위한 변수
    └── db1.yml # <- db1 호스트만을 위한 변수

이렇게 구분하면 인벤토리 파일은 다음처럼 아주 간략해질겁니다.

[webservers]
web1
web2

[databases]
db1

그룹 변수 파일에는 다음처럼 그룹 전체에 적용할 변수를 선언하면 됩니다.

group_vars/webservers.yml

# 이 파일의 변수들은 webservers 그룹 전체에 적용됩니다.
http_port: 80
nginx_version: 1.20.1

호스트 변수 파일에는 다음처럼 호스트에 적용할 변수를 선언하면 됩니다.

host_vars/web1.yml

# 이 파일의 변수는 web1.example.com에만 적용되며,
# group_vars의 변수보다 우선순위가 높습니다.
# 따라서 web1은 80이 아닌 8080 포트를 사용하게 됩니다.
http_port: 8080

2. 연결 변수 (Connection Variable)

연결 변수는 앤서블이 원격 호스트에 접속하는 방식을 제어하는 변수입니다.

연결 변수의 가장 대표적인 변수는 ansible_hostansible_user 입니다.


  • ansible_host: 연결하려는 호스트의 IP 주소 또는 통신 가능한 주소
  • ansible_user: 연결하려는 호스트의 사용자 이름

연결 변수를 가장 일반적으로 선언하는 위치는 아래와 같습니다.

# inventory.ini

[webservers]
web1  ansible_host=192.168.219.10
web2  ansible_host=192.168.219.11

[webservers:vars]
ansible_user=web

위와 같이 인벤토리 파일을 작성하면 web1 작업 수행 시 192.168.219.10에 접속을 시도하며, 이때 사용자는 web으로 접속을 시도합니다.

즉, ssh web@192.168.219.10과 같은거겠죠?


3. 팩트 변수 (Fact Variable)

플레이북 작성 시 가장 많이 사용하고 또 알아야 하는 변수는 단연 팩트가 아닐까 생각합니다.


팩트 변수는 시스템의 정보를 가지고 있는 변수로, ansible_facts라는 변수로서 이미 선언이 되어있습니다.

그리고 플레이북 실행 시 Gathring Facts 단계에서 시스템 정보를 수집하며 메모리에 저장하죠.


우리가 직접 정의하는 변수가 아니지만, 플레이북에서 아주 유용하게 사용됩니다.


  • ansble_facts: ansible_distribution (OS), ansible_default_ipv4.address (IP주소), ansible_memtotal_mb (메모리) 등 시스템의 거의 모든 정보를 담고 있습니다.

출력 값은 다음과 같은 형식으로 출력됩니다.

PLAY [inventory variable print] ********************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************************************************************************************************
ok: [web1]

TASK [Gathring Facts 출력 확인하기] ****************************************************************************************************************************************************************************************************************************************
ok: [web1] => {
    "msg": {
        "all_ipv4_addresses": [
            "192.168.219.121"
        ],
        "all_ipv6_addresses": [
            "fe80::be24:11ff:fe44:30a5"
        ],
        "ansible_local": {},

    # .... 생략 .....

또한 출력된 값은 파이썬의 사전형(Dict) 데이터처럼 되어 있어 계층 접근이 가능합니다.


192.168.219.121 값을 가져오려면 이렇게 가져올 수가 있다는거죠.

---
- name: inventory variable print
  hosts: webservers
  gather_facts: true
  tasks:
    - name: Gathring Facts 출력 확인하기
      ansible.builtin.debug:
        # 이런 식으로!
        msg: "{{ ansible_facts['all_ipv4_addresses'] }}" 
        # 아니면 이런식으로!
        msg: "{{ ansible_all_ipv4_addresses }}" 

4. 매직 변수 (Magic Variable)

매직 변수는 자동화 작업에 필요한 정보를 담고 있는 변수이며, 사용자가 정의할 수 없는 변수입니다.


사용 가능한 매직 변수의 수 또한 상당히 많은데요!

그 중 inventory_hostname, groups, group_names, hostvars 정도가 가장 많이 사용됩니다.


  • hostvars: 인벤토리 파일에 나열된 호스트가 사용할 수 있는 모든 변수를 저장한 변수
  • group_names: 플레이가 실행 중인 호스트의 그룹들을 리스트로 저장한 변수
  • groups: 인벤토리 파일에 등록된 그룹 명과 멤버쉽을 사전형 데이터로 저장한 변수
  • inventory_hostname: 플레이가 실행 중인 호스트의 인벤토리 파일에서의 이름
- name: Show Magic Variables
  hosts: webservers
  tasks:
    - name: Display magic variables
      debug:
        msg: |
          현재 호스트: {{ inventory_hostname }}
          이 호스트가 속한 그룹: {{ group_names }}
          db1의 IP 주소: {{ hostvars['db1']['ansible_default_ipv4']['address'] }}

마무리

앤서블 변수 관리의 핵심은 분리 입니다!

  • 인벤토리: 서버 목록만 관리 (inventory.ini)
  • 공통/그룹 변수: 그룹별 설정 관리 (group_vars/)
  • 개별/예외 변수: 특정 서버의 예외 설정 관리 (host_vars/)
  • 플레이북: 실제 작업 흐름 정의 (playbook.yml)

이렇게 역할을 명확히 분리하여 사용해보세요!

    Tag -

Loading script...