Puppet:Class 排序/遏制 - 总是错误的顺序

Puppet: Class Ordering / Containment - always wrong order

我阅读了很多有关订购带有容器的木偶 classes 的文章(我使用的是 Puppet 6)。但在一种情况下它仍然对我不起作用。也许我的英语不够好,我错过了一些东西。也许有人知道我做错了什么。

我有安装 puppetserver 的配置文件 (profile::puppetserver)。此配置文件有三个子class,我包含 profile::puppetserver

class profile::puppetserver(
) {
  contain profile::puppetserver::install
  contain profile::puppetserver::config
  contain profile::puppetserver::firewall
}

这对我来说很好。现在我想扩展这个配置文件并安装 PuppetDB。为此,我使用 puppet forge:

中的 puppetdb 模块

所以我所做的是将 profile::puppetserver::puppetdb 和包含添加到 profile::puppetserver

class profile::puppetserver::puppetdb(
) {

  # Configure puppetdb and its underlying database
  class { 'puppetdb': }

  # Configure the Puppet master to use puppetdb
  class { 'puppetdb::master::config': }
}

  1. 当我先配置 puppetserver 并在其后添加 profile::puppetserver::puppetdb 时,puppetdb 安装并且一切正常。

  2. 如果我直接使用 contain 添加它并立即配置所有内容,它会崩溃。这是因为 puppetdb 模块是在我的 主服务器 安装期间随机安装的(还有 postgresql 服务器等)。结果是我的 puppetserver 不是 运行,我的 puppetdb 没有生成本地 ssl 证书,服务也没有启动。

我首先尝试的是:

我直接在 profile::puppetserver::puppetdb 中安装了 puppetdb 软件包并使用了所需的标志。当我一次配置时它有效。

class profile::puppetserver::puppetdb (
) {

  Package { 'puppetdb':
    ensure => installed,
    require => Class['profile::puppetserver::config']
  }
}

所以我想我可以在上面的代码中做同样的事情:

class profile::puppetserver::puppetdb(
) {

  # Configure puppetdb and its underlying database
  class { 'puppetdb': 
    require => Class['profile::puppetserver::config']
  }

  # Configure the Puppet master to use puppetdb
  class { 'puppetdb::master::config': 
    require => Class['profile::puppetserver::config']
  }
}

但这不起作用...

所以我读到了关于傀儡 class 的控制和链条排序。所以我在 profile::puppetserver

中做了这个
class profile::puppetserver(
) {
  contain profile::puppetserver::install
  contain profile::puppetserver::config
  contain profile::puppetserver::firewall
  contain profile::puppetserver::puppetdb

  Class['profile::puppetserver::install'] ->
  Class['profile::puppetserver::config'] ->
  Class['profile::puppetserver::firewall'] ->
  Class['profile::puppetserver::puppetdb']
}

但它仍然没有任何效果...在我的 "puppetserver provisioning" 安装、配置、防火墙步骤中,他仍然开始安装 postgresqlpuppetdb 软件包。

我必须如何编写顺序,我在 profile::puppetserver::puppetdb 中调用的 puppetdb 模块中的所有内容仅在其余配置步骤完成后才开始?

我真的不明白。我认为这可能与以下事实有关,即我从 profile::puppetserver::puppetdb 内部的 puppetdb 模块而不是直接 Resource Type 声明 classes。因为当我将 Package Resource Type 与 Require Flag 一起使用时,它似乎有效。但我真的不知道该如何处理。我想一定有办法还是?

I think maybe it haves something to do with the fact, that i declare classes from the puppetdb module inside of profile::puppetserver::puppetdb and not the directly Resource Type. Because when i use the Package Resource Type with the Require Flag, it seems to work.

确实如此。

资源使用 class 或直接声明它们的定义类型实例进行排序,以及根据直接应用于它们的排序参数和说明进行排序。

因为classes可以声明多次,在不同的地方,排序对他们来说比较复杂。像您演示的类似资源的 class 声明(您确实应该尽可能避免)并不意味着声明的 class 有任何特定的顺序。通过 include 函数的声明也不行。

通过 require 函数的

Class 声明相对于声明的 class 或定义的类型在声明的 class 上放置单端排序约束,并且声明通过contain 函数放置了一个类似于应用于所有资源声明的双端排序约束。链接箭头和排序元参数可以对 classes 设置额外的排序约束。

But i really dont know how to handle this. I think there must be a way or?

您的最后一个示例显示了一种在 profile::puppetserver 级别强制执行排序的可行方法,但其有效性取决于其 contained class 中的每个采用相同方法的人对于他们自己声明的任何 classes,至少在那些第三级 classes 必须受第二级 classes 的顺序约束的地方。这似乎是你跌倒的地方。

另请注意,虽然确实需要对某些事物进行相对于其他事物的排序,但尝试对所有资源强制执行明确的总体排序没有必要或没有多大用处。尽可能用最轻的手工作,只放置那些有用的排序约束。