仅当服务存在时,Ansible 才会将规则添加到防火墙

仅当服务存在时,Ansible 才会将规则添加到防火墙

当尝试在 Ansible 中描述我的服务器时,我非常喜欢形成防火墙规则的想法,以便只启用主机/主机组上使用的端口/协议。

假设我有一个基于 Linux 的防火墙盒和 Web 服务器、mysql 服务器以及它后面的 openvpn 盒。当我设置 Web 服务器时,我会在其上应用一些角色(http/https、ntp 等),并且我想将所需的端口/协议添加到防火墙盒 iptables 定义中。如果稍后我禁用 ntp,那么我想禁用此盒 iptables 中与 ntp 相关的行。

这个想法是让防火墙设置连接到防火墙后面的盒子上启用的服务。

所以问题是:有可能做到漂亮又优雅吗?

答案1

我几乎总是构建自己的角色来部署服务,并且通常将这些服务的防火墙规则直接放在角色中。

以下是 nginx 的一个示例:

roles/nginx/tasks/firewall.yml

- name: Open ports with system-config-securitylevel
  command: "lokkit -q -p {{item}}:tcp"
  with_items: "{{nginx_firewall_open_services}}"
  when: ansible_os_family == 'RedHat' and ansible_distribution_major_version|int == 5
  tags: firewall

- name: Open ports with system-config-firewall
  command: "lokkit -s {{item}}"
  with_items: "{{nginx_firewall_open_services}}"
  when: ansible_os_family == 'RedHat' and ansible_distribution_major_version|int == 6
  tags: firewall

- name: Open ports with firewalld
  firewalld: "service={{item}} permanent=true immediate=true state=enabled"
  with_items: "{{nginx_firewall_open_services}}"
  when: ansible_os_family == 'RedHat' and ansible_distribution_major_version|int >= 7
  tags: firewall

roles/nginx/defaults/main.yml

nginx_firewall_open_ports: [80, 443]
nginx_firewall_open_services: ["http", "https"]

答案2

您可以使用when声明. 定义一个变量来表示是否应该启用该服务,稍后在任务中检查该变量。

例子:

vars:
  enable_ntpd: yes
tasks:
- name: enable ntpd service
  service:
    name: ntpd
    enabled: yes
    state: started
  when: enable_ntpd
- name: disable ntpd service
  service:
    name: ntpd
    enabled: no
    state: stopped
  when: not enable_ntpd
- name: enable firewall for ntpd
  iptables:
    chain: INPUT
    protocol: udp
    destination_port: 123
    jump: ACCEPT
  when: enable_ntpd
- name: disable firewall for ntpd
  iptables:
    chain: INPUT
    protocol: udp
    destination_port: 123
    jump: DROP
  when: not enable_ntpd

注意:我不太熟悉 ansibles iptables 模块,这可能不是最好的方法,但你应该明白这个想法

相关内容