通过 Hiera 根据主机名将 class 分配给节点

Assigning a class to a node based on host name via Hiera

我以前经常使用 Puppet,从 0.x 到 1.0 发布前后,然后换了工作,但现在我又回来了。 Puppet 中的 Hiera 对我来说是新的(还有很多其他东西)。

我的理解是否正确,即基本上不可能根据与 Hiera 匹配的主机名(或证书名称)模式将 classes 分配给节点组?

例如,如果主机类似于 "ntp1.foo.com",我曾经分配 ntp 服务器 classes。使用 site.pp 中的直接 node 定义非常容易,我正在尝试将这个概念转移到基于 Hiera 的世界中。我让 Hiera 分配其他 classes,并希望将所有这些分配集中到一个地方。

我发现这样做的唯一方法是通过一些非 Hiera 方式设置参数并使用它在 Hiera 中的值来匹配路径。例如,在我的 enc 脚本中,我导出如下参数:

echo "parameters:"
if [ ... ]; do echo "  ntpRole: server; else echo "  ntpRole: client"; fi

在 Hiera 中我会做类似的事情:

- "roles/ntp-%{ntpRole}"

我认为也可以通过自定义事实来做到这一点。

这行得通,但似乎有点乱七八糟。有 better/recommended 替代方案吗?

一个问题是每个节点 必须 有一个值(每个节点都被分配了一个 ntp-something class ).这适用于 NTP,因为所有机器都是 NTP 客户端或服务器,但对于一些存在的东西它不是。

例如:网络服务器角色。有些机器不是 web 服务器,所以我不想包含它 class,但对于其他我想包含的机器,我真的不想在每个节点的文件中维护它并且不真的不想到处都有空 *-none 角色 class(例如 web-noneweb-server)。我希望所有名为 www* 或基于其他一些标准的机器加载 roles/web class。这可以用 Hiera 完成吗?

如果您的角色与服务器事实相关,那么您可以使用自定义事实来分配角色。既然你说你以前是根据服务器名称做节点 classification,我假设这是你想走的路。

# custom role fact
require 'facter'

Facter.add(:role) do
  case Facter.value(:hostname)
  when /ntp/ then 'ntp-server'
  when /www/ then 'web-server'
  else abort 'Hostname does not provide a role.'
  end
end    

然后您可以像这样设置 hiera 配置:

:hierarchy:
  - "nodes/%{::trusted.certname}"
  - role/%{role}
  - "common"

在您的角色数据文件中,您可以提供一组 class 个名称:

# role/web-server.yaml
classes:
  - web-server

在您的主要清单中(通常 $environment/manifest/site.pp:

# if no classes array, traverse the else block
if hiera('classes', false) {
  hiera_include('classes')
}
else {
  # logic for your 'none' situations since the classes array was not present
}

检查此以获取 hiera_include 信息:https://docs.puppet.com/hiera/3.2/puppet.html#assigning-classes-to-nodes-with-hiera-hierainclude。请注意,它还会合并来自您的特定 fqdn.yaml 数据文件的 classes。

这将为您提供您所请求的功能,并使用 Hiera 按节点 grouping/hostname 包含 classes。