开发/生产中的Ansible服务器/组

And*_*ank 3 vagrant ansible

我处于一种我无法看到正确使用方法的情况.我有多个服务器分配了不同的角色,分布在几个组中.与生产/暂存环境相比,我在本地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意味着你做错了"的口头禅,我相信我是......我只是不知道如何在这种情况下正确行事.

那里的任何人都以更合适的方式解决了这个问题?

Kon*_*rov 5

您可以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建立当前主机组名称和已知服务名称的交集,并为这些服务定义端口.