基于模式的 Hiera 查找

基于模式的 Hiera 查找

我正在努力思考如何将我在大型 site.pp 文件中执行的操作转换为可以在 hiera 中使用的结构。通过阅读 puppet 文档,我不清楚 hiera 数据究竟是如何评估的,以及它何时适合图片。我最近从 puppet 2.7.x 升级到了 3.3.x。这包括 hiera 作为标准包的一部分,所以我想最终考虑使用它,因为它应该使我的设置更易于阅读/理解。

我使用系统来支持多个外部组织。这包括配置每个组织独有的系统。在我的 site.pp 顶部,我有一个如下所示的结构。我使用它来根据与客户端证书事实匹配的正则表达式为每个组织设置事实,这些事实的配置和发布方式可以可靠地识别每个组织。

# match organization
case $::clientcert {

  /.*example1.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 1' 
        ... }
  /.*example2.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 2' 
        ... }
  /.*example3.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 3' 
        ... }
  /.*example4.org/ :
      { $snmp_ro_community='...'
        $snmp_location='Example Org 4' 
        ... }
}

我浏览了示例,没有发现在 hiera.yaml 文件中有任何方法可以进行任何类型的模式匹配。但我怀疑我一定忽略了一些显而易见的东西。

我不想依赖自定义事实来实现这一点。我更愿意坚持使用客户端证书,因为我确信这将正确识别组织和系统,并且已使用强加密技术进行了确认。我不想将一个组织的值提供给另一个组织。

答案1

您可以设置 YAML 文件的层次结构以实现此目的。让我们从以下内容开始hiera.yaml

---
:hierarchy:
    - "host/%{fqdn}"
    - "domain/%{domain}"
    - "env/%{::environment}"
    - "ops/%{operatingsystem}"
    - "os/%{osfamily}"
    - common
:backends:
    - yaml
:yaml:
    :datadir: /etc/puppet/data

对于文件夹结构,您可以使用任何事实,您可以在输出中看到facter -y。例如,您可以为每个 CPU 架构设置 hiera 配置文件。然后,您将添加行

- "arch/%{::architecture}"

而 hiera 会看进arch/amd64.yaml

要调试 hiera,你可以转储当前的事实:

   $ facter -y > myhost.yaml

并寻找一些变量:

   $ hiera -y myhost.yml snmp_location --debug

Hiera 将遍历所有规则并尝试找到变量:

DEBUG: Mon Nov 11 11:00:23 +0100 2013: Hiera YAML backend starting
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking up snmp_location in YAML backend
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking for data source host/myhost.example.com
...
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Looking for data source ops/Ubuntu
DEBUG: Mon Nov 11 11:00:23 +0100 2013: Cannot find datafile /etc/puppet/data/ops/Ubuntu.yaml, skipping

为了匹配,$::clientcert最好将顶级域提取到单独的事实,然后只使用cert/example1.org.yaml包含如下内容的 yaml 文件:

---
snmp_location: 'Example Org 1'

值得注意的是,即使您的模块不包含任何 hiera 函数调用,您也可以轻松设置参数值:

class snmp (
  $location = 'foo',
) { 
# ...
}

一些 hiera 配置:

---
snmp::location: 'Example Org 1'

答案2

出于类似的原因,我也在寻找同样的东西。并且发现 github 中的 hiera backedn 很有帮助 jjulien/hiera-regex 。作为项目本身自述文件中的一个例子:您必须配置一个处理分组的新后端,如下所示:

/etc/puppet/hiera.yaml:

:backends:
  - regex
  - yaml
:yaml:
  :datadir: /var/lib/hiera
:regex:
  :datadir: /var/lib/hiera
:hierarchy:
  - "fqdn/%{::fqdn}"
  - common

/var/lib/hiera/fqdn/fqdn.regex:

---
 - '^mailin-trusted.example.org$':
     postfix::smtp_relay: 'mailout-dmz.example.org'
 - '^mailout.*':
     postfix::smtp_relay: 'smtp.mailgun.org'
 - '^mailin.*':
     postfix::smtp_relay: 'localhost'

然而,我看到一些 puppet-users 帖子和 puppetlabs 视频警告不要使用 hiera 进行分类,尤其是现在发布了带有节点管理器的 PE 3.7。

相关内容