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

Ansible 第二个角色执行覆盖默认参数值,ansible,ansible-2.x,ansible-role,Ansible,Ansible 2.x,Ansible Role,我有一个ansible角色,它定义了两个参数和第二个参数的默认值 角色/上游/tasks/main.yml: --- - debug: msg: "Parameter in upstream is {{param}} and param2 is {{param2}}" --- param2: [] 角色/upstream/defaults/main.yml: --- - debug: msg: "Parameter in upstream is {{param}} and p

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

角色/上游/tasks/main.yml

---
- debug:
    msg: "Parameter in upstream is {{param}} and param2 is {{param2}}"
---
param2: []
角色/upstream/defaults/main.yml

---
- debug:
    msg: "Parameter in upstream is {{param}} and param2 is {{param2}}"
---
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中的角色最初只是一种组织特征。变量可以是角色范围的,也可以是任务范围的,但不能是角色范围的(还有外部变量、事实、魔术变量的行为不同,但在这里并不相关)

在一个剧本的
角色
部分中有
变量
,它们首先被读取为剧本变量(定义的最后一个值为wins),然后对角色内的每个任务应用该角色声明中的
变量


要避免此问题,您应该在
任务
(或
预任务
)中使用use或module

然后,根据您在中的附加要求:

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

您可以通过设置使角色中定义的
默认值
变量
在角色之外可见(在编写此答案时的开发中)


最终解决方案:

- 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

@谢谢techraf,这可以防止这个问题,但也会使其他角色无法访问变量。。。嗯……因为Ansible中的角色最初只是一种组织特征。变量可以是角色范围的,也可以是任务范围的,但不能是角色范围的(还有外部变量,不同的故事)。在一个剧本的
vars
内部
roles
部分中,它们首先被读取为剧本变量(最后一个值获胜),然后对于角色内部的每个任务,应用该角色声明中的
vars
。@techraf我看到了技术原因,但这非常违反直觉,我认为没有办法解决这个问题?谢谢。除了新的
public
功能外,这是我已经想到的方法。