
0. Ansible 변수
Ansible은 플레이 및 작업에서 재사용 가능한 값을 저장하기 위한 변수 기능을 제공한다.
변수를 사용하면 플레이북 관리가 간편해지고 설정 오류를 줄일 수 있다.
- 변수의 정의 위치
변수는 여러 위치에서 정의할 수 있고, 범위에 따라서 적용 대상이 달라진다.
1. 인벤토리 변수
: 특정 호스트 그룹 또는 개별 호스트에 적용된다.
2. Ansible 팩트 변수
: 시스템 구성 정보 기반으로 Ansible이 자동으로 생성된다.
3. 플레이북 변수
: 플레이 단위 또는 특정 task에만 적용된다.
4. 명령행 변수
: ansible-playbook -e 또는 --extra-vars 옵션으로 전달할 수 있다.
- 변수의 우선순위
동일한 이름의 변수가 여러 위치에서 정의된다면
Ansible에서 미리 정해진 변수 우선순위 규칙에 따라 최종 값이 결정된다.
1. 명령행 변수(-e)가 가장 높은 우선순위를 가진다.
2. 인벤토리 변수 / 플레이북 변수 / 팩트 변수는 정의된 위치에 따라 우선순위가 다르다.
1. 인벤토리 변수
호스트에 직접 적용되는 변수로, 특정 호스트에 적용되는 호스트 변수와 그룹 호스트 변수로 나뉜다.
그룹에는 중첩 그룹이나 all(모든 호스트)도 포함이 된다.
- 우선순위
호스트 변수가 그룹 변수보다 우선순위가 높다.
하지만 인벤토리 변수보다 플레이북에서 정의한 변수의 우선순위가 더 높다.
1-1. 인벤토리에서 변수 지정하기
(1) 호스트 변수
#Inventory 파일
[webservers]
web01.test.com deploy_user=deploy1
web02.test.com 변수명 = 변수값
[dbservers]
db01.test.com db_name=appdb
db02.test.com db_name=logdb
#Playbook 파일
- name: deploy application
hosts: webservers
tasks:
- name: print deploy user
debug:
msg: "deploy user is {{ deploy_user }}"
위와 같이 인벤토리 파일에서 변수로 지정해놓고,
플레이북을 실행하면 호스트별 변수값이 자동으로 적용된다.
따라서 하나의 플레이북으로 여러 서버를 유연하게 관리할 수 있게 된다.
(2) 그룹 변수
:vars 를 이용해서 해당 그룹의 변수 정의 영역임을 표현한다.
# Inventory 파일
[webservers]
web01.test.com
web02.test.com
web03.test.com
[webservers:vars]
ansible_user=webadmin
app_port=8080
deploy_dir=/opt/webapp
변수명 = 값
##########################3
# playbook
- name: web deploy play
hosts: webservers
tasks:
- name: print variables
debug:
msg: >
user={{ ansible_user }},
port={{ app_port }},
dir={{ deploy_dir }}
비록 이렇게 문서로 정의를 했지만,
플레이북을 실행할 때 직접 변수값을 주어준다면, 명령문에 있는 값으로 덮어쓰기가 된다. (우선순위가 더 높아서)
예시보기
ansible-playbook -i inventory deploy.yml \
-e "app_port=9090 deploy_dir=/tmp/test"
이렇게 되면 파일안에 있는 값은 무시되고 이렇게 명령어로 넣은 값이 적용된다.
2. 팩트 변수
팩트 변수는 Ansible이 관리 대상 호스트에 직접 접속해서 자동으로 수집한 시스템 정보이다.
즉, 내가 직접 적은 변수가 아니라, Ansible이 알아서 조사한 정보이다.
(서버 이름이나, OS, IP, CPU, 메모리같은 정보를 팩트 변수로 저장해두는 것이다.)
팩트변수는 ansible_facts 에 저장되어 있어서
ansible_facts.hostname 이나 ansible_facts.memtotal_mb 이런식으로 접근한다.
(배열 처럼 ansible_facts['hostname'] 이런식으로 접근도 가능하다.)
그렇다면 언제 팩트 변수가 필요할까?
서버 상태에 따라 다른 행동을 하고 싶을 때 필요하다.
OS에 따라 작업을 다르게 할 수도 있고, 메모리 크기에 따라 설정을 변경할 수도 있게 된다.
fact는 Play를 시작하고 -> setup 모듈을 자동 실행해서 팩트를 수집한다. -> 그리고 tasks를 실행한다.
그런데 팩트 수집은 시간이 좀 걸려서 gather_facts : no 로 끌 수 있다.
예시
각 서버의 hostname과 서버의 기본 IPv4 주소를 출력하는 플레이북이다.
- hosts: all
gather_facts: no
tasks:
- debug:
msg: >
Hostname is {{ ansible_facts.hostname }}
and IP is {{ ansible_facts.default_ipv4.address }}
3. 플레이북 변수
플레이를 작성할 때 자신만의 변수를 정의한 다음, 작업(task)에서 해당값을 호출한다.
vars라는 키워드를 이용하여 play에서 변수를 선언한다.
3-1) vars 키워드
아래 예시처럼 playbook에서 직접 변수를 입력할 수 있다.
- hosts: all
vars:
user: user01
home: /home/user01
3-2) vars_files
또는 아래의 예시처럼 직접 변수를 playbook에서 입력하지 않고,
별도의 파일로 분리할 수도 있다. 이때는 vars_files라는 키워드로 외부에 정의한 변수 파일을 읽어온다.
# user.yaml
user: user01
home: /home/user01
# playbook
- hosts: all
vars_files:
- user.yaml
3-3) 플레이에서 변수 사용하기
위에서 vars나 vars_files로 정의한 변수를 play에서 사용할 때는
이중 중괄호를 이용하여 변수명을 호출하면 된다.
그리고 이 이중 중괄호를 ""로 채워줘야 한다.
vars:
user: user01
tasks:
- name: create user {{ user }}
user:
name: "{{ user }}"
4. 변수 파일 암호화
Ansible Vault를 이용하여 파일을 암호화한다.
Ansible Vault를 이용하면 Ansible이 읽는 모든 데이터 파일을 암호화 할 수 있고,
그 파일에는 변수 파일, 인벤토리, 플레이북, role 변수 등이 포함될 수 있다.
Ansible은 변수 하나만 암호화 하는 것이 아니라, 파일 단위로 암호화를 진행한다.
그래서 secret전용 변수 파일을 따로 만들고, 그 파일만 Vault로 암호화를 한다.
4-1. 암호화 파일 만들기
처음부터 암호화해서 파일을 만드는 방식이다.
(1) 암호를 직접 만들기
암호화 한 파일을 읽을 때 쓸 암호를 직접 생성하고, 그 암호로 확인하는 과정을 거친다.
ansible-vault create secrets.yml(=암호화할 파일)
위의 명령어를 치면 프롬프트에 암호를 입력(생성)하라고 뜬다.
그러면 아래와 같은 순서로 진행된다.
- Vault 비밀번호를 입력하고 (생성)
- 편집기가 열리면 암호화할 내용을 작성한다.
- 저장하면 파일이 암호화된 상태로 저장된다.
(2) 시스템으로 암호를 만들고, 암호 입력 없이 바로 만들어진 암호 파일을 이용하게 하기
암호를 직접 만들지 않고, 시스템이 만들게 해서 암호화된 파일을 읽을 때 직접 암호를 치지 않아도 되게 하고 싶은 경우에는
아래와 같이 --vault-password-file 명령어를 쓸 수 있다.
ansible-vault create --vault-password-file=[비밀번호를 저장할 파일이름] [암호화 할 파일]
ex) ansible-vault create --vault-password-file=vault-pass secrets.yml
이러면 vault-pass라는 파일 안에 시스템이 만들어준 비밀번호가 들어가있고,
암호화 된 secret.yml이라는 파일은 vault-pass를 읽어서 열 수 있게 된다.
4-2. 암호화 된 파일 읽고 수정하기
(1) 암호화 된 파일 읽기
ansible-vault view 키워드를 사용한다.
ansible-vault view secrets.yml(=암호화 된 파일)
(2) 암호화 된 파일 수정하기
ansible-vault edit 키워드를 사용한다.
ansible-vault edit secrets.yml(=암호화 된 파일)
4-3. 일반 파일을 암호화 하기
encrypt라는 명령어를 이용하여 암호화할 수 있다.
ansible-vault encrypt [암호화하고싶은파일이름]
이 명령어를 실행하면 콘솔에서 Vault 비밀번호를 입력하라는 프롬프트가 나타난다
해당 비밀번호는 파일을 암호화할 때 사용되거, 이후 이 파일을 사용하는 모든 플레이북 실행 할 때도 동일한 비밀번호가 필요하다.
4-4. 암호화 된 파일을 복호화 하기
반대로 decrypt를 이용하면 된다.
ansible-vault decrypt [복호화 하고 싶은파일 이름]
이 명령어를 실행하면 Vault 비밀번호를 입력하라는 프롬프트가 나타나고,
올바른 비밀번호를 입력하면 암호화된 파일이 일반 텍스트 파일로 복호화된다.
4-5. --vault-password-file 옵션
앞에서 본 것처럼, Ansible Vault는 기본적으로 암호화하거나 암호화된 파일을 사용할 때마다
콘솔에서 Vault 비밀번호 입력을 요구한다.
하지만 실제 운영 환경이나 자동화 환경에서는
매번 사람이 직접 비밀번호를 입력하는 방식이 불편하거나 불가능한 경우가 많다.
이럴 때 사용하는 옵션이 --vault-password-file 이다.
이 옵션은 Vault 비밀번호가 저장된 파일의 경로를 Ansible에게 전달하는 역할을 한다.
Ansible은 해당 파일을 읽어 자동으로 Vault 비밀번호를 사용하며,
콘솔에 비밀번호를 입력하라는 프롬프트를 띄우지 않는다.
예를 들어 Vault 비밀번호가 저장된 파일이 ~/.vault_pass 라면
플레이북 실행 시 다음과 같이 사용할 수 있다.
ansible-playbook playbook.yml --vault-password-file ~/.vault_pass
위의 코드를 해석하면 아래와 같다.
- ansible-playbook : Ansible 예약어 (플레이북 실행 명령)
- playbook.yml : 실행할 플레이북 파일
- -vault-password-file : Vault 비밀번호 파일을 지정하는 Ansible 옵션
- ~/.vault_pass : 사용자가 직접 만든 파일 (Vault 비밀번호가 들어 있다)
결과적으로 --vault-password-file 자체는 Ansible에서 제공하는 옵션이고,
그 뒤에 오는 파일은 사용자가 직접 생성하고 관리해야 하는 파일이다.
다음에는 작업제어에 대해 알아보겠다.
'공부기록 > IaC' 카테고리의 다른 글
| [ Ansible ] 1. Ansible 구성파일 | Inventory | 플레이북 개념 (0) | 2026.01.28 |
|---|---|
| [ Ansible ] 0. Intro - Ansible이란 무엇일까? | Ansible 아키텍처 | Ansible 설치 (0) | 2026.01.26 |