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_nameV6virtualenv 将具有值 venv_nameV5(来自之前对 stack 角色的调用),无论 virtualenv 在角色的 defaults/main.yml 文件中设置了什么。

如果您像我在更正答案中那样调用您的角色,您角色的 defaults/main.yml 文件将得到尊重,并且 virtualenv 将设置为您定义的任何默认值。

细微差别,但很难找到。