当尝试在 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 模块,这可能不是最好的方法,但你应该明白这个想法