对于现有项目,我将使用ansible替换bash配置脚本 - 首先通过Vagrant,然后在解决问题之后将其用于staging / prod服务器。
根据变量优先级ansible docs,group_vars应该覆盖角色变量,但我看到相反的情况发生。
以下是我Vagrantfile
(在项目根目录中)的摘录:
config.vm.provision "ansible" do |ansible|
ansible.playbook = "app/config/provision/provision.yml"
end
我将它指向一个子目录下的一个子目录,因为我正在使用自己的实践在现有的代码库中工作,并且不能让可靠的东西弄乱根。有问题的剧本:
# app/config/provision/provision.yml
---
- hosts: all
gather_facts: yes
sudo: true
roles:
- apache
- php
post_tasks:
- debug: var=vagrant_ansible_test_loading_vars
- debug: var=apache_listen_ports
请注意两个变量的调试语句,这两个变量都在playbook旁边的group_vars文件中定义:
# app/config/provision/group_vars/all
---
vagrant_ansible_test_loading_vars: "lorem ipsum"
apache_listen_ports:
- 80
- 8080
我正在使用的apache角色定义默认值(应该具有LOWEST优先级):
# app/config/provision/roles/apache/defaults/main.yml
---
apache_listen_ports: [ 80, 8080 ]
同一个角色也定义了vars(应该是SECOND最低优先级):
# app/config/provision/roles/apache/vars/main.yml
---
apache_listen_ports: [ 80 ]
然而,在vagrant up
之后,我得到了这个:
TASK: [debug var=vagrant_ansible_test_loading_vars] ***************************
ok: [default] => {
"vagrant_ansible_test_loading_vars": "lorem ipsum"
}
TASK: [debug var=apache_listen_ports] *****************************************
ok: [default] => {
"apache_listen_ports": [
80
]
}
正在定义的第一个变量及其原始值告诉我我的group_vars文件是正在加载。第二个变量已从group_vars值覆盖,(显然)是角色变量的值。
答案 0 :(得分:5)
roles / rolename / vars / main.yml中的变量是非常高优先级的。它们被视为常量,如果不修改角色,则无法覆盖它们。 roles / rolename / defaults / main.yml是低优先级的,只是 - 可以轻松覆盖的默认值。