2014-11-04 46 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上,可能會影響這個解決方案,我我會去看看它是否仍然如此,一旦我嘗試了一些東西,我就會試着增加我的答案。