我处于一种我无法看到正确使用方法的情况.我有多个服务器分配了不同的角色,分布在几个组中.与生产/暂存环境相比,我在本地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 }}"
Run Code Online (Sandbox Code Playgroud)
...汇总当前机器所属的所有组的tcp_vars_<group>
组变量tcp_ports
.这有效......但感觉很脏.我知道在ansible.cfg中启用合并模式,但这个项目是巨大的,我不想对Ansible的操作进行如此根本的改变,因为耗时的测试阶段确保事情不会中断.我也读到了"摆弄group_vars意味着你做错了"的口头禅,我相信我是......我只是不知道如何在这种情况下正确行事.
那里的任何人都以更合适的方式解决了这个问题?
您可以iptables_config
像这样创建角色并定义支持的服务组:
service_ports:
web:
- 80
- 443
node:
- 3000
mysql:
- 3128
Run Code Online (Sandbox Code Playgroud)
并制定如下规则:
- debug: msg="allow port {{ item }}"
with_items: "{{ group_names | intersect(service_ports.keys()) | map('extract',service_ports) | sum(start=[]) }}"
Run Code Online (Sandbox Code Playgroud)
因此,当您应用角色时,将iptables_config
建立当前主机组名称和已知服务名称的交集,并为这些服务定义端口.
归档时间: |
|
查看次数: |
796 次 |
最近记录: |