我尝试从一个独特的剧本中控制同一个角色的调用n次与n个不同的变种:
---
- hosts: myhost
vars:
user: user1
virtualenv: venv_nameV3
roles:
- makeuser
- stack # use virtualenv var so stack role is installed in venv_nameV3
- stack # should need it's own virtualenv value e.g. venv_nameV4
- stack # should need it's own virtualenv value e.g. venv_nameV5
- stack # should need it's own virtualenv value e.g. venv_nameV6
答案 0 :(得分:6)
您可以使用以下语法
添加变量来参数化角色---
- hosts: myhost
vars:
user: user1
virtualenv: default_venv_name
roles:
- makeuser
- { role: stack, virtualenv: 'venv_nameV3' }
- { role: stack, virtualenv: 'venv_nameV4' }
- { role: stack, virtualenv: 'venv_nameV5' }
- { role: stack, virtualenv: 'venv_nameV6' }
答案 1 :(得分:2)
您无法插入正确的代码块作为注释,因此这里是用纯YAML而不是JSON编写的接受答案:
我的初步答案结果证明不正确。以下是更正后的内容:
---
- hosts: myhost
vars:
user: user1
virtualenv: default_venv_name
roles:
- makeuser
- role: stack
virtualenv: venv_nameV3
- role: stack
virtualenv: venv_nameV4
- role: stack
virtualenv: venv_nameV5
- role: stack
virtualenv: venv_nameV6
原始回答:
---
- hosts: myhost
vars:
user: user1
virtualenv: default_venv_name
roles:
- makeuser
- role: stack
vars:
virtualenv: venv_nameV3
- role: stack
vars:
virtualenv: venv_nameV4
- role: stack
vars:
virtualenv: venv_nameV5
- role: stack
vars:
virtualenv: venv_nameV6
虽然它们只是略有不同,但它们改变了Ansible处理默认变量的方式(在defaults/main.yml
中定义):
如果在剧本中包含角色时保留变量,Ansible将使用上一次同一角色的变量(“变量出血”)。
在接受回答的上下文中,如果未在virtualenv: venv_nameV6
角色的最后一次调用中设置stack
,则virtualenv
将具有值venv_nameV5
(来自之前的无论角色的stack
文件中设置了virtualenv
,都可以调用defaults/main.yml
角色。
如果你像我在更正的答案中所做的那样调用你的角色,你的角色的defaults/main.yml
文件将被尊重,virtualenv
将被设置为你定义为默认的任何角色。
微小差异,但很难追查。