高级 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
创建一个分层 Playbook
现在,让我们创建一个 playbook,它演示了如何使用这些分层变量。在 ~/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
创建一个包含所有变量类型的 Playbook
让我们创建一个最终的 playbook,它演示了如何将所有变量类型一起使用。在 ~/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"
运行高级 Playbooks
让我们运行我们的分层 playbook:
cd ~/project/ansible-vars-demo
ansible-playbook -i inventory.ini hierarchical_setup.yml
你应该看到包含来自所有三个 vars_files 的变量的输出。
现在,让我们运行我们的完整 playbook:
ansible-playbook -i inventory.ini complete_setup.yml
这次,你应该看到包含来自 vars_files、group_vars 和 host_vars 的变量的输出。
验证配置文件
让我们检查一下我们的高级 playbook 创建的配置文件:
cat /tmp/dev_database_config.conf
cat /tmp/complete_config.conf
理解 Ansible 中的变量优先级
在使用多个变量源时,Ansible 遵循特定的优先级顺序:
- 命令行变量(
-e 或 --extra-vars)
- 在 play 中定义的变量
- 来自包含的文件和角色的变量
- 主机事实
- 主机变量
- 组变量
- Inventory 变量
- 角色默认变量
这意味着在 host_vars 中定义的变量将覆盖在 group_vars 中定义的相同变量,而 group_vars 中的变量将覆盖在 vars_files 中定义的相同变量。
这种分层结构为你提供了一种强大的方式来管理跨不同环境、主机和应用程序的配置。