gpt4 book ai didi

Puppet Include vs Class 和最佳实践

转载 作者:行者123 更新时间:2023-12-04 12:04:09 24 4
gpt4 key购买 nike

我什么时候应该使用包含和类声明?我现在正在探索创建一个配置文件模块,但是我在方法论和我应该如何布局方面苦苦挣扎。

一点背景知识,我正在使用 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 传递给它?其次,是否有这样做的首选方法? include 是我真的不应该使用的东西,还是每种方法都有优点和缺点?

我的长期目标是为我的环境构建类似模块的配置文件。可能我会有一个适用于我所有服务器的默认配置文件,然后是不同应用程序负载的配置文件。我可以将配置文件包含到一个角色中,并将内容应用于该级别的各个节点。这有意义吗?

谢谢!

最佳答案

When should I be using an include vs a class declaration?



当一个类声明另一个属于同一模块的内部类时,您可以考虑使用类似资源的类声明。这利用了您对模块实现细节的了解,因为您需要能够证明在类似资源的声明之前不会评估相关类的其他声明。如果违反了该约束,则目录构建将失败。

在所有其他情况下,您应该使用 include或其兄弟之一, requirecontain .

One, if I wanted to use an include statement for whatever reason, how could I still pass the package version from hiera to it?



与通过 Hiera 指定任何其他类参数的方式完全相同。 I already answered that for you .

Second, is there a preferred method of doing this?



是的,见上文。

Is the include something I really shouldn't be using, or are there advantages and disadvantages to each method?


include是你应该使用的。这是您的默认设置,使用 requirecontain作为某些情况的替代品。 Puppet 团队在 Puppet 2.6 中首次引入类似资源的声明语法以及参数化类本身时,对它们来说似乎很好。但事实证明,这种语法在语言中引入了深刻的设计问题,并且它一直是许多错误和头痛的根源。 Puppet 3 中引入了自动数据绑定(bind),部分原因是为了解决其中的许多问题,允许您在不使用类资源声明的情况下为类参数赋值。

类似资源的语法具有唯一的优势——如果您想将其视为一个优势——参数值直接在 list 中表示。然而,传统的 Puppet 智慧认为最好将数据与代码分开,以避免随着配置需求的变化而需要修改 list 。因此,仅当您确信它们永远不会改变时,直接在 list 中表达参数值是一个好主意。此类情况中最重要的一类是当一个类从外部源读取数据(即通过 Hiera 查找),并希望将这些值传递给另一个类时。

类资源语法有一个很大的缺点,即如果在为给定目标节点构建目录期间的任何地方评估给定类的类资源声明,那么它必须是该类的第一个声明被评估。相比之下,可以评估同一类的任意数量的类包含声明,无论是代替类资源声明还是除了类资源声明。

类是单例的,因此多个声明对目标节点的影响并不比单个声明更大。允许它们非常方便。众所周知,Puppet list 的评估顺序很难预测,因此,如果 list 集中某处给定类的类资源声明,在一般情况下很难确保它是该类的第一个声明被评估的类。在我上面描述的特殊情况下,可以解决这个困难。这属于更一般的评估顺序依赖项,您应该注意确保您的 list 集没有这些。

类似资源的语法还有其他问题,但没有像评估顺序依赖性那么重要。

关于自动数据绑定(bind)的说明

上面提到的自动数据绑定(bind)将标识类参数的键与这些参数的相应值相关联。如果后端支持复合值,则支持复合值,默认 YAML 后端实际上支持复合值。你对这个答案的评论表明你还没有完全理解这些细节,特别是你没有认识到识别(整个)类参数的键的重要性。

我以你的类为例,一方面可以通过这个类似资源的声明来声明:
class { 'elasticsearch':
config => { 'cluster.name' => 'clustername', 'node.name' => 'nodename' }
}

要改用类似包含的声明,我们必须在 Hiera 数据中为类的“config”参数提供一个值。这个值的键是 elasticsearch::config (<完全限定的类名>::<参数名>)。相关联的值需要在 puppet 端作为散列(又名“关联数组”,又名“映射”),所以这就是它在 YAML 格式的 Hiera 数据中的指定方式:
elasticsearch::config:
"cluster.name": "clustername"
"node.name": "nodename"

如果有多个条目,值的散列性质会更清楚。如果您不熟悉 YAML,那么至少浏览一下入门书可能是值得的,例如 the one at yaml.org .

有了这些数据,我们现在可以简单地通过以下方式在我们的 Puppet list 中声明该类
include 'elasticsearch'

关于Puppet Include vs Class 和最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46815402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com