我在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
答案 0 :(得分:2)
这应该按照您的描述进行。
我建立了一个最小的示例,并验证了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
答案 1 :(得分:0)
在上面的示例中,我忘记提到了我针对同一台主机。显然,此行为已记录在案:
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#how-variables-are-merged
默认情况下,在运行播放之前,默认变量会合并/展平到特定主机。这使Ansible专注于主机和任务,因此组无法真正在存货和主机匹配之外生存。默认情况下,Ansible会覆盖变量,包括为组和/或主机定义的变量(请参见hash_merge设置以进行更改)。