Вызов ролей в al oop с использованием словарей из массива как vars - PullRequest
1 голос
/ 06 августа 2020

Мой вопрос чем-то похож на тот, который размещен здесь , но это не совсем ответ. В моем случае у меня есть массив, содержащий несколько vars: записей, которые я oop перебираю при вызове определенной роли. Следующие примеры демонстрируют идею:

some_vars_file.yml:

redis_config:
  - vars:
      redis_version: 6.0.6
      redis_port: 6379
      redis_bind: 127.0.0.1
      redis_databases: 1
  - vars:
      redis_version: 6.0.6
      redis_port: 6380
      redis_bind: 127.0.0.1
      redis_databases: 1

playbook.yml:

...

- name: Install and setup redis
  include_role:
    name: davidwittman.redis
  with_dict: "{{ dictionary }}"
  loop: "{{ redis_config }}"
  loop_control:
    loop_var: dictionary

...

Насколько я понимаю, это должно просто установить словарь, начинающийся с узла vars на каждой итерации, но почему-то это не так. Есть ли шанс заставить что-то подобное работать, или мне действительно нужно переопределить все свойства при вызове роли, заполняя их с помощью with_items?

1 Ответ

0 голосов
/ 06 августа 2020

Учитывая роль

shell> cat roles/davidwittman_redis/tasks/main.yml
- debug:
    var: dictionary

Удалить with_dict. Пособие

shell> cat playbook.yml
- hosts: localhost
  vars_files:
    - some_vars_file.yml
  tasks:
    - name: Install and setup redis
      include_role:
        name: davidwittman_redis
      loop: "{{ redis_config }}"
      loop_control:
        loop_var: dictionary

дает

shell> ansible-playbook playbook.yml

PLAY [localhost] **********************************************

TASK [Install and setup redis] ********************************

TASK [davidwittman_redis : debug] *****************************
ok: [localhost] => 
  dictionary:
    vars:
      redis_bind: 127.0.0.1
      redis_databases: 1
      redis_port: 6379
      redis_version: 6.0.6

TASK [davidwittman_redis : debug] ******************************
ok: [localhost] => 
  dictionary:
    vars:
      redis_bind: 127.0.0.1
      redis_databases: 1
      redis_port: 6380
      redis_version: 6.0.6

Q: «Может быть проблема, связанная с переменной совокупностью при вызове роли?»

О: Да. Это может. См. Приоритет переменных . vars_files - это приоритет 14. Любой более высокий приоритет имеет приоритет перед ним. Решите, как структурировать данные, и при необходимости используйте include_vars (приоритет 18). Например,

shell> cat playbook.yml
- hosts: localhost
  tasks:
    - include_vars: some_vars_file.yml
    - name: Install and setup redis
      include_role:
        name: davidwittman_redis
      loop: "{{ redis_config }}"
      loop_control:
        loop_var: dictionary

В конечном итоге командная строка - extra-vars переопределит все предыдущие настройки

shell> ansible-playbook playbook.yml --extra-vars "@some_vars_file.yml"

Q: «Может, нельзя задать секцию vars напрямую через внешний словарь?»

A: Можно, конечно. Пример в этом ответе наглядно это доказывает.

...