Puppet:在运行清单头之前,是否可以针对主文件检查$ hostname?

时间:2014-08-02 17:16:32

标签: puppet

我看到有人在运行下面指定的内容之前检查代理的MAC地址是否在特定的正则表达式上。这个例子是这样的:

if $is_virtual == "true" and $kernel == "Linux" and $macaddress =~ /^02:00:0A/ {
    include nmonitor
    include rootsh
    include checkmk-agent
    include backuppcacc
    include onecontext
    include sysstatpkg
    include ensurekvmsudo
    include cronntpdate
}

那只是在那个特定的清单文件中。同样是另一个明显的例子,但通过下面的正则表达式:

node /^mi-cloud-(dev|stg|prd)-host/ {
    if $is_virtual == 'false' {
        include etchosts
        include checkmk-agent
        include nmonitor
        include rootsh
        include sysstatpkg
        include cronntpdate
        include fstab-ds-dev
    }
}

我被问及在检查代理的主机名时是否可以应用类似的概念,主机名是允许运行的主机名或其他。

我不确定是否可以这样做,但粗略的想法是这样的:

file { 'hostmasterfile.ini'
        ensure  => present,
        source  => puppet:///test/hostmaster.ini,
        content => $hostname
}

$coname = content


#Usually the start / head of the manifest
if $hostname == $coname {
   include <a>
   include <b>
}

注意:$ fqdn是不可能的。

据我所知,我没有看到任何与请求匹配的样本清单。更重要的是,它违背了一个标准的做法,即让事情变得更容易管理,而不是将所有鸡蛋放在一个篮子里。

我的前同事声称上述想法是关于自我配置的。然而,这个概念在Puppet中并不存在(他在几个月前的研讨会上提出了这个问题)。我不确定那是多么真实。

如果可以做到上述事情,那么有什么建议怎么办呢?或者,为了便于维护,最好是回到每个节点的标准清单吗?

非常感谢。 中号

1 个答案:

答案 0 :(得分:1)

嗯,您可以if构造替换您的节点块。

if $hostname == 'host1' {
    # manifest for host1 here
}

您可以将其与某种inifile结合使用(例如,使用generate)函数。如果随后从您的ini文件中提取了<a>语句的<b>include,那么您构建了一个粗略的ENC

请注意,这具有安全隐患 - 任何代理都可声称拥有任何主机名。它甚至非常简单:

FACTER_hostname=kerberos01 puppet agent --test

任何节点都可以通过这种方式接收kerberos01的目录。 (node阻止依赖于$certname,而不是伪造。)

我无法从您的问题中解读您的确切意图,但我怀疑您确实需要ENC或基于Hiera的方法。

在您的第一条评论反馈后

修改

要使主文件从本地文件中读取内容,您应该

  1. 摆脱file { 'hostmasterfile.ini': } - 它只允许你设置内容,而不是检索它们
  2. 使用file函数初始化变量内容(如果文件不可读,这将使所有节点失败)
  3. 代码看起来像这样(假设ini文件中可以有多个主机名)。

    $ini_data = file('/etc/puppet/files/test/hostmaster.ini')
    

    下一步将是这样的正则表达式查找:

    if $ini_data =~ /name=$hostname/ {
    

    不幸的是,这不起作用!显然,Puppet不会在正则表达式中扩展变量值。

    您可以使用此(有点愚蠢)的解决方法:

    $ini_lookup = regsubst($ini_data, "name=$hostname", '__FOUND__')
    
    if $ini_lookup =~ /__FOUND__/ {
         ...
    }
    

    关于安全性的最后评论:如果您的团队坚持不使用$certname进行此查找(尽管将主机名映射到证书名称应该很容易),您应该考虑将主机名添加到{{{ 3}}