2016-09-23 73 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