고급 vars_files 기술
이 마지막 단계에서는 Ansible 에서 vars_files를 사용하는 고급 기술을 살펴봅니다. 여기에는 변수를 계층적으로 구성하고 역할 기반 변수 구성을 구현하는 것이 포함됩니다.
변수를 계층적으로 구성
복잡한 프로젝트에서는 변수를 계층적으로 구성하는 것이 유용한 경우가 많습니다. 다음 구조를 만들어 보겠습니다.
- 모든 환경에 적용되는 공통 변수
- 환경별 변수
- 애플리케이션별 변수
먼저 공통 변수 파일을 생성해 보겠습니다.
~/project/ansible-vars-demo/vars/common.yml에 다음 내용으로 새 파일을 생성합니다.
---
## Common variables for all environments
organization: "Example Corp"
admin_email: "admin@example.com"
timezone: "UTC"
다음으로 애플리케이션별 변수를 생성해 보겠습니다.
~/project/ansible-vars-demo/vars/database.yml에 다음 내용으로 새 파일을 생성합니다.
---
## Database application variables
db_port: 3306
db_user: "dbuser"
db_name: "appdb"
db_max_connections: 100
계층적 플레이북 생성
이제 이러한 계층적 변수를 사용하는 방법을 보여주는 플레이북을 생성해 보겠습니다. ~/project/ansible-vars-demo/hierarchical_setup.yml에 다음 내용으로 새 파일을 생성합니다.
---
- name: Hierarchical Variable Demo
hosts: webservers
vars:
env: dev
app: database
vars_files:
- "vars/common.yml"
- "vars/{{ env }}_environment.yml"
- "vars/{{ app }}.yml"
tasks:
- name: Display hierarchical configuration
debug:
msg: >
Configuration for {{ app }} in {{ environment_name }} environment:
- Organization: {{ organization }}
- Admin Email: {{ admin_email }}
- Timezone: {{ timezone }}
- Debug Mode: {{ debug_mode }}
- Log Level: {{ log_level }}
- DB Port: {{ db_port }}
- DB User: {{ db_user }}
- DB Max Connections: {{ db_max_connections }}
- name: Create hierarchical config file
copy:
content: |
## {{ organization }} Configuration
## {{ environment_name }} Environment
## Common Settings
ADMIN_EMAIL={{ admin_email }}
TIMEZONE={{ timezone }}
## Environment Settings
DEBUG={{ debug_mode }}
LOG_LEVEL={{ log_level }}
BACKUP_FREQUENCY={{ backup_frequency }}
## {{ app | capitalize }} Settings
DB_PORT={{ db_port }}
DB_USER={{ db_user }}
DB_NAME={{ db_name }}
DB_MAX_CONNECTIONS={{ db_max_connections }}
dest: "/tmp/{{ environment_name }}_{{ app }}_config.conf"
mode: "0644"
그룹 및 호스트 변수 이해
vars_files 외에도 Ansible 은 group_vars 및 host_vars라는 특수 디렉토리에 변수를 저장하는 것도 지원합니다. 작동 방식을 살펴보겠습니다.
그룹 및 호스트 변수에 대한 디렉토리 구조를 생성합니다.
mkdir -p ~/project/ansible-vars-demo/group_vars
mkdir -p ~/project/ansible-vars-demo/host_vars
이제 'webservers' 그룹에 대한 그룹 변수 파일을 생성합니다.
~/project/ansible-vars-demo/group_vars/webservers.yml에 다음 내용으로 새 파일을 생성합니다.
---
## Variables for all webservers
firewall_enabled: true
ssh_port: 22
monitoring_enabled: true
그리고 'localhost'에 대한 호스트 변수 파일을 생성합니다.
~/project/ansible-vars-demo/host_vars/localhost.yml에 다음 내용으로 새 파일을 생성합니다.
---
## Variables specific to localhost
local_backup_path: "/tmp/backups"
is_development_machine: true
모든 변수 유형을 사용하는 플레이북 생성
모든 변수 유형을 함께 사용하는 방법을 보여주는 최종 플레이북을 생성해 보겠습니다. ~/project/ansible-vars-demo/complete_setup.yml에 다음 내용으로 새 파일을 생성합니다.
---
- name: Complete Variable Demo
hosts: webservers
vars:
env: prod
app: database
vars_files:
- "vars/common.yml"
- "vars/{{ env }}_environment.yml"
- "vars/{{ app }}.yml"
tasks:
- name: Display complete configuration
debug:
msg: >
Complete configuration for {{ inventory_hostname }}:
- Organization: {{ organization }}
- Environment: {{ environment_name }}
- Debug Mode: {{ debug_mode }}
- Firewall Enabled: {{ firewall_enabled }}
- SSH Port: {{ ssh_port }}
- Monitoring Enabled: {{ monitoring_enabled }}
- Local Backup Path: {{ local_backup_path }}
- Is Development Machine: {{ is_development_machine }}
- name: Create complete config file
copy:
content: |
## {{ organization }} - {{ environment_name }} Environment
## Host: {{ inventory_hostname }}
## Common Settings
ADMIN_EMAIL={{ admin_email }}
TIMEZONE={{ timezone }}
## Environment Settings
DEBUG={{ debug_mode }}
LOG_LEVEL={{ log_level }}
## Server Settings
FIREWALL_ENABLED={{ firewall_enabled }}
SSH_PORT={{ ssh_port }}
MONITORING_ENABLED={{ monitoring_enabled }}
## Host-specific Settings
LOCAL_BACKUP_PATH={{ local_backup_path }}
IS_DEVELOPMENT_MACHINE={{ is_development_machine }}
## {{ app | capitalize }} Settings
DB_PORT={{ db_port }}
DB_USER={{ db_user }}
DB_NAME={{ db_name }}
dest: "/tmp/complete_config.conf"
mode: "0644"
고급 플레이북 실행
계층적 플레이북을 실행해 보겠습니다.
cd ~/project/ansible-vars-demo
ansible-playbook -i inventory.ini hierarchical_setup.yml
세 개의 vars_files 모두의 변수를 포함하는 출력을 볼 수 있습니다.
이제 완전한 플레이북을 실행해 보겠습니다.
ansible-playbook -i inventory.ini complete_setup.yml
이번에는 vars_files, group_vars 및 host_vars의 변수를 포함하는 출력을 볼 수 있습니다.
구성 파일 확인
고급 플레이북에서 생성된 구성 파일을 확인해 보겠습니다.
cat /tmp/dev_database_config.conf
cat /tmp/complete_config.conf
Ansible 에서 변수 우선 순위 이해
여러 변수 소스를 사용할 때 Ansible 은 특정 우선 순위를 따릅니다.
- 명령줄 변수 (
-e 또는 --extra-vars)
- 플레이에 정의된 변수
- 포함된 파일 및 역할의 변수
- 호스트 팩트
- 호스트 변수
- 그룹 변수
- 인벤토리 변수
- 역할 기본 변수
즉, host_vars에 정의된 변수는 group_vars에 정의된 동일한 변수를 재정의하고, 이는 vars_files에 정의된 동일한 변수를 재정의합니다.
이 계층적 구조는 서로 다른 환경, 호스트 및 애플리케이션에서 구성을 관리하는 강력한 방법을 제공합니다.