Ожидаемое вами поведение ожидается.
Роли в 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