我接管了大约 20 个机器的 Linux 环境的管理职责。尝试使用 Puppet 整合配置管理。大部分操作都很简单,但是我在防火墙规则方面遇到了麻烦。
以前的管理员依靠自定义脚本,iptables
根据通用模板为每个框创建规则。
模板规则如下:
hostname: Action Interface Source Protocol destPort
一些例子:
ALL: Accept eth0 any tcp 80
server4: Accept All x.x.x.x/24 tcp/udp 111
node5: Deny All y.y.y.y
ALL 的规则将适用于所有框。其余参数用于填充 iptables 规则。模板中有大约 250 条规则。
是否可以通过 puppet 重新使用此通用模板并为每个节点构建 iptables 规则集?使用 puppet 是否可以进行这种文本处理?
答案1
并不真地。
更确切地说,它是技术上有可能。但由于 Puppet 的 DSL 或 Puppet 本身都不是为此类任务而设计的¹,您将在脆弱的口香糖和回形针解决方案上累积技术债务。³
恕我直言,既然你想保留这个模板,最好的做法是编写一个脚本,将数据从这种明显的遗留格式转换为本机 puppet DSL(发出.pp
你将适当包含的文件)²,使用最适合你的盒子的类型/模块。
现在,我不再需要一直重新运行脚本,而是让你的 puppet 体现权威来源。即在其中进行所有更改,并根据需要导出,直到你摆脱了依赖此格式的遗留管道。如果你的过渡期足够短,省略这一点可能是有意义的;而且你不介意“导入”几次。
¹) 如果你简单思考一下,就会明白:CM 的职责是这权威的配置数据来源,而不是破坏数据。这就是sed
、awk
、管道等的作用所在。
²)也考虑hiera。
³) 最有可能的是,你的继任者会因此而恨你,更重要的是,在走出兔子洞一段时间后,你会恨你自己。
答案2
答案3
看起来有人想重新实现岸墙但还没有完全到达那里......
我认为,如果您要寻找一种现成的解决方案来将自定义文件格式转换为 Puppet 资源,那您就走投无路了;作为一种自定义文件格式,其他人可能从未听说过或处理过它。不过,这种格式看起来相对简单,因此,使用您选择的语言快速编写一些脚本就可以将其转换为资源。当然,下一个问题是使用哪个包来定义 Puppet 中的防火墙资源...
相反,如果你想保持疯狂的自定义文件格式,但使用 Puppet 作为中介将“编译的”规则集发送到机器,我建议不要做任何特别花哨的事情。我可能会在部署树时在 Puppetmaster 上“编译”规则集,这样如果“源”文件发生更改,新的规则集将在文件服务器中可用,并在客户端下次运行时发送到客户端。
答案4
我们使用 Shorewall 来实现这一点。Shorewall 建立在 iptables (netfilter) 之上。Shorewall 中有几个模块木偶实验室在 Puppet 中自动化 Shorewall。
通常,Puppet 中有几个数据源,例如 Hiera 和 ENC。在这种情况下,如果您以正确的方式设置了 Hiera,则可以在其中进行防火墙配置。Hiera 的优点是您可以“否决”特定网络/主机/服务/等的配置(例如:default.yaml -> webserver.yaml -> apache.yaml)。包含您需要的密钥的最具体内容将是前导。
如果您需要从数据库(例如 MySQL)获取规则,您可以让 ENC 将这些规则传递给 Puppet。
在 Puppet 中,您可以为 Shorewall 制作模板(例如:webserver.erb)并将其包含在您的 Shorewall 配置中。它们可能包含以下内容:
# This file is managed by Puppet
<% @firewall_rules.each do |entry| -%>
<%= entry['ip'] %>/<%= entry['mask'] %> - - src,dst
<% end -%>