개요
오늘은 앤서블을 더욱 강력하고 유연하게 만들어주는 핵심 기능,
바로 **변수(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
이 출력될 겁니다.
하지만 앤서블의 플레이북 작성 권고 사항 중에는 Inventory 및 Playbook 등은 최대한 깔끔하고 간결하게 만드는 것을 권장하고 있습니다.
따라서 인벤토리 변수를 선언할 때에는 인벤토리 파일에 직접 작성하는 것이 아닌,
다음 챕터에서 배울 group_vars
와 host_vars
를 활용하여 디렉토리로 구분지어야 합니다.
✨ 더 깔끔하게! group_vars와 host_vars 활용하기
이 방법은 변수를 인벤토리에서 완전히 분리하여 별도의 파일로 관리하는 방식입니다.
group_vars
: 인벤토리 그룹별로 변수 파일을 만들어 관리하는 디렉토리입니다.host_vars
: 특정 호스트만을 위한 변수 파일을 만들어 관리하는 디렉토리입니다.
앤서블은 플레이북을 실행할 때,
인벤토리 파일과 동일한 경로에 있는 group_vars
와 host_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_host
와 ansible_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
)
이렇게 역할을 명확히 분리하여 사용해보세요!