gpt4 book ai didi

vagrant - Ansible playbook group_vars 被角色变量覆盖

转载 作者:行者123 更新时间:2023-12-02 14:23:55 41 4
gpt4 key购买 nike

对于现有项目,我将首先通过 Vagrant 将 bash 配置脚本替换为 ansible,然后在解决问题后将其推出到临时/生产服务器。

问题...

根据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

注意两个变量的调试语句,这两个变量都在剧本旁边的 group_vars 文件中定义:

# app/config/provision/group_vars/all
---
vagrant_ansible_test_loading_vars: "lorem ipsum"

apache_listen_ports:
- 80
- 8080

我使用的 apache 角色定义了默认值(应该具有最低优先级):

# app/config/provision/roles/apache/defaults/main.yml
---
apache_listen_ports: [ 80, 8080 ]

同一角色还定义了 var(这应该是第二低优先级):

# 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 值覆盖,(显然)是角色变量的值。

最佳答案

role/rolename/vars/main.yml 中的变量具有非常高的优先级。它们被视为常量,在不修改角色的情况下不能被覆盖。 Roles/rolename/defaults/main.yml 的优先级较低,而且只是可以轻松覆盖的默认值。

关于vagrant - Ansible playbook group_vars 被角色变量覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26475071/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com