我有一些用例,我想定义多个类似的资源,这些资源最终应该放在一个文件中(通过模板)。
举个例子,我正在尝试编写一个 puppet 模块,它可以让我管理 MAC 地址和网络接口名称之间的映射(从 puppet 编写 udev 的 persistent-net-rules 文件),但也有许多其他类似的用例。
我四处搜索,发现可以用新的参数化类语法:如果以这种方式实现,最终应该像这样使用:
node { "myserver.example.com":
class { "network::iftab":
interfaces => {
"eth0" => { "mac" => "ab:cd:ef:98:76:54" }
"eth1" => { "mac" => "98:76:de:ad:be:ef" }
}
}
}
我同意,还不算太糟,但当你管理更复杂的东西时,它会迅速爆炸(想想网络配置)。就像在这个模块中或任何其他单个配置文件中的多个复杂资源东西)。
在SF 上的类似问题有人建议使用Pienaar 的 puppet-concat 模块但我怀疑它能否比参数化类更好。
在配置定义中真正酷和干净的东西应该是这样的包含主机类型,它的用法简单、漂亮、干净,并且自然地映射到多个资源,最终将在一个地方进行配置。换成我的例子,它会是这样的:
node { "myserver.example.com":
interface {
"eth0":
"mac" => "ab:cd:ef:98:76:54",
"foo" => "bar",
"asd" => "lol",
"eth1":
"mac" => "98:76:de:ad:be:ef",
"foo" => "rab",
"asd" => "olo",
}
}
...在我看来这要好得多,即使每个资源都有 3 倍的选项。
我真的应该将数组传递给参数化类吗?或者有更好的方法来做这种事情?Puppet [用户|开发人员] 社区中是否存在一些公认的共识?
顺便说一句,我指的是 2.7 分支的最新稳定版本,我对与旧版本的兼容性不感兴趣。
答案1
我认为你要找的是类型。类型会给你你想要的语法,而且你可以在同一个主机上多次使用同一种类型来配置多个接口,而这是用类无法做到的。
你可以使用以下方式创建新类型定义类型,使用 Puppet DSL 编写。有关定义类型的更多信息,请参阅这里. 创建类型的另一种方法是使用自定义类型,它们是用 Ruby 编写的。
有关定义类型的示例,请查看puppetlabs-apt,里皮纳尔-康卡特, 和razorsedge 网络. 海关类型的典型示例包括puppetlabs-防火墙和puppetlabs-vcsrepo。