У меня есть следующие переменные, определенные в 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
имеет более высокий приоритет, чем роли по умолчанию, как и написано в документации.
Поскольку ваш пример не включает фактическое имя группы и соответствующие имена папок, я предполагаю, что именно в этом и заключается ошибка.
Кроме того, когда я проверил это, мои 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
Использование group_vars/all.yml
работает, но не работает, если оно находится в group_vars/group/vars
Как я уже писал, я не знаком с упомянутым вами шаблоном макета каталога. Я бы использовал group_vars/my-group.yml
.
@Francis Это решило вашу проблему? Пожалуйста, примите ответ, если это так, спасибо!
Я забыл упомянуть, что я нацелен на тот же хост в моем примере выше. Судя по всему, такое поведение задокументировано:
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#how-variables-are-merged
By default variables are merged/flattened to the specific host before a play is run. This keeps Ansible focused on the Host and Task, so groups don’t really survive outside of inventory and host matching. By default, Ansible overwrites variables including the ones defined for a group and/or host (see the hash_merge setting to change this) .
min
больше, чемmax
в вашем примере. Не исключает ответа, но все равно сбивает с толку. Это предназначено?