我看到有人在运行下面指定的内容之前检查代理的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中并不存在(他在几个月前的研讨会上提出了这个问题)。我不确定那是多么真实。
如果可以做到上述事情,那么有什么建议怎么办呢?或者,为了便于维护,最好是回到每个节点的标准清单吗?
非常感谢。 中号
答案 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的方法。
在您的第一条评论反馈后修改:
要使主文件从本地文件中读取内容,您应该
file { 'hostmasterfile.ini': }
- 它只允许你设置内容,而不是检索它们file
函数初始化变量内容(如果文件不可读,这将使所有节点失败)代码看起来像这样(假设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}}