我有一个角色,它定义了两个参数,第二个是默认参数。
roles/upstream/tasks/main.yml
:
---
- 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
的默认设置的原因是什么?
答案 0 :(得分:1)
您观察到的行为是预期的。
Ansible中的角色最初只是组织功能。变量可以是作用域,也可以是任务域,但不能是角色域(也有Extravars,Facts,Magic变量的行为有所不同,但此处不相关)。
在游戏的vars
部分中放置roles
时,它们首先被读取为游戏变量(最后一个值获胜),然后对于角色中的每个任务,vars
角色声明已应用。
为避免此问题,应在tasks
(或pre_tasks
)中使用include_role
或import_role
模块。
然后,根据您在the comment中的其他要求:
[this]使其他角色无法访问变量...
通过设置a new parameter public
in Ansible 2.7(在编写此答案时仍处于开发阶段),可以使角色中定义的defaults
和vars
在角色之外可见。
最终解决方案:
- 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