首页 文章

Ansible playbook group_var被角色var覆盖

提问于
浏览
3

对于现有项目,我将使用ansible替换bash配置脚本 - 首先通过Vagrant,然后在解决问题之后将其推送到staging / prod服务器 .

问题......

根据ansible docs关于变量优先级,group_vars应该覆盖角色变量,但我看到相反的情况发生 .

相关文件......

以下是我的 Vagrantfile 摘录(在项目根目录中):

config.vm.provision "ansible" do |ansible|
  ansible.playbook = "app/config/provision/provision.yml"
end

我将它指向一个子目录下的一个子目录,因为我正在使用自己的实践在现有的代码库中工作,并且不能让ansible的东西混乱根 . 有问题的剧本:

# 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 回答

  • 5

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

相关问题