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

时间:2018-08-30 15:06:15

标签: ansible ansible-2.x ansible-role

我有一个角色,它定义了两个参数,第二个是默认参数。

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的默认设置的原因是什么?

1 个答案:

答案 0 :(得分:1)

您观察到的行为是预期的。

Ansible中的角色最初只是组织功能。变量可以是作用域,也可以是任务域,但不能是角色域(也有Extravars,Facts,Magic变量的行为有所不同,但此处不相关)。

在游戏的vars部分中放置roles时,它们首先被读取为游戏变量(最后一个值获胜),然后对于角色中的每个任务,vars角色声明已应用。


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

然后,根据您在the comment中的其他要求:

  

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

通过设置a new parameter public in Ansible 2.7(在编写此答案时仍处于开发阶段),可以使角色中定义的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