我什么时候应该使用include vs class声明?我现在正在探索创建一个配置文件模块,但我正在努力学习方法论以及我应该如何解决问题。
一点背景,我正在使用puppet-labs java模块,可以找到here。
我的./modules/profile/manifests/init.pp看起来像这样:
class profile {
## Hiera Lookups
$java_version = hiera('profile::jdk::package')
class {'java':
package => $java_version,
}
}
这很好,但我知道我也可以删除代码的class {'java':
块,而是使用include java
。我的问题涉及两件事。一,如果我出于某种原因想要使用include语句,我怎么还能将包版本从hiera传递给它呢?第二,有这样做的首选方法吗?包含我真正不应该使用的东西,或者每种方法都有优点和缺点吗?
我的长期目标是为我的环境构建类似模块的配置文件。可能我会有一个适用于我所有服务器的默认配置文件,然后是不同应用程序加载的配置文件。我可以将配置文件包含到角色中,并将内容应用到该级别的各个节点。这有意义吗?
谢谢!
答案 0 :(得分:5)
我应该何时使用include vs class声明?
如果一个类声明另一个属于同一模块的仅内部类,则可以考虑使用类似资源的类声明。这充分利用了您对模块实现细节的了解,因为您需要能够证明在资源类之前不会评估其他类的声明。如果违反了该约束,则目录构建将失败。
在所有其他情况下,您应该使用include
或其中一个兄弟require
和contain
。
一,如果我想出于任何原因使用include语句,如何 我还可以将包版本从hiera传递给它吗?
与通过Hiera指定任何其他类参数的方式完全相同。 I already answered that for you
第二,是 有一个首选方法吗?
是的,见上文。
包括我的东西 真的不应该使用,或者有优点和缺点 每种方法?
{<1}}是您应使用的内容。这是您的默认设置,include
和require
是某些情况的替代选择。类似资源的声明语法在Puppet团队首次引入Puppet 2.6时,以及参数化类本身似乎都很好。但事实证明,该语法将深层设计问题引入语言,并且它已成为众多错误和令人头疼的根源。 Puppet 3中引入了自动数据绑定,部分用于解决其中的许多问题,允许您在不使用类似资源的声明的情况下为类参数赋值。
类似资源的语法具有单一优势 - 如果您想将其视为一个 - 参数值直接在清单中表示。传统的Puppet智慧认为,最好将数据与代码分开,以避免在配置要求发生变化时需要修改清单。因此,只有当您确信它们永远不会改变时,才能直接在清单中表达参数值。这类案例中最重要的一类是当一个类从外部源读取数据时(即通过Hiera查找它),并希望将这些值传递给另一个类。
类似资源的语法有一个很大的缺点,即如果在构造给定目标节点的目录期间在任何地方评估给定类的类似资源的声明,那么它必须是该类的第一个声明,即评估。相反,可以评估同一类的任何数量的包含类似的声明,无论是代替类似资源的声明,还是除了类似资源的声明之外。
类是单例,因此多个声明对目标节点的影响不会超过单个声明。允许它们非常方便。然而,众所周知难以预测Puppet清单的评估顺序,因此如果在清单集中的某处存在给定类的类似资源的声明,则在一般情况下确保它是第一个声明是非常困难的。被评估的类。可以在我上面描述的特殊情况下管理这种困难。这属于评估顺序依赖关系的更一般类别,您应该注意确保清单集没有这些依赖关系。
类似资源的语法还存在其他问题,但没有一个问题与评估顺序依赖关系一样重要。
上面提到的自动数据绑定将标识类参数的键与这些参数的对应值相关联。如果后端支持复合值,则支持复合值,默认YAML后端实际上支持复合值。您对此答案的评论表明您还没有完全理解这些细节,特别是您不认识到键识别(整个)类参数的重要性。
我举一个类的例子,一方面可以通过类似资源的声明声明:
contain
要使用类似于包含的声明,我们必须为该类提供一个值&#34; config&#34; Hiera数据中的参数。此值的关键字为class { 'elasticsearch':
config => { 'cluster.name' => 'clustername', 'node.name' => 'nodename' }
}
(&lt;完全限定的类名&gt; ::&lt;参数名称&gt;)。关联值是木偶边需要作为哈希(又名&#34;关联数组&#34;,又名&#34; map&#34;),因此它是如何在YAML格式层面中指定的数据:
elasticsearch::config
如果有多个条目,则值的哈希特性会更清晰。如果您不熟悉YAML,那么至少可以撇去一个引物,例如the one at yaml.org。
有了这些数据,我们现在可以通过
在我们的Puppet清单中声明该类elasticsearch::config:
"cluster.name": "clustername"
"node.name": "nodename"