Ansible不会覆盖默认变量

问题描述 投票:1回答:2

我在role/defaults/main.yml中定义了以下变量:

jvm_heap_size_max: 1024
jvm_heap_size_min: "{{ (jvm_heap_size_max * 0.5)|int|abs }}"

我的group_vars文件夹看起来像这样:

├── group_vars
│   ├── all
│   ├── group
│   │   ├── vars
│   │   └── vault

我在inventories/test/group_vars/group/vars中有以下变量:

jvm_heap_size_max: 512
jvm_heap_size_min: 1024

我的预期输出是:

jvm_heap_size_max: 512
jvm_heap_size_min: 1024

但我得到的是这个:

jvm_heap_size_max: 1024
jvm_heap_size_min: 1024

怎么会?我正在使用Ansible 2.7.7

ansible ansible-2.x ansible-inventory
2个回答
2
投票

这应该像你描述的那样工作。

我设置了一个最小的例子,并验证了group_vars的优先级高于角色默认值,written in the documentation也是如此。

由于您的示例不包括组的实际名称以及相应的文件夹名称,我认为这是错误所在。

另外,当我验证这一点时,我的group_vars位于我项目根目录下的group_vars/all.yml文件中,我不熟悉其他模式。

使用localhostgroup_vars/all.yml的快速示例:

roles/testrole/defaults/main.yml

---
jvm_heap_size_max: 1024
jvm_heap_size_min: "{{ (jvm_heap_size_max * 0.5)|int|abs }}"

roles/testrole/tasks/main.yml

---
- debug:
    var: jvm_heap_size_min

- debug:
    var: jvm_heap_size_max

group_vars/all.yml

---
jvm_heap_size_max: 2048

testplay.yml

- hosts: localhost
  roles:
    - testrole

调用和输出:

➜  ansible-playbook testplay.yml
 [WARNING]: Unable to parse /etc/ansible/hosts as an inventory source

 [WARNING]: No inventory was parsed, only implicit localhost is available

 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


PLAY [localhost] *************************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [testrole : debug] ******************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "jvm_heap_size_min": "1024"
}

TASK [testrole : debug] ******************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "jvm_heap_size_max": 2048
}

PLAY RECAP *******************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0

0
投票

我忘了提到我在上面的例子中瞄准了同一个主机。显然,这种行为记录在案:

https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#how-variables-are-merged

默认情况下,在运行播放之前将变量合并/展平到特定主机。这使得Ansible专注于主机和任务,因此群组在库存和主机匹配之外并不存在。默认情况下,Ansible会覆盖变量,包括为组和/或主机定义的变量(请参阅hash_merge设置以更改此变量)。

© www.soinside.com 2019 - 2024. All rights reserved.