Puppet:将自定义模板转换为配置文件

Puppet:将自定义模板转换为配置文件

我接管了大约 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 的职责是权威的配置数据来源,而不是破坏数据。这就是sedawk、管道等的作用所在。

²)也考虑hiera。

³) 最有可能的是,你的继任者会因此而恨你,更重要的是,在走出兔子洞一段时间后,你会恨你自己。

答案2

最明智的做法是使用自定义脚本将你提到的旧文件中的旧配置解析到 puppet DSL 中,然后修改防火墙模块包括对您的遗留系统的支持并在其上运行 puppet。

您可以使用ipfilter以傀儡锻造厂为起点。

一种快速而又简单的方法是define根据节点的操作系统来包装 ipfilter 和防火墙。

答案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 -%>

相关内容