我接pipe了20个左右的Linux环境的pipe理职责。 试图使用Puppet来整合configurationpipe理。 大多数是直截了当的,但是我偶然发现了防火墙规则。
以前的pipe理员依靠一个自定义的脚本,为通用模板中的每个框创build了iptables规则。
模板规则如下所示:
hostname: Action Interface Source Protocol destPort
一些例子:
ALL: Accept eth0 any tcp 80 server4: Accept All xxxx/24 tcp/udp 111 node5: Deny All yyyy
所有规则适用于所有的框。 其余的参数被用来填充iptables规则。 模板中约有250条规则。
是否有可能通过puppet重新使用这个通用模板,并为每个节点构buildiptables规则集? 这种文字是否可以用傀儡破坏?
不是真的。
更确切地说, 这在技术上是可行的。 但既然傀儡的DSL或傀儡本身都不是为这种任务而devise的,那么就会在脆弱的口香糖和回形针解决scheme上累积技术债务。
恕我直言,因为你想保留这个模板,最好的行动方式是编写一个脚本,将数据从这个显然遗留的格式转换到本地木偶DSL(发射.pp文件,你会适当包括)²,使用任何types/模块是最适合你的boxen。
现在,不是一直重新运行脚本,而是让您的木偶体现权威来源。 即在那里做所有的改变,并根据需要导出,直到你摆脱依赖于这种格式的遗留pipe道。 如果你的过渡时间足够短,那么省略这个可能是有意义的。 而且你不介意几次“import”。
¹)如果您简单思考一下,这应该是显而易见的:CM的职责是成为configuration数据的权威来源,而不是破坏数据。 那就是sed , awk ,Pipes等等。 是给。
²)考虑hiera。
³)最有可能的是,你的继任者会憎恨你的,更重要的是,你会在离兔子洞一段距离后恨自己。
这样做的最好办法就是用自定义脚本parsing你从旧文件中提到的旧configuration文件,并修改防火墙模块以包含对旧系统的支持,并在其上运行puppet。
你可以用傀儡伪造ipfilter作为起点。
一个快速和肮脏的方法来做到这一点是通过使用define包裹ipfilter和防火墙取决于节点的操作系统。
有点像有人想重新实施shorewall ,并没有完全到达那里…
我认为你将不幸运的寻找一个现成的解决scheme,将这种自定义文件格式转换成Puppet资源; 作为一个自定义的文件格式,没有人会听说过或处理过它。 不过,这种格式看起来相对比较简单,所以用你select的语言做一些简单的脚本就可以把它变成资源。 下一个问题当然是用哪个软件包来定义Puppet中的防火墙资源…
相反,如果你想保持疯狂的自定义文件格式,但是使用Puppet作为中介将“编译”规则集发布到机器上,我build议不要做任何特别的事情。 在部署树时,我可能会考虑在Puppetmaster上“编译”规则集,这样,如果“源”文件发生变化,那么新的规则集将在文件服务器中可用,并在客户端运行时他们接下来跑。
我不相信你可以在Puppet DSL中实现这种转换。
您将需要编写一个消耗文本input的Ruby函数 ,并为防火墙模块 创build资源 。
我们正在使用Shorewall来实现这一点。 Shorewallbuild立在iptables(netfilter)之上。 傀儡中有几个模块来自动化木偶中的岸边墙 。
通常你在Puppet有两个数据源,例如Hiera和一个ENC。 在这种情况下,如果你有正确的方式设置Hiera,你可以在那里configuration你的防火墙。 Hiera的好处是你可以“替代”特定networking/主机/服务/等的configuration(例如:default.yaml – > webserver.yaml – > apache.yaml)。 包含您需要的钥匙的最具体的将是领导。
如果你需要从数据库中获取规则(例如MySQL),你可以让ENC把它们传递给Puppet。
在Puppet中,您可以为Shorewall制作模板(例如:webserver.erb),并将其包含在您的shorewallconfiguration中。 他们可能包含这样的东西:
# This file is managed by Puppet <% @firewall_rules.each do |entry| -%> <%= entry['ip'] %>/<%= entry['mask'] %> - - src,dst <% end -%>