我处于无法正确使用方法的情况。我有多个服务器分配了不同的角色,分布在几个组中。与生产/暂存环境相比,我在本地Vagrant环境中遇到了group_vars的一些困难。在生产中,有更多的服务器,分配更少的组。在我的Vagrant环境中,我拥有的机器较少,每个机器分配了更多的角色/组。我有一台机器,特别是一组组的成员,每个组都有自己的变量," tcp_ports",它列出了应该在我的iptables角色中打开的端口,作为成员的服务器那个小组。当然,问题是Ansible不会自动将此变量合并到所有group_vars中。
到目前为止我的解决方案是重命名变量tcp_ports_<group name>
然后,在我的iptables角色中,我有以下任务:
- name: Combine tcp_ports_<group> into tcp_ports
set_fact:
tcp_ports: "{{ tcp_ports|default([])|union(hostvars[inventory_hostname]['tcp_ports_' + item]|default([])) }}"
with_items: "{{ group_names }}"
...将当前计算机所属的所有组的tcp_vars_<group>
组变量聚合为tcp_ports
。这有效......但感觉很脏。我知道在ansible.cfg中启用合并模式,但这个项目是巨大的,我不想对Ansible的操作进行如此根本的改变,因为确保事情的耗时测试阶段不要打破。我也读过咒语&#34;摆弄group_vars意味着你做错了,&#34;我确信我是......在这种情况下,我只是不知道如何做正确的事。
那里的任何人都以更恰当的方式解决了这个问题?
答案 0 :(得分:5)
您可以制作iptables_config
角色,并在此处定义支持的服务组:
service_ports:
web:
- 80
- 443
node:
- 3000
mysql:
- 3128
并制定如下规则:
- debug: msg="allow port {{ item }}"
with_items: "{{ group_names | intersect(service_ports.keys()) | map('extract',service_ports) | sum(start=[]) }}"
因此,当您应用角色iptables_config
时,将建立当前主机组名称和已知服务名称的交集,并为这些服务定义端口。