2017-02-19 76 views
1

我曾经使用Puppet很多,从0.x到1.0的版本,然后改变了工作,但现在我又回到了它。木偶中的Hiera对我来说是新手(以及其他一些东西)。根据主机名通过Hiera为节点分配一个类

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

例如,如果主机是类似于“ntp1.foo.com”的,我就习惯于分配ntp服务器类。在site.pp中定义直接node的定义非常简单,我试图将此概念转化为基于Hiera的世界。我有Hiera分配其他类,并希望将所有这些任务合并到一个地方。

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

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

和Hiera我会做这样的事情:

- "roles/ntp-%{ntpRole}" 

我想人们也可以通过自定义其实做到这一点。

这工作,但似乎像一个kludge。有更好的/推荐的选择吗?与此

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

例如:一个web服务器角色。有些机器不会是Web服务器,所以我不想包含那个类,但是对于其他类,我并不想在每个节点文件中维护它,并且不想真正想要在任何地方都有空的*-none角色类别(例如web-noneweb-server)。我想要所有名为www*的机器或基于其他标准来加载roles/web类。这可以与Hiera完成吗?

+0

我们对此使用外部自定义事实,因此事实将具有该节点属于哪个角色的逻辑,并且在您的hiera中,可以使用该事实来包含角色类。 – Walid

回答

0

如果您的角色与服务器事实有关系,那么您可以使用自定义事实来分配角色。既然你说过你以前是根据服务器名进行节点分类的,我会认为这是你想要的路线。

# 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" 

内,您的角色数据文件,你可以提供类名的数组:

# 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数据文件的类中。

这会为您提供您请求的功能,并使用Hiera按节点分组/主机名包含类。

+0

因此,如果'role'是空的,当它通过层次结构查找类时,Hiera会跳过'role /%{role}'行吗? – Josh

+0

@Josh从某种意义上说,是的。更准确地说,Hiera会在自定义事实中寻找一个符合你的'else'情况的数据文件,它不会存在,所以层次结构的层次将不提供数据。 –

相关问题