我在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
这应该像你描述的那样工作。
我设置了一个最小的例子,并验证了group_vars
的优先级高于角色默认值,written in the documentation也是如此。
由于您的示例不包括组的实际名称以及相应的文件夹名称,我认为这是错误所在。
另外,当我验证这一点时,我的group_vars
位于我项目根目录下的group_vars/all.yml
文件中,我不熟悉其他模式。
使用localhost
和group_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
我忘了提到我在上面的例子中瞄准了同一个主机。显然,这种行为记录在案:
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#how-variables-are-merged
默认情况下,在运行播放之前将变量合并/展平到特定主机。这使得Ansible专注于主机和任务,因此群组在库存和主机匹配之外并不存在。默认情况下,Ansible会覆盖变量,包括为组和/或主机定义的变量(请参阅hash_merge设置以更改此变量)。