在木偶中设置环境

setting environment in puppet

作为 Puppet 的新手,我被困在一个我想在 Puppet 中设置环境 ( production, test, dev ) 的地方。具体来说,我有一个 Hiera 文件,我在其中定义了一些数据。现在我想为一些 Hiera 键提供特定于环境的值。我该怎么做?

您问了两个截然不同的问题:如何设置节点的环境以及如何使用节点的环境来自定义将代表他们从 Hiera 提取的数据。您错过了一个非常重要的初步问题:我是否应该定义和使用环境?

由于您 是 Puppet 的新手,我建议您从尽可能多地忽略环境开始。在您的站点配置中使用多个环境绝不是必需的,尽管按照您描述的方式建立单独的环境并不罕见,但这样做的价值或适当性远不如您想象的那么清楚。您无需深入研究环境即可学习足够的东西;我建议至少现在,您只需将所有内容都保留在默认环境中,"production"。而是关注更紧迫的话题。

如果您坚持直接进入环境,那么您提出的第一个问题更容易回答:通过为 environment 键插入所需的值,可以在节点端设置节点的环境在该节点的 configuration file, or on the master side (supposing you are using a master) by setting up an external node classifier (ENC) 中并让它为全局变量 $environment 提供一个值。如果两者都做,则大师获胜。

至于按环境自定义 Hiera 数据,您通常会通过中央 hiera.yaml 配置文件设置 Hiera 数据层次结构的特定环境级别。您可以将环境名称插入此文件 ("%{environment}") 以在一个级别上形成数据文件的部分或全部基本名称。对于您需要自定义数据的每个环境,您可以在适当的数据目录中为您配置的一个或多个 Hiera 后端提供相应的 Hiera 数据文件。

另一种看待这个问题的方法是应用层与 Puppet 环境

在 Puppet 中,这些并不总是一回事。如果您将 test/production/dev 管理为相同,那么您将在默认的生产木偶环境中拥有所有这些服务器。您可以在 Puppet 中创建其他环境来处理 Puppet 开发。我同意@John Bollinger 的建议,除非您需要,否则您可能不会接触 Puppet Environments。如果这样做,请查看 R10k 以促进更改。

Hiera 可以根据任何事实更改层次结构。所以我所做的是使用正则表达式匹配根据主机名向我的节点添加一个 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 等,而我的生产节点遵循不同的方案,因此默认为生产。

希望对您有所帮助。