centos 如何使用Ansible重新加载Firewalld服务?

kadbb459  于 2022-11-07  发布在  其他
关注(0)|答案(6)|浏览(216)

我用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
qoefvg9y

qoefvg9y1#

首先,使用with_items获取端口列表,如下所示:

- 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

如果端口不是固定的,也可以使用下面的代码输入端口,并将其用作变量:

- hosts: localhost
  gather_facts: no
  vars_prompt:
    - name: ports
      prompt: "Enter port(s) number"
      private: no
  tasks:
    - name: add port
      firewalld:
            service: "{{ item }}"
            permanent: yes
            immediate: yes
            state: enabled
      with_items: "{{ ports.split(',') }}"

关于重新加载firewalld,其提到的here我们不能使用状态参数重新加载firewalld,因此使用systemd模块如下:

- name: reload service firewalld
  systemd:
    name: firewalld
    state: reloaded
wqlqzqxt

wqlqzqxt2#

firewalld模块具有立即选项,该选项在firewall-cmd cli工具中执行相同的重新加载。

- name: Add port to firewalld
  firewalld:
    port: "{{ item }}"
    permanent: yes
    state: enabled
    immediate: true
vaj7vani

vaj7vani3#

您可以使用服务或systemd模块。


# Supports init systems include BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart.

- name: Restart service 
  service:
    name: firewalld
    state: restarted

# Controls systemd services on remote hosts.

- name: Restart service 
  systemd:
    state: restarted
    daemon_reload: yes
    name: firewalld
r8uurelv

r8uurelv4#

我有点晚了,但考虑到前面所有的答案似乎只是推测,我将提供另一个输入。Firewalld不是用'service'或'systemctl'命令重新加载的,而是用它自己的特定命令:

firewall-cmd --reload

这是因为这样你就可以加载新的规则,而不会像直接使用iptables那样中断任何活动的网络连接。考虑到这一点,我认为使用service或systemctl不是一个好的解决方案。所以如果你只是想创建一个任务,我建议你使用ansible的命令模块来执行这个命令。或者你可以这样写一个处理程序:

- name: reload firewalld
  command: firewall-cmd --reload

只需将处理程序放在您的角色内的handlers/main.yml文件中,然后在您的任务中,您可以使用以下命令调用该处理程序:

notify: reload firewalld

这样,Ansible只在Ansible运行结束时执行处理程序。我在RHEL 7上成功地测试了这个。

jdzmm42g

jdzmm42g5#

你已经得到了很多很好的答案,还有另一种可能的方法(尽管重载部分与cstoll的答案相同)。
如果您确定除了Ansible之外没有人会操纵firewalld规则,那么您可以使用模板直接在/etc/firewalld/zones中生成区域XML文件。

notify: reload firewalld

和相应的处理程序,如cstoll的答案所示。
这种方法的主要优点是,它比一次添加一个规则要快得多,也简单得多。
这种方法的缺点是,它不会保存添加到Ansible之外的防火墙中的任何规则。你可以很容易地创建无效的区域文件。2 firewall-cmd命令(以及firewalld模块)将验证每个规则的有效性。3例如,它检查区域是否重叠。

bvhaajcl

bvhaajcl6#

如果你使用的是permanent条件,你可以使用immediate选项。
示例:

- name: Apply Base Services
  ansible.posix.firewalld:
    service: "{{ item }}"
    state: enabled
    zone: public
    permanent: yes
    immediate: true
  loop:
    - http
    - https

应用此规则后,firewalld将自动重新加载。

相关问题