首页 > 解决方案 > 如何使用 ansible 清除不在列表中的任何 ufw 条目

问题描述

https://docs.ansible.com/ansible/latest/modules/ufw_module.html

我已将 Ansible 2 配置为允许一堆带有 ufw 的 ip 地址,其条目如下:

  - name: allow from this one computer
    ufw:
      rule: allow
      port: 22
      src: 192.168.5.5

但是,我还想删除任何旧条目或错误到达那里的条目。

例如,如果旧版本有 192.168.8.8,我想删除它。或者,如果有人手动添加它。

有没有合理的方法来做到这一点?我想如果服务器只由ansible配置,当我从列表中删除一个IP地址时,我添加一个条目来删除它,我不会有这个问题。

标签: ansibleansible-2.xufw

解决方案


在尝试使用 Ansible v2.9 标准化服务器的 UFW 时,我遇到了类似的问题,因为每个服务器都有不同的规则。

该方法是resetUFW,它删除所有现有规则,并创建我想要的规则,非常注意不要将我锁定在服务器之外

编码:


- name: Setup admin production UFW
  hosts: my_hosts
  gather_facts: no
  tasks:
    - block:
      - name: Reset UFW
        ufw: 
          state: reset

      - name: Allow outgoing
        ufw: 
          default: allow
          direction: outgoing

      - name: Disallow ingoing
        ufw: 
          default: deny
          direction: incoming

      - name: Establish regular admin rules
        ufw:
          rule: allow
          direction: in
          port: '5432'
          proto: tcp
          from_ip: '{{ item }}'
        loop:
          - 123.456.789/32
          - 987.654.321/32

      always:
        - name: Grant ssh access
          ufw:
            rule: allow
            direction: in
            port: '22'
            proto: tcp
            from_ip: 321.456.987/32
        
         - name: Enable Firewall
           ufw: 
            state: enabled

一步一步解释

注意block: always:参数。您将在内部设置几乎所有操作block:并作为安全阀离开always:,因此在发生任何故障时,您确信您仍然可以通过 SSH 访问您的服务器。

这也可以ignore_errors: yes在块级别完成,但我从文档中看出这不是“最安全”的选项。

Allow outgoingDisallow ingoing定义一般行为。

然后,您可以添加尽可能多的规则,并在always允许 SSH 的情况下关闭,并启用您的防火墙,并拥有一个安全的剧本。

推荐

我强烈建议你不要在服务器上测试你的 UFW 剧本,如果出现问题,你会错过。

在您已经设置了一个或两个 SSH 连接的单个测试服务器中测试您的 UFW 剧本,因此如果您拒绝所有 SSH 连接,您仍然在里面并且可以ufw allow 22


推荐阅读