我正在查看一个旧的p代码。它使用mysql puppet模块安装mysql-server。
我碰到了
class { '::mysql::server':
}
还有这个
class { 'mysql::server':
}
现在我很困惑。他们俩是同一件事还是两者之间有什么区别?
答案 0 :(得分:4)
这是一个非常好的问题。简短的答案是它们是相同的,并且类名不需要::
。
我一直认为需要使用初始的::
来避免范围模糊(其中include bar
类中的foo
将包含::foo::bar
而不是::bar
)但是检查文档时,他们说,例如include
必须使用类的全名。
一个工作示例:
$ cat scope.pp
class foo {
class bar {
notice("foo::bar")
}
class { 'bar':
}
}
class bar {
notice("bar")
}
class { 'foo':
}
$ puppet apply scope.pp
Notice: Scope(Class[Bar]): bar
我会注意到,尽管对于类作用域而言这是正确的,但对于Puppet中的变量作用域而言,当然并非如此,如下所示。
$ cat var_scope.pp
$bar = "bar"
class foo {
$bar = "foo::bar"
notice($::bar)
notice($bar)
}
include foo
notice($bar)
$ puppet apply var_scope.pp
Notice: Scope(Class[Foo]): bar
Notice: Scope(Class[Foo]): foo::bar
Notice: Scope(Class[main]): bar
答案 1 :(得分:2)
它们都是同一意思还是两者之间有区别?
TL; DR :对于类和定义的类型,它们的含义相同。支持带有前导::
的形式可以看作是向后兼容功能,内部一致性功能或两者兼而有之。但是,对于变量,前导::
表示顶级变量,如果使用裸变量名,则可能会或可能不会。
要弄清楚@Jon已经提出的好的答案的一些细节,我们必须考虑Puppet 3版及更早版本的行为。 Puppet的主要文档站点上不再有此文档,但是我们可以在Puppet的online archive of obsolete documentation中找到相关的文档。具体来说,我们想看看Puppet 命名空间和their behavior。如果您对这类文档感兴趣,那么这些文档将是很有趣的读物,尤其是关于historical perspective的Puppet 3如何最终实现的目标,但这是事件的一种异想天开的版本:
一开始,伪造是无形的和空洞的,没有模块。每个人都为所有内容编写自己的代码,忠实的开发人员受到了极大的压迫,重新发明了许多轮子。
在那时,构思了模块的想法。那天的模块是使用当时国外的功能构建的,例如import
函数,此功能此后就已经消失了。但是随着代码共享出现了名称冲突,为此,人们以命名间隔作为回应。然后,Reduction Labs查看了命名空间,并发现这很好。
但是,并非所有内容都对Reduction或人们都清楚,并且Reduct出于无知而提出了相对的名称解析。相对名称解析非常深入地检查了名称和名称空间,试图相对于作用域中的每个名称空间解析甚至合格的名称。一些人为便利感到高兴,但其中的智者很快就陷入困境。对于他们来说,很明显,相对名称解析看起来太深了,看到了太多。它有时会看到原本不该看到的东西,并为信徒开辟了道路,使他们陷入错误。
所以智者介入了。他们宣称应该限制和克服相对的命名空间,通过仅将锚定到一个真正的匿名命名空间(该名称在任何其他Puppet之前都存在)中锚定的名称来驯服。束缚的形式是领先的双冒号::
。而且,尽管相对名称解析通常可以毫不费力地完成相同的工作,但许多人还是留意了明智之举,并为此受到赞扬。
然后,Reduction将自己命名为Puppet Labs,遗憾地创建了相对的名称解析,并敦促人们遵循明智者的建议。但是,当它提出木偶的第三纪年时,它并没有给那些没有引起注意的人们带来麻烦,所以它允许相对的名字解析生活。
但是到了第四纪元的曙光,木偶,不再是实验室,才鼓起勇气,终于杀死了相对的名字解析,而不再是。从那天起,Puppet不再敦促类别和类型的提供者和用户使用领先的双冒号,但它尊重过去的智慧遗产,并对那些迟钝的人感到遗憾。
然而,由于伪善,Puppet从所有命名的事物中选择了类变量,作为仅有的两个名字。它们具有超越命名空间的作用域,并且在它们的作用域中,可以通过其定义的简单名称来了解它们。但是,像所有已命名的事物一样,它们在任何地方都可以通过其命名空间名称(由它们的简单名称和类名称组成)以任何一种形式获知。但是,顶级范围的变量呢?隐藏在阴影中时,凭什么名字知道它们?在这里领先的双冒号仍然有效。它的最高作用域标记对于变量不是多余的,其中一些明智的做法是始终对此类变量使用它来使代码清晰。