使用 Ansible 管理防火墙的最佳方法是什么?

使用 Ansible 管理防火墙的最佳方法是什么?

在使用 Ansible 编写剧本以进行配置(在 RHEL 上)的过程中firewalld,我们在处理运行配置和写入的配置时遇到了一些问题/etc/firewalld/firewalld.conf,这些配置通常通过 进行修改firewall-cmd。我们希望使用 Ansible 管理的防火墙系统在每次运行 Ansible 后都收敛到我们指定的状态(即,在firewalld针对主机运行剧本后,运行和写入的配置都处于所需状态)。

Ansible 提供了firewalld模块,可以管理许多设置。不幸的是,它不能做所有firewall-cmd能做的事情,比如设置类似的东西DefaultZone(这是我们想要管理的选项之一)。虽然我们最初认为解决模块缺点的方法firewalldfirewall-cmd使用 Ansible 命令模块运行,但我们很快意识到,如果你DefaultZone使用 Ansible 命令插件运行设置的值firewall-cmd,然后其他人使用文本编辑器修改中的值DefaultZonefirewalld.confAnsible 在尝试重置DefaultZone回其原始值时会失败,因为firewall-cmd它认为配置选项已经有了所需的值。

有谁知道在每次运行 Ansible 后,如何确保运行和写入的配置都firewalld处于所需状态?我们更担心卸载的配置更改会给我们带来意外,而不是担心有人对正在运行的规则集进行短暂更改,而这些更改将在下次firewalld从磁盘加载规则集时被替换,但如果我们可以使用 Ansible 管理一切,那就太理想了。

答案1

我遇到了同样的问题,过了一段时间,我切换到基于模板的自脚本解决方案(因此任何角色都可以添加模板,并且有一个单独的钩子来收集配置并管理 iptables)。但这不是问题所在。

首先 - 你写道,有人可以用文本编辑器修改文件...不要这样做。当然,Ansible 或任何自动过程都应该能够识别文件中的差异并覆盖或忽略它们。但是,例如,使用template编辑器使用和编辑同一个文件会导致一团糟 - 用一种方式或另一种方式进行。不要混合手动和自动过程。放手是新的酷。你可以用文档理由来争论......

第二 -firewalld尽可能多的 RedHat 产品设计为通过可执行文件来配置和运行服务。大多数其他 Linux 工具都可以通过文本文件进行配置。这使得使用 Ansible 管理服务变得更加困难。因为您可以运行commandshell脚本来解决所有幂等性问题,或者您可以使用模块 - 如果它存在的话。

第三 - Ansiblefirewalld模块并不完美(就像许多其他模块一样)。但是 - 它们是用 Python 编写的,编写符合您需求的自己的模块比预期的要容易得多。当然 - Python 知识是必要的 - 但通常您只需复制和粘贴现有模块参数和操作并更改底层命令即可。Ansible 模块通常会调用自身 shell 脚本或使用 Python 库。

所以 - 最好的方法是扩展模块(并将其提交给社区;-))。

如果您需要一个简单的解决方案并且模板不是其中之一,请使用command- 它会起作用但由于缺少幂等性并且很难识别当前状态(注册配置输出,解析它等),所以很丑陋。

我尝试模板化 XML 文件,但效果不太稳定。经常firewalld会忽略或覆盖它们,而且经常会我自己把自己锁在外面……

相关内容