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

时间:2016-10-27 07:12:21

标签: 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 }}"

...将当前计算机所属的所有组的tcp_vars_<group>组变量聚合为tcp_ports。这有效......但感觉很脏。我知道在ansible.cfg中启用合并模式,但这个项目是巨大的,我不想对Ansible的操作进行如此根本的改变,因为确保事情的耗时测试阶段不要打破。我也读过咒语&#34;摆弄group_vars意味着你做错了,&#34;我确信我是......在这种情况下,我只是不知道如何做正确的事。

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

1 个答案:

答案 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时,将建立当前主机组名称和已知服务名称的交集,并为这些服务定义端口。