Ansible:附加到包含可变文件的列表

时间:2016-09-23 16:04:37

标签: ansible jinja2

有没有办法让多个变量文件附加到数组?

最终目标是让每个文件为启动配置附加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

1 个答案:

答案 0 :(得分:2)

AFAIK在Ansible的定义时间内无法合并列表变量 作为解决方法,您可以在all.yml

中制作词典
aws_security_groups:
  all:
    - sg-ssh
    - sg-all
  php:
    - sg-mysql
  web:
    - sg-http

或者在相应的组变量文件中定义每个子键(all,php,web等)并使用merge hash_behavior(但通常不建议更改hash_behavior)。

然后使用这个魔法来获取安全组列表:

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

这将根据当前主机的组显示所有安全组的清单。