我一直在为puppet创建几个类(在不同的模块中)。两者分别需要maven。所以这两个类都有如下内容:
class { "maven::maven":
version => "3.0.5"
}
(使用puppet forge中的https://forge.puppetlabs.com/maestrodev/maven模块)
但是,如果我有一个节点同时拥有我的两个类,那么puppet会因为类'maven :: maven'被声明两次而抱怨。我觉得我的每个课程都应该可以自由地宣布它需要的所有东西。如果一个节点有多个类都需要maven,那么我没有看到问题。
所以,我的问题是:该maven模块的作者是否使用了一个类,他应该使用一个定义吗? (因为你可以多次使用/调用/任何定义)。看来,如果他使用了一个定义,我可以随心所欲地使用代码块,所以如果他使用一个类是正确的,为什么呢?
感谢。
答案 0 :(得分:8)
我认为这背后的基本原理最好在John Arundel's Puppet 3 Beginner's Guide中解释:
因此,如果您想知道使用哪个,请考虑:
- 您是否需要在同一节点上拥有此实例 (例如,一个网站)?如果是,请使用定义。
- 可能吗 导致与此节点上的同一事物的其他实例发生冲突 (例如,Web服务器)?如果是,请使用类。
答案 1 :(得分:0)
如果您将参数传递给某个类,则可能会发生冲突,问题是不清楚将使用哪些参数集。
如果你的第一个模块需要maven 3.0.5
,但你的第二个模块需要maven 3.0.6
,那么puppet将不知道使用哪一个。
puppet模块在使它成为类而不是资源/定义类型时也不能处理分辨率,因为它可能只用于单个安装。
Puppet目前仅支持重用不带参数的类声明,即。 include maven::maven
。
最后,在你自己的模块中声明对其他模块的依赖是一个棘手的事情,我不知道如何完全解决。