【问题标题】:Puppet: Override resource-like class declarationPuppet:覆盖类似资源的类声明
【发布时间】:2020-08-08 18:16:30
【问题描述】:

希望比我有更多 puppet 经验的人能给我一些关于我正在尝试的配置的建议。

我使用saz/ssh 作为这个模块。

我的目标

  1. 使用此模块创建默认 ssh 配置,该配置会推送到所有 redhat 7/8 服务器。
  2. 允许在单个服务器上通过 hiera 覆盖单个 ssh 选项

为了实现#1,我创建了自己的“模块”,它声明了 ssh::server 类,并定义了我的选项。我相信这被称为类资源类声明。 (为了便于阅读,缩短了代码)

#
class profiles::sshd::config {
  class { 'ssh::server':
    validate_sshd_file   => true,
    storeconfigs_enabled => false,
    options              => {
      'Port'                      => [22],
      'AddressFamily'             => 'any',
      'ListenAddress'             => '0.0.0.0',
      'Protocol'                  =>  '2',
      'HostKey'                   => ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key','/etc/ssh/ssh_host_ed25519_key'],
      'RekeyLimit'                =>  'default none',
      'SyslogFacility'            => 'AUTHPRIV',
      'LogLevel'                  => 'INFO',
    }
  }
}

然后我将这个“模块”包含在我的基础中。这很好用,直到我想在单个服务器上覆盖这些选项中的任何一个。我无法让 hiera 工作。

声明

ssh::server::options:
    Port: [2222]

例如,在服务器的 fqdn yaml 文件中,什么都不做。如果我直接包含 ssh::server 模块,而不是通过我自己的类,那么 hiera 会覆盖工作。

我已经为 hiera 覆盖尝试了各种语法,但在 puppet 运行时从未得到任何输出,除非我直接使用该类。例如我试过:

ssh::server:options:
profiles::sshd::config:
profiles::sshd::config::ssh::server:
profiles::sshd::config::options:
profiles::sshd::config::ssh::server::options:

有没有更好的方法可以做我想做的事,或者任何人都可以就我如何以这种方式声明 hiera 覆盖提供帮助?

任何帮助都会非常有帮助

【问题讨论】:

    标签: yaml puppet hiera


    【解决方案1】:

    为了实现#1,我创建了自己的“模块”

    ...其中有一个名为profile::sshd::config的类...

    它声明了 ssh::server 类,并定义了我的选项。我相信这被称为类资源类声明。

    是的,您已经编写了类似资源的类声明。这通常是个坏主意。有几个原因,但其中一个是...

    [when] 我想在单个服务器上覆盖这些选项中的任何一个 basic[,] 我无法让 hiera 工作。

    通过类资源声明指定的类参数值优先于通过任何其他可用方式指定的值,包括 Hiera 数据。你不能覆盖它们。

    您有两个主要选择:

    1. 为包装类的每个您希望能够自定义的参数提供自己的参数。使用它们来初始化包装类:

      class profiles::sshd::config(
          Boolean $validate_sshd_file = true,
          Boolean $storeconfigs_enabled = false,
          Hash $options = { ... },
      ) {
        class { 'ssh::server':
          validate_sshd_file   => $validate_sshd_file,
          storeconfigs_enabled => $storeconfigs_enabled,
          options              => $options,
        }
      }
      

      假设您随后通过类包含声明声明类profiles::sshd::config,您可以通过 Hiera 自定义其参数。但请注意

    2. 如果您更改为类 ssh::server 的类包含声明,那么您既可以通过 Hiera 为其定义默认参数,也可以通过 Hiera 自定义其参数。

    还有一条中间道路:给定ssh::server 的类资源声明,您可以使用 Hiera 自定义除声明中指定的参数之外的任何和所有参数。因此,如果您希望避免某些参数可用于自定义,那么您可以考虑(仅)通过类似资源的类声明显式声明它们,其余部分依赖 Hiera。但是请注意,这仍然会让您对类似资源的类声明的其他一些问题持开放态度(这将是一个单独的问题)。

    【讨论】:

    • 谢谢!我认为可能是这种情况,但发现很难找到可以肯定地说的文档。我选择将 hiera 用于基本配置和其他范围的配置。从设计的角度来看,我更喜欢使用配置文件类来定义基本配置的想法,但我知道这是 puppet 的限制。利用不能覆盖类声明之类的资源这一事实的好主意。我会记住这一点。
    猜你喜欢
    • 2013-06-03
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    相关资源
    最近更新 更多