关系元参数与链接箭头之间有什么区别?

What is the difference between Relationship Metaparameters vs Chaining Arrows?

Puppet Language Relationships 页面有关系元参数(beforerequirenotifysubscribe)和链接箭头(->~>).

看来这些也能达到同样的效果。使用他们给出的示例,您可以使用 beforerequire 来指示顺序,或者您似乎也可以声明 Package['openssh-server'] -> File['/etc/ssh/sshd_config'].

这些选项有什么区别?

什么被认为是 "best practice" 订购?

此外,什么时候使用 before(或 notify)与 require(或 subscribe)比较好?这重要还是只是偏好问题?

same ordering relationship
package { 'openssh-server':
  ensure => present,
  before => File['/etc/ssh/sshd_config'],
}
file { '/etc/ssh/sshd_config':
  ensure  => file,
  mode    => 600,
  source  => 'puppet:///modules/sshd/sshd_config',
  require => Package['openssh-server'],
}

same notification relationship:
file { '/etc/ssh/sshd_config':
  ensure => file,
  mode   => 600,
  source => 'puppet:///modules/sshd/sshd_config',
  notify => Service['sshd'],
}
service { 'sshd':
  ensure    => running,
  enable    => true,
  subscribe => File['/etc/ssh/sshd_config'],
}

是的,关系元参数和链接运算符是实现相同目的的不同方法。元参数在 Puppet 中存在的时间更长。

链接运算符的特点是它们可以在资源声明范围之外使用,而无需覆盖资源参数(并非总是可以覆盖)。它们与资源收集器一起使用时特别有用,例如:

Group<||> -> User<||>

元参数以参数来区分。除其他事项外,这意味着它们的值可以从资源默认值和/或变量或 class 参数中提取。

在许多情况下,对于链接箭头还是元参数,两者都可行,目前还没有达成共识的最佳实践。当这种关系似乎是一种或两种资源的本质所固有的时候,我个人倾向于使用元参数,这在很多时候都是如此。

关于before/notify vs. require/subscribe,你会发现很多情况下,把关系定义在一个上更自然一边比另一边。当仅有条件地声明其中一个相关资源时尤其如此:您需要在有条件的一方声明关系,以免无条件的一方有时有未解决的关系。当许多资源必须与一个资源相关时也是如此:即使您知道所涉及的所有资源,通常更容易在 "many" 端声明关系。

然而,在很多情况下,是的,这是一个偏好问题。