我用ansible在centos 7中添加了一些规则到firewalld。但是我必须重新加载firewalld守护进程,这样服务才能正常工作。有什么想法吗?
下面是我的ansible代码:
- name: Add port to firewalld
firewalld:
port: "{{ item }}"
permanent: yes
state: enabled
when: ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux'
loop:
- 8080/tcp
- 8000/tcp
- 8090/tcp
- 8040/tcp
6条答案
按热度按时间qoefvg9y1#
首先,使用
with_items
获取端口列表,如下所示:如果端口不是固定的,也可以使用下面的代码输入端口,并将其用作变量:
关于重新加载firewalld,其提到的here我们不能使用状态参数重新加载firewalld,因此使用systemd模块如下:
wqlqzqxt2#
firewalld模块具有立即选项,该选项在firewall-cmd cli工具中执行相同的重新加载。
vaj7vani3#
您可以使用服务或systemd模块。
r8uurelv4#
我有点晚了,但考虑到前面所有的答案似乎只是推测,我将提供另一个输入。Firewalld不是用'service'或'systemctl'命令重新加载的,而是用它自己的特定命令:
这是因为这样你就可以加载新的规则,而不会像直接使用iptables那样中断任何活动的网络连接。考虑到这一点,我认为使用service或systemctl不是一个好的解决方案。所以如果你只是想创建一个任务,我建议你使用ansible的命令模块来执行这个命令。或者你可以这样写一个处理程序:
只需将处理程序放在您的角色内的handlers/main.yml文件中,然后在您的任务中,您可以使用以下命令调用该处理程序:
这样,Ansible只在Ansible运行结束时执行处理程序。我在RHEL 7上成功地测试了这个。
jdzmm42g5#
你已经得到了很多很好的答案,还有另一种可能的方法(尽管重载部分与cstoll的答案相同)。
如果您确定除了Ansible之外没有人会操纵firewalld规则,那么您可以使用模板直接在/etc/firewalld/zones中生成区域XML文件。
和相应的处理程序,如cstoll的答案所示。
这种方法的主要优点是,它比一次添加一个规则要快得多,也简单得多。
这种方法的缺点是,它不会保存添加到Ansible之外的防火墙中的任何规则。你可以很容易地创建无效的区域文件。2 firewall-cmd命令(以及firewalld模块)将验证每个规则的有效性。3例如,它检查区域是否重叠。
bvhaajcl6#
如果你使用的是
permanent
条件,你可以使用immediate
选项。示例:
应用此规则后,
firewalld
将自动重新加载。