Ansible playbook group_vars被一个角色var覆盖

时间:2014-10-20 21:17:58

标签: vagrant ansible

对于现有项目,我将使用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值覆盖,(显然)是角色变量的值。

1 个答案:

答案 0 :(得分:5)

roles / rolename / vars / main.yml中的变量是非常高优先级的。它们被视为常量,如果不修改角色,则无法覆盖它们。 roles / rolename / defaults / main.yml是低优先级的,只是 - 可以轻松覆盖的默认值。