第二个角色执行将覆盖默认参数值



我有一个 ansible 角色,它定义了两个参数和第二个参数的默认值。

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,其基本原理是什么,以及如何避免这种情况?

您观察到的行为是意料之中的。

Ansible 中的角色最初只是一个组织功能。变量可以是游戏范围的,也可以是任务范围的,但不是角色范围的(也有额外的变量,事实,魔术变量的行为不同,但在这里无关紧要(。

在重头戏的roles部分中vars,它们首先被读取为重头戏变量(最后一个定义的值获胜(,然后对于角色中的每个任务,应用该角色声明中的vars


为避免此问题,您应该在tasks(或pre_tasks(中使用include_roleimport_role模块。

然后,根据您在评论中的其他要求:

[这] 使其他角色无法访问变量...

您可以通过在 Ansible 2.7 中设置新参数public,使角色中定义的defaultsvars在角色之外可见(截至撰写本答案时正在开发中(。


最终解决方案:

- 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

最新更新