为什么Puppet中的模块使用类(而不是定义)?

6

我一直在为木偶创建几个类(在不同的模块中)。两者都需要maven。因此,这两个类都有以下内容:

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

使用https://forge.puppetlabs.com/maestrodev/maven模块(来自Puppet Forge)

但是,如果我有一个节点同时拥有我的两个类,Puppet会抱怨类'maven::maven'被声明了两次。我认为每个类应该可以自由地声明它所需的所有内容。如果一个节点有多个类都需要maven,那么我不认为会有问题。

所以,我的问题是:那个maven模块的作者是否错误地使用了一个类,他应该使用一个定义呢?(因为您可以多次使用/调用/其他定义)。看起来,如果他使用了一个定义,我将能够像我喜欢的那样多次使用代码块,所以如果他使用一个类是正确的,为什么?

谢谢。

2个回答

8
我认为这背后的原理最好在John Arundel的Puppet 3初学者指南中解释:链接:
所以,如果你想知道该使用哪个,请考虑以下问题:
- 是否需要在同一个节点上拥有多个实例(例如网站)?如果是,则使用“定义”。 - 是否可能与此节点上同一物体的其他实例发生冲突(例如web服务器)?如果是,则使用“类”。

0

如果您将参数传递给一个类,可能会出现冲突的情况,问题在于不清楚哪组参数将被使用。

如果您的第一个模块需要 Maven 3.0.5,而第二个模块需要 Maven 3.0.6,Puppet 将不知道该使用哪个版本。

Puppet 模块将其制作为类而不是资源/定义类型时,解决冲突的能力不如资源/定义类型,因为它可能只是用于单个安装。

Puppet 目前仅支持重复使用没有参数的类声明,例如:include maven::maven

最后,在您自己的模块中声明对其他模块的依赖关系是一件棘手的事情,我还不知道如何完全解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接