第二角色执行覆盖默认参数值
Second role execution overrides default parameter value
我有一个 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 中的角色最初只是一种组织特征。变量可以是游戏范围或任务范围,但不是角色范围(还有 extravars、facts、magic 变量的行为不同,但此处不相关)。
在剧本的 roles
部分内使用 vars
,它们首先被读取为剧本变量(最后定义的值获胜),然后对于角色内的每个任务 vars
来自该角色声明的应用。
为避免此问题,您应该在tasks
(或pre_tasks
)中使用include_role
or import_role
模块。
然后,根据您在 中的附加要求:
[this] makes variables inaccessible to other roles...
您可以通过设置 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
我有一个 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 中的角色最初只是一种组织特征。变量可以是游戏范围或任务范围,但不是角色范围(还有 extravars、facts、magic 变量的行为不同,但此处不相关)。
在剧本的 roles
部分内使用 vars
,它们首先被读取为剧本变量(最后定义的值获胜),然后对于角色内的每个任务 vars
来自该角色声明的应用。
为避免此问题,您应该在tasks
(或pre_tasks
)中使用include_role
or import_role
模块。
然后,根据您在
[this] makes variables inaccessible to other roles...
您可以通过设置 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