Ansible不覆盖默认变量

时间:2019-04-25 11:32:42

标签: ansible ansible-2.x ansible-inventory

我在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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在上面的示例中,我忘记提到了我针对同一台主机。显然,此行为已记录在案:

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

  

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