我认为在 Puppet 中(还)没有正确的方法来执行以下操作,但这让我觉得很可取。
我希望我的类能够影响另一个类的模板文件的内容,这样我们既可以避免重复信息,又可以将信息放在它所属的位置。
例如,我们有一个“iptables”类和各种服务类,例如“postfix”、“webappfoo”等。
class webappfoo {
$myfwrules +> [ "-A INPUT -p tcp --state NEW -m tcp --dport 80 -j ACCEPT" ]
include apache
}
node webappserver {
include webappfoo
include iptables
}
但这不起作用;$myfwrules 数组只包含 webappfoo 中的那一行。
请注意,一个类可以读入另一个类;例如这里 iptables 可以只读取 $iptables::myfwrules; 但我不希望 iptables 必须了解 webappfoo。
这是一个范围界定问题。从语言教程:
所以
$myfwrules
被限定在它定义的类中。在你的情况下,你将它限定在 classwebappfoo
中,它不知道任何先前定义的$myfwrules
。您可以避开这一点,但更好的方法可能是使用定义。像这样的东西(未经测试,YMMV等):这样,您就有了一种可重用的方式来将规则添加到您的类中,而无需定义变量和担心范围。你最终会得到一堆代表 node规则集的
Exec
资源 (Exec["rule-webappfoo"]
, )。Exec["rule-postfix"]
foo
另请参阅现成的 iptables 模块。
编辑:这只是演示如何使用定义的示例。这并不意味着是没有问题的解决方案。首先,可能应用规则的顺序(可能使用
before
/after
)以及/sbin/iptables
每次调用的效率存在一些问题。我决定使用模板和多重连接来构建 iptables 规则。例如
它并不漂亮,它需要为每台计算机提供一个专用的 iptables.hostname.erb 文件。但这很简单。
还阅读了 Puppet 的存储配置和多个文件连接。
我有一段时间没有接触 puppet,所以我的语法可能有点生疏。“+>”应该是“+=”吗?无论如何,你试过这个吗?
这个 iptables 模块似乎是做我想做的唯一方法;它基本上是一个脚本,它获取 iptables.d/ 目录中的文件并从中构建 /etc/sysconfig/iptables 。这可能是我要使用的;但我觉得这种模式在Puppet本身应该是可以实现的。