2014-11-04 27 views
4

考虑播放设置,如下所示:怎样包括很多瓦尔进入Ansible角色

- 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有许多角色实例特定的变量,列表和字典等等,遗憾的是它们不能在defaults/main.yml中设置(因为它们是特定于当前角色实例的),并且因为我希望能够使用它在一台服务器上多次作用我需要隔离变量。

在一个完美的世界

,我将能够..

roles: 
    - My.Role 
     include: ../../varsA.yml 

就像使用任务..但是从我的文档和论坛至今读,那是不可能的......

目前,我有我的角色有以下不理想的设置工作:

文件:group_vars /我-host.yml

apps: 
    name: 'something' 
    someList: 
    - item 
    ... 
    someDict: 
    item: item 
    itemsList: 
     - item 
     ... 
    name: 'somethingElse' 
    someList: 
    - item 
    ... 
    someDict: 
    item: item 
    itemsList: 
     - item 
     ... 

文件:剧本/我-play.yml

... 
    roles: 
    - some.ThirdpartyRole 
    - My.Role 

正如你可以看到它需要它的所有瓦尔从我group_vars定义的字典,并在角色中的每个任务使用with_items: myDict,这使得子列表(除其他事情)有点噩梦的,是这样的:

with_subelements: 
    - myDict 
    - subList 

,我不能检查的mydict.subList的存在,而不是我到处都需要定义空瓦尔。

我希望我已经正确地解释了我自己,我想知道是否有人在角色中使用很多角色的任何经验,他们需要在剧本中多次使用,或角色/ var布局上的任何其他指针。

回答

5

我想出了一个解决方案,它不一定是“Ansible”方式,但是直到包含指令允许用于角色(因为它用于任务),这似乎是最干净的方式。

Playbook.yml

- name: My Play 
    hosts: my-host 
    roles: 
    - {"role": My.role, "vars_file": "../../vars/projectA.yml"} 
    - {"role": My.role, "vars_file": "../../vars/projectB.yml"} 

My.role /任务/ main.yml

- name: Load in project specific vars 
    include_vars: "{{ vars_file }}" 
    ... 

Include vars on ansible

我看到最近issue上Ansibles Github上,可能会影响这个解决方案,我我会去看看它是否仍然如此,一旦我尝试了一些东西,我就会试着增加我的答案。