目录
引言
在Ansible自动化运维中, 变量是实现动态配置和灵活部署的关键组件。在Playbook文件内部使用vars关键字定义变量,是Ansible声明式自动化的核心特性之一。这种方式不仅使Playbook具备 可读性和 可维护性,还能实现一套Playbook适配多种环境(开发、测试、生产)的需求。相比其他变量来源,Playbook文件内变量具有 作用域清晰、 定义集中、 易于管理的优势,是中小型自动化项目的首选变量管理方式。
1 基础语法与定义方式
1.1 基本定义格式
- 语法结构:
---
- hosts: webservers
remote_user: root
vars:
variable_name1: value1
variable_name2: value2
tasks:
# 任务定义
关键要素:
- vars关键字必须顶格缩进
- 变量使用键值对形式定义
- 变量值支持字符串、数字、布尔值、列表、字典等数据类型
1.2 数据类型支持
- 字符串变量:
vars:
app_name: "nginx"
server_name: "webserver01.example.com"
- 数值变量:
vars:
http_port: 80
max_connections: 1000
worker_processes: 4
- 布尔变量:
vars:
ssl_enabled: true
debug_mode: false
- 列表变量:
vars:
install_packages:
- "nginx"
- "php-fpm"
- "mysql-server"
- 字典变量:
vars:
db_config:
host: "db.example.com"
port: 3306
name: "myapp"
user: "admin"
2 变量调用案例
2.1 完整Playbook
- Playbook文件(var3.yml):
---
- hosts: websrvs
remote_user: root
vars:
username: user1
groupname: group1
tasks:
- name: create group
group: name={{ groupname }} state=present
- name: create user
user:
name: {{ username }}
group: {{ groupname }}
state: present
2.2 变量调用规范
调用规则:
- 使用双大括号包围变量名:{{ variable_name }}
- 变量名前后建议加空格提高可读性
- 特殊情况需使用引号包裹
- 调用示例:
- name: 创建目录
file:
path: "/home/{{ username }}/data"
state: directory
- name: 配置文件
template:
src: "{{ app_name }}.conf.j2"
dest: "/etc/{{ app_name }}/{{ app_name }}.conf"
2.3 执行流程

- 加载并解析Playbook文件
- 识别vars部分并定义变量到内存空间
- 执行tasks部分的任务
- 在任务执行前替换变量占位符
- 将替换后的参数传递给模块
- 模块执行并返回结果
3 变量优先级与交互机制
3.1 变量优先级体系
优先级从高到低:
- 命令行变量(-e参数)
- Playbook文件内变量(vars)
- Inventory主机变量
- Inventory组变量
- Role变量
- Facts变量
- 优先级流程:

3.2 命令行变量覆盖示例
- 执行命令:
ansible-playbook -e "username=user2 groupname=group2" var3.yml
执行效果:
- Playbook中定义的username: user1被覆盖为user2
- Playbook中定义的groupname: group1被覆盖为group2
- 最终创建的用户为user2,组为group2
3.3 变量覆盖验证
- 验证命令:
# 查看变量定义
grep -A 5 "^vars:" var3.yml
# 执行并观察结果
ansible-playbook -e "username=user2 groupname=group2" var3.yml -v
4 高级变量应用技巧
4.1 复杂数据结构应用
- Playbook示例:
---
- hosts: webservers
vars:
app_config:
database:
host: "db.example.com"
port: 5432
name: "myapp"
features:
- authentication
- logging
- caching
ssl:
enabled: true
cert_path: "/etc/ssl/certs/app.crt"
key_path: "/etc/ssl/private/app.key"
tasks:
- name: 部署数据库配置
template:
src: db.conf.j2
dest: "/etc/app/db.conf"
- name: 创建SSL证书目录
file:
path: "{{ app_config.ssl.cert_path | dirname }}"
state=directory
4.2 变量过滤与处理
- 使用过滤器:
vars:
app_version: "1.2.3"
debug_info: true
tasks:
- name: 显示格式化信息
debug:
msg: "应用版本: {{ app_version | upper }} (调试模式: {{ debug_info | ternary('开启', '关闭') }})"
4.3 条件变量定义
- 基于条件定义变量:
---
- hosts: webservers
vars:
is_production: false
app_port: 8080
{% if is_production %}
ssl_enabled: true
{% else %}
ssl_enabled: false
{% endif %}
tasks:
- name: 配置应用端口
lineinfile:
path: /etc/app/config
regexp: '^port'
line: "port={{ app_port }}"
5 实践建议与注意事项
5.1 变量命名规范
- 推荐命名:
vars:
# 使用描述性名称
nginx_port: 80
max_connections: 1000
# 使用环境前缀
prod_db_host: "prod-db.example.com"
dev_db_host: "dev-db.example.com"
# 使用功能分组
app_config:
database:
host: "db.example.com"
port: 5432
- 避免命名:
vars:
# 避免使用保留字
host: "webserver" # 冲突Ansible内置变量
vars: "value" # 冲突关键字
# 避免使用特殊字符
app-name: "nginx" # 使用下划线替代连字符
app version: "1.0" # 使用下划线替代空格
5.2 变量组织策略
- 按功能分组:
vars:
# 应用基础配置
app_name: "myapp"
app_version: "1.2.3"
# 网络配置
http_port: 80
https_port: 443
bind_address: "0.0.0.0"
# 性能配置
worker_processes: 4
max_connections: 1000
keepalive_timeout: 65
- 按环境分离:
vars:
# 公共配置
app_name: "myapp"
# 环境特定配置
{% if env == 'production' %}
db_host: "prod-db.example.com"
debug_mode: false
{% else %}
db_host: "dev-db.example.com"
debug_mode: true
{% endif %}
5.3 安全注意事项
- 敏感信息处理:
vars:
# 不推荐:明文存储密码
db_password: "secret123"
# 推荐:使用加密变量文件
# db_password: "{{ vault_db_password }}"
- 变量验证:
tasks:
- name: 验证必要变量存在
assert:
that:
- app_name is defined
- db_host is defined
- db_password is defined
6 总结
Playbook文件内变量是Ansible实现声明式自动化的核心特性,掌握其使用方法能够显著提升自动化运维的灵活性和可维护性。在实际应用中,应建立规范的变量管理体系,结合业务需求合理设计变量结构,同时注重变量安全和文档维护。