作为 Puppet 的新手,我被困在一个我想( production, test, dev )
在 Puppet 中设置环境的地方。具体来说,我有一个 Hiera 文件,其中定义了一些数据。现在我想为一些 Hiera 键提供特定于环境的值。我怎样才能做到这一点?
2 回答
您问了两个完全不同的问题:如何设置节点的环境以及如何使用节点的环境来自定义将代表它们从 Hiera 提取的数据。您错过了一个非常重要的初步问题:我应该定义和使用环境吗?
由于您是Puppet 的新手,我建议您从尽可能多地忽略环境开始。在您的站点配置中使用多个环境绝不是必要的,尽管按照您描述的方式建立单独的环境并不罕见,但这样做的价值或适当性远没有您想象的那么清楚。您无需深入研究环境即可学习;我建议至少现在,您只需将所有内容保留在默认环境“生产”中。相反,专注于更紧迫的话题。
如果您坚持直接进入环境,那么您提出的第一个问题更容易回答:节点的环境可以通过environment
在该节点的配置文件中插入所需的键值来设置在节点一侧,或者在主节点上通过设置一个外部节点分类器(ENC) 并让它为全局变量提供一个值(假设您使用的是主节点) $environment
。如果你两者都做,那么主人就赢了。
至于按环境自定义 Hiera 数据,您通常会通过中央hiera.yaml
配置文件设置 Hiera 数据层次结构的特定于环境的级别。您可以将环境名称插入到此文件 ( "%{environment}"
) 中,以形成一级数据文件的部分或全部基本名称。对于您需要自定义数据的每个环境,您将在适当的数据目录中为您配置的一个或多个 Hiera 后端提供相应的 Hiera 数据文件。
另一种看待这个问题的方法是Application Tier vs Puppet Environment。
在 Puppet 中,这些并不总是一回事。如果您将测试/生产/开发管理为相同,那么您将在默认生产 puppet 环境中拥有所有这些服务器。您可以在 Puppet 中创建其他环境来处理 puppet 开发。我同意@John Bollinger 的建议,除非你需要,否则你可能不会接触 Puppet Environments。如果您这样做,请查看 R10k 以促进更改。
Hiera 可以根据任何 Fact 更改层次结构。所以我所做的是application_tier
使用正则表达式匹配根据主机名向我的节点添加一个事实。
您的hiera.yaml
文件可能如下所示:
---
:backends:
- yaml
:hierarchy:
- "node/%{::hostname}"
- "tier/%{::application_tier}"
- "common"
:yaml:
:datadir: '/hiera'
请注意我是如何使用%{::application_tier}
的,我为每个节点定义的,而不是%{environment}
Puppet 实现的构造。
这是我的自定义事实文件,application_tier.rb
:
require 'facter'
Facter.add(:application_tier) do
setcode do
location = case Facter.value(:hostname)
when /dev(\d|)$/ then 'development'
when /test(\d|)$/ then 'test'
when /staging(\d|)$/ then 'staging'
else 'production'
end
end
end
然后通过我的角色清单将该文件部署到每个节点,因此路径为manifests\roles\lib\facter\application_tier.rb
. 如您所见,它与 Regex 匹配,因此我的节点被命名为 staging1、dev3 等,而我的生产节点遵循不同的方案,因此默认为生产。
我希望这会有所帮助。