我有一些使用情况,我想定义多个类似的资源,最终将在一个单一的文件(通过模板)。
作为一个例子,我试图写一个puppet模块,让我pipe理MAC地址和networking接口名称之间的映射(从puppet写udev的persistent-net-rules文件),但也有很多其他类似的用例。
我search了一下,发现它可以用新的参数化类语法来完成:如果以这种方式实现,它应该像这样使用:
node { "myserver.example.com": class { "network::iftab": interfaces => { "eth0" => { "mac" => "ab:cd:ef:98:76:54" } "eth1" => { "mac" => "98:76:de:ad:be:ef" } } } }
不错,我同意,但是当你pipe理更复杂的东西( 比如在这个模块中的networkingconfiguration,或者其他任何其他多个复杂资源中的单一configuration文件 )时,它会迅速爆炸。
在SF上有一个类似的问题,有人build议使用Pienaar的puppet-concat模块,但我怀疑它可能比参数化的类更好。
在configuration定义中,真正的酷和干净的东西就像包含的主机types一样 ,它的使用简单,漂亮,干净,自然映射到多个资源,最终将被configuration在一个地方。 换成我的例子,它会是这样的:
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倍的select,每个资源。
我真的应该将数组传递给参数化的类,还是有更好的方法来做这种东西? 傀儡(用户|开发者)社区是否有一些共识?
顺便说一句,我指的是2.7分支的最新稳定版本,我对老版本的兼容性不感兴趣。
我想你正在寻找的是types 。 types会给你你想要的语法,你可以在同一个主机上多次使用相同的types来configuration多个接口,这是你不能用类来完成的。
您可以使用定义types创build新的types ,这些types是用Puppet DSL编写的。 定义types的更多信息在这里 。 另一种创buildtypes的方法是用Ruby编写的自定义types 。
有关Defines Types的例子,请查看puppetlabs-apt , ripienaar-concat和razorsedge-network 。 海关types的好例子是puppetlabs – 防火墙和puppetlabs-vcsrepo 。