为什么模块在puppet中使用类(而不是定义)

时间:2013-11-18 16:29:00

标签: puppet

我一直在为puppet创建几个类(在不同的模块中)。两者分别需要maven。所以这两个类都有如下内容:

    class { "maven::maven":
        version => "3.0.5"
    }

(使用puppet forge中的https://forge.puppetlabs.com/maestrodev/maven模块)

但是,如果我有一个节点同时拥有我的两个类,那么puppet会因为类'maven :: maven'被声明两次而抱怨。我觉得我的每个课程都应该可以自由地宣布它需要的所有东西。如果一个节点有多个类都需要maven,那么我没有看到问题。

所以,我的问题是:该maven模块的作者是否使用了一个类,他应该使用一个定义吗? (因为你可以多次使用/调用/任何定义)。看来,如果他使用了一个定义,我可以随心所欲地使用代码块,所以如果他使用一个类是正确的,为什么呢?

感谢。

2 个答案:

答案 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

最后,在你自己的模块中声明对其他模块的依赖是一个棘手的事情,我不知道如何完全解决。