Выполнение второй роли переопределяет значение параметра по умолчанию - PullRequest
0 голосов
/ 30 августа 2018

У меня есть роль, которая определяет два параметра и значение по умолчанию для второго.

roles/upstream/tasks/main.yml * * 1004

---
- debug:
    msg: "Parameter in upstream is {{param}} and param2 is {{param2}}"

roles/upstream/defaults/main.yml

---
param2: []

А потом эта образцовая пьеса:

---
- name: test
  hosts: localhost
  roles:
    - role: upstream
      vars:
        param: 21
    - role: upstream
      vars:
        param: 42
        param2: test

Когда я выполняю это, я вижу следующее:

TASK [Gathering Facts] **********************************************************************************
ok: [localhost]

TASK [upstream : debug] *********************************************************************************
ok: [localhost] => {
    "msg": "Parameter in upstream is 21 and param2 is test"
}

TASK [upstream : debug] *********************************************************************************
ok: [localhost] => {
    "msg": "Parameter in upstream is 42 and param2 is test"
}

Каково обоснование того, что второй вызов роли также отменяет значение по умолчанию для param2 для другого вызова и как этого избежать?

1 Ответ

0 голосов
/ 11 сентября 2018

Ожидаемое вами поведение ожидается.

Роли в Ansible изначально были просто организационной функцией. Переменные могут быть областями действия или задачами, но не областями ролей (есть также экстраварианты, факты, магические переменные, ведущие себя по-разному, но не имеющие отношения к делу).

Если vars находится внутри секции игры roles, они сначала читаются как переменные игры (выигрывает последнее определенное значение), затем для каждой задачи внутри роли применяется vars из этого объявления роли.


Чтобы избежать проблемы, вы должны использовать include_role или import_role модуль в tasks (или pre_tasks).

Тогда, согласно вашему дополнительному требованию в комментарии :

[this] делает переменные недоступными для других ролей ...

Вы можете сделать defaults и vars, определенные в ролях, видимыми вне ролей, установив новый параметр public в Ansible 2.7 (в разработке на момент написания этого ответа).


Окончательное решение:

- hosts: localhost
  connection: local
  gather_facts: no

  tasks:
    - include_role:
        name: upstream
        public: true
      vars:
        param: 21

    - debug:
        var: param2

    - include_role:
        name: upstream
      vars:
        param: 42
        param2: test
...