2016-09-23 74 views
1

有沒有辦法讓多個變量文件附加到數組?Ansible:附加到變量文件列表

的最終目標是讓每個文件添加爲啓動配置的AWS安全組,而不需要那些組複製到每個文件

例如:

group_vars/all.yml 
group_vars/php.yml 
group_vars/web.yml 

all.yml:

aws_security_groups: 
    - sg-ssh 

php.yml

aws_security_groups: 
    - sg-mysql 

web.yml

aws_security_groups: 
    - sg-http 

調試aws_security_groups生產:

TASK [Debugging] *************************************************************** 
ok: [XXX.XXX.XXX.XXX] => { 
    "aws_security_groups": [ 
     "sg-mysql" 
    ] 
} 

我們有API服務器和具有不同的縮放策略前端服務器。我希望Web服務器擁有組:sg-web和sg-ssh與api服務器具有:sg-web,sg-ssh和sg-mysql

+0

我認爲你可以更好地構建你的劇本,但是如果沒有更多的上下文,我不能給出更好的指導。 – smiller171

回答

2

AFAIK沒有辦法在列表變量期間合併列表變量在Ansible定義的時間。
作爲一種變通方法,可以使一個字典在您的all.yml

aws_security_groups: 
    all: 
    - sg-ssh 
    - sg-all 
    php: 
    - sg-mysql 
    web: 
    - sg-http 

或者在相應的組來定義每個子項(全部,PHP,Web等)瓦爾文件,並使用合併hash_behavior(但改變hash_behavior是通常不推薦)。

然後使用這個神奇的獲得安全組的列表:

- debug: msg="{{ (group_names + ['all']) | intersect(aws_security_groups.keys()) | map('extract', aws_security_groups) | sum(start=[]) }}" 

這將使根據不同羣組,當前主機的所有安全組的普通列表。

+0

這是一個很好的答案,因爲它會將鍵合併在一起。我期望做的是基於實例的標記,分配不同的組,而不需要將組複製到每個組文件中。這裏的解決方案意味着所有的實例都將獲得分配給該組的所有組。 +1爲所有的過濾器 – MANCHUCK