ansible:在剧本中用不同的变量调用相同的角色
ansible: call same role with differents vars in a playbook
我尝试通过一个独特的剧本来控制使用 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
您可以使用以下语法通过添加变量来参数化角色
---
- 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' }
您无法插入正确的代码块作为注释,因此这里是用纯 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 将使用相同角色 ("variable bleeding") 的前一个 运行 中的变量。
在已接受答案的上下文中,如果在最后一次调用 stack
角色时未设置 virtualenv: venv_nameV6
,virtualenv
将具有值 venv_nameV5
(来自之前对 stack
角色的调用),无论 virtualenv
在角色的 defaults/main.yml
文件中设置了什么。
如果您像我在更正答案中那样调用您的角色,您角色的 defaults/main.yml
文件将得到尊重,并且 virtualenv
将设置为您定义的任何默认值。
细微差别,但很难找到。
我尝试通过一个独特的剧本来控制使用 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
您可以使用以下语法通过添加变量来参数化角色
---
- 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' }
您无法插入正确的代码块作为注释,因此这里是用纯 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 将使用相同角色 ("variable bleeding") 的前一个 运行 中的变量。
在已接受答案的上下文中,如果在最后一次调用 stack
角色时未设置 virtualenv: venv_nameV6
,virtualenv
将具有值 venv_nameV5
(来自之前对 stack
角色的调用),无论 virtualenv
在角色的 defaults/main.yml
文件中设置了什么。
如果您像我在更正答案中那样调用您的角色,您角色的 defaults/main.yml
文件将得到尊重,并且 virtualenv
将设置为您定义的任何默认值。
细微差别,但很难找到。