ansible:在剧本中使用不同的vars调用相同的角色

时间:2015-11-10 11:32:27

标签: ansible

我尝试从一个独特的剧本中控制同一个角色的调用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

2 个答案:

答案 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将被设置为你定义为默认的任何角色。

微小差异,但很难追查。