gpt4 book ai didi

puppet - puppet 继承VS puppet 组成

转载 作者:行者123 更新时间:2023-12-03 13:43:07 28 4
gpt4 key购买 nike

我最近刚跨过木偶继承。围绕它的几个问题:


使用p继承是一种好习惯吗?一些经验丰富的木偶同事告诉我,木偶的继承不是很好,我不太相信。
来自OO世界,我真的很想了解木偶继承的原理,以及覆盖的原理。

最佳答案

这取决于继承,因为有两种类型的继承,而您没有提及您的意思。


节点继承:从一个node fqdn { }定义继承到另一个。强烈建议不要这样做,因为它会导致the principle of least surprise失败。吸引人们的经典示例是这样的:

node base {
$mta_config = "main.cf.normal"
include mta::postfix # uses $mta_config internally
}
node mailserver inherits base {
$mta_config = "main.cf.mailserver"
}


$mta_config变量是在基本范围内求值的,因此邮件服务器中尝试的“替代”无效。

无法直接影响父节点中的内容,因此与组合相比没有什么好处。该示例将通过删除继承并包括两者中的 mta::postfix(或另一个“ common” /“ base”类)来解决。然后,您也可以使用 parameterised classes
类继承:类继承的用途是,您可以覆盖父类中定义的资源上的参数。这样重新实现上面的示例,我们得到:

class mta::postfix {
file { "/etc/postfix/main.cf":
source => "puppet:///modules/mta/main.cf.normal",
}
service { ... }
}

class mta::postfix::server inherits mta::postfix {
File["/etc/postfix/main.cf"]:
source => "puppet:///modules/mta/main.cf.server",
}
# other config...
}


这确实有效,但是我会避免深入进行多个层次的继承,因为这将使维护变得很头疼。
但是,在这两个示例中,可以通过提前指定数据(通过ENC)或通过extlookup或hiera内联查询数据来轻松改进它们。

希望以上示例对您有所帮助。类继承仅允许覆盖参数-您不能删除先前定义的资源(一个常见问题)。始终使用大写的类型名称引用资源( file { ..: }将变为 File[..])。

同样有用的是,您还可以将参数定义为 undef,从而有效地取消设置它们。

关于puppet - puppet 继承VS puppet 组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11154090/

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