“::mysql::server”和“mysql::server”的区别

vik*_*k-y 5 puppet

我正在浏览一个旧的木偶代码。它使用 mysql puppet 模块来安装 mysql-server。

我遇到了这个

class { '::mysql::server':

}
Run Code Online (Sandbox Code Playgroud)

和这个

class { 'mysql::server':
}
Run Code Online (Sandbox Code Playgroud)

现在我很困惑。它们是同一个意思还是两者之间有什么区别?

Jon*_*Jon 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
Run Code Online (Sandbox Code Playgroud)

我要指出的是,虽然这对于类作用域是正确的,但对于 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
Run Code Online (Sandbox Code Playgroud)

  • 前导 `::` 在*当前* Puppet 中是多余的,但在 Puppet 2 中使用它是一种常见的做法,因为它确实解决了您假设的范围问题。我忘记是 Puppet 3 还是 Puppet 4 发生了变化,但至少从 Puppet 4 开始,你不需要前面的双冒号。 (3认同)
  • 然而,即使在更改之前,前导双冒号通常更多的是一种安全实践,而不是要求。那时的傀儡会使用越来越广泛的范围作为基础来执行相对名称的名称搜索,因此主要的风险是它会找到“错误”的目标,而不是它无法找到实际上存在的目标。如今,所有名称都相对于顶级范围或本地范围进行解释,具体取决于它们是否包含任何名称空间段。 (2认同)