考虑像这样的游戏设置:
- name: Provision the stage platform
hosts: my-stage-host
vars_files:
- ../../env_vars/base.yml
- ../../env_vars/stage.yml
roles:
- {role: 'some.ThirdpartyRole'}
- {role: 'My.Role', name: 'app1', somevar: 'var2', dict: {'var1': 'var2'}, list: [{'var1': 'var2'}]}
- {role: 'My.Role', name: 'app2', somevar: 'var2', dict: {'var1': 'var2'}, list: [{'var1': 'var2'}]}
这个设置很好,一切都按预期工作(虽然我不太喜欢数据结构)..问题是My.Role有很多角色实例特定的变量,列表和dicts等,遗憾的是不能在defaults/main.yml
中设置(因为它们特定于当前角色实例),并且因为我希望能够在一台服务器上多次使用此角色,所以我需要隔离变量。
在一个完美的世界里,我能够......
roles:
- My.Role
include: ../../varsA.yml
就像任务一样..但是从我到目前为止在文档和论坛中读到的内容来看,这是不可能的......
目前,我确实让我的角色使用以下不理想的设置:
文件:group_vars / my-host.yml
apps:
name: 'something'
someList:
- item
...
someDict:
item: item
itemsList:
- item
...
name: 'somethingElse'
someList:
- item
...
someDict:
item: item
itemsList:
- item
...
文件:playbooks / my-play.yml
...
roles:
- some.ThirdpartyRole
- My.Role
正如你所看到的,它从我的group_vars中定义的dict中获取所有变量,并且角色中的每个任务都使用with_items: myDict
,这使得子列表(以及其他内容)有点像噩梦,例如:
with_subelements:
- myDict
- subList
我无法检查mydict.subList
的存在,我需要在任何地方定义空的vars。
我希望我已经正确地解释了自己,我想知道是否有人在角色中使用大量变量的经验,他们需要在游戏中多次使用,或者在角色/ var布局上使用任何其他指针。< / p>
答案 0 :(得分:5)
我提出了一个解决方案,它不一定是“Ansible”方式,但在角色允许 include 指令之前(就像任务一样),这似乎是最干净的方式。
- name: My Play
hosts: my-host
roles:
- {"role": My.role, "vars_file": "../../vars/projectA.yml"}
- {"role": My.role, "vars_file": "../../vars/projectB.yml"}
- name: Load in project specific vars
include_vars: "{{ vars_file }}"
...
我在Ansibles Github上看到了一个最近issue可能影响这个解决方案,我将会看看是否仍然如此,我试试并尝试添加我的答案。