Puppet 布袋戏的环境设置

Puppet 布袋戏的环境设置,puppet,hiera,Puppet,Hiera,作为Puppet的新手,我被困在一个我想在Puppet中设置环境(生产、测试、开发)的地方。具体来说,我有一个Hiera文件,其中定义了一些数据。现在我想为一些Hiera键提供特定于环境的值。我该怎么做?您提出了两个截然不同的问题:如何设置节点的环境,以及如何使用节点的环境来定制将代表节点从Hiera中提取的数据。您错过了一个非常重要的初步问题:我应该定义和使用环境吗? 由于您是Puppet新手,我建议您从尽可能忽略环境开始。在您的站点配置中使用多个环境绝非必要,尽管按照您描述的路线建立单独的环

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

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

由于您是Puppet新手,我建议您从尽可能忽略环境开始。在您的站点配置中使用多个环境绝非必要,尽管按照您描述的路线建立单独的环境并不罕见,但这样做的价值或适当性远不如您想象的那么清楚。你不必钻研环境就能学到很多东西;我建议,至少现在,您只需将所有内容保留在默认环境“生产”中即可。相反,关注更紧迫的话题

如果您坚持直接进入环境,那么您提出的第一个问题更容易回答:可以通过在节点侧插入
环境
键的所需值来设置节点的环境,或者通过设置(ENC)在主节点侧(假设您使用的是主节点)来设置节点的环境并让它为全局变量
$environment
提供一个值。如果你两个都做,那么大师就赢了


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

另一种解决此问题的方法是应用层vs Puppet environment

在木偶中,这些并不总是相同的东西。如果将测试/生产/开发管理为完全相同,那么所有这些服务器都将位于默认的生产环境中。您可以在Puppet中创建其他环境来处理Puppet开发。我同意@John Bollinger的建议,除非你需要,否则不要触摸木偶环境,而你可能不会。如果您这样做,请查看R10k以促进更改

Hiera可以根据任何事实更改层次结构。因此,我所做的是使用正则表达式匹配,基于主机名向我的节点添加一个
应用程序层
事实

您的
hiera.yaml
文件可能如下所示:

---
:backends:
  - yaml

:hierarchy:
  - "node/%{::hostname}"
  - "tier/%{::application_tier}"
  - "common"

:yaml:
  :datadir: '/hiera'
注意我是如何使用
%{::application\u tier}
,它是我为每个节点定义的,而不是
%{environment}
,后者是Puppet实现的构造。

这是我的自定义事实文件,
application\u 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\u tier.rb
。如您所见,它与Regex匹配,因此我的节点被命名为staging1、dev3等。我的生产节点遵循不同的方案,因此默认为生产


我希望这能有所帮助。

谢谢你的回复。正如您所说的,我检查了puppet docs的环境,并在()中找到了它。我们需要形成目录结构
$confdir/environments/{test,production,dev}/{modules,manifests}
。但这里的问题是,我们需要为我们设置的每个环境复制我们的模块,这是不可取的。还有其他方法吗?@YogeshJilhawar,正如我所说的,我建议您只使用默认环境来启动。如果这样做,则不会出现复制问题。但是,如果不这样做,则可以将共享模块放在一些公共位置,例如
$confdir/common/modules
,并将该目录放在每个环境的
环境.conf
@John中。再次感谢。