通过 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-none
与 web-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。
我以前经常使用 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-none
与 web-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。