ansible角色默认变量应定义在roles/角色名/defaults/main.yml中,该文件为yaml格式、优先级最低、便于用户覆盖,适用于端口、包名等通用配置;不可放在vars/main.yml中,因其优先级高、难以覆盖。

在 Ansible 角色中定义默认变量,标准做法是使用 roles/角色名/defaults/main.yml 文件。
默认变量放在 defaults/main.yml 中
这是唯一被 Ansible 自动识别为“默认变量”的位置。该文件必须是 YAML 格式,内容为键值对:
- 文件路径必须是
roles/<role_name>/defaults/main.yml</role_name> - 变量优先级最低,容易被其他来源(如 playbook 的
vars、命令行-e)覆盖 - 适合设置通用、可预期、用户大概率不需要改的值,比如端口号、包名、服务名等
例如,一个 nginx 角色的 defaults/main.yml 可能这样写:
nginx_package: nginx nginx_service_name: nginx nginx_listen_port: 80 nginx_user: www-data
不要把默认变量写在 vars/main.yml
vars/main.yml 里的变量优先级高,几乎无法被外部覆盖(除非用 -e 强制指定),它更适合角色内部固定逻辑所需的值,比如硬编码的路径或内部标识符。如果你希望用户能轻松调整端口或配置名,就别放这里。
变量生效后怎么用
只要角色被正确调用(如在 playbook 中写 roles: - nginx),defaults/main.yml 中的变量就会自动加载,可在该角色的 tasks、templates、handlers 等任意地方直接引用,比如:
- name: Ensure nginx is installed
apt:
name: "{{ nginx_package }}"
state: present覆盖默认变量的方法
用户可以在调用角色时灵活覆盖这些默认值:
- 在 playbook 的
roles块中加vars:
- hosts: webservers
roles:
- role: nginx
vars:
nginx_listen_port: 8080- 在 playbook 顶层用
vars:或vars_files: - 执行时加命令行参数:
ansible-playbook site.yml -e "nginx_user=nginx"











