Ansible не переопределяет переменные по умолчанию

У меня есть следующие переменные, определенные в 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.

min больше, чем max в вашем примере. Не исключает ответа, но все равно сбивает с толку. Это предназначено?
Thomas Hirsch 25.04.2019 14:01

Это просто для того, чтобы проиллюстрировать, что значение изменилось

FrancisV 25.04.2019 14:03
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
2
2 609
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это должно работать, как вы описали.

Я настроил минимальный пример и убедился, что 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

FrancisV 29.04.2019 09:28

Как я уже писал, я не знаком с упомянутым вами шаблоном макета каталога. Я бы использовал group_vars/my-group.yml.

Thomas Hirsch 29.04.2019 11:51

@Francis Это решило вашу проблему? Пожалуйста, примите ответ, если это так, спасибо!

Thomas Hirsch 08.05.2019 23:22
Ответ принят как подходящий

Я забыл упомянуть, что я нацелен на тот же хост в моем примере выше. Судя по всему, такое поведение задокументировано:

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) .

Другие вопросы по теме