在 puppet 目录编译期间使事实可用
Make fact available during puppet catalog compilation
我在 puppet 中有两个 classes。
这是第一个:
class nagios::is_production {
file { '/etc/puppetlabs/facter/':
ensure => directory,
}
file { '/etc/puppetlabs/facter/facts.d/':
ensure => directory,
}
file { '/etc/puppetlabs/facter/facts.d/production.txt':
ensure => file,
content => epp('nagios/production.epp')
}
}
这将创建一个自定义事实(production=yes/no 基于节点名称)
class 本身就正确地分配了事实。
第二个class:
class nagios::client {
if $facts[production] =~ yes {
@@nagios_host {"${::hostname}":
ensure => present,
address => $::ipaddress,
hostgroups => "production, all-servers",
notifications_enabled => $notifications_enabled,
use => 'generic-server',
}
} else {
@@nagios_host {"${::hostname}":
ensure => present,
address => $::ipaddress,
hostgroups => "non-production, all-servers",
notifications_enabled => $notifications_enabled,
owner => root,
use => 'generic-server',
}
}
}
这将为主机创建导出资源并将其添加到 production/non-production 主机组。
如果存在自定义事实,则主机会正确创建主机组。
我创建了第 3 个 class 来引入这两个只是为了让我自己更容易跟踪它:
class nagios::agent {
Class['nagios::is_production']->Class['nagios::client']
include nagios::is_production
include nagios::client
}
这似乎应该使 ::is_production
运行 在 ::client
之前。当我在人偶 运行 的节点上包含此 class 时,出现此错误:
Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Left match operand must result in a String value. Got an Undef Value. at /etc/puppetlabs/code/environments/production/modules/nagios/manifests/client.pp:3:6 on node
所以事实似乎是没有设置导致主机导出失败。
我错过了什么?
跟进回答
我正在尝试这样做:
如果域名包含 'something'
生产=是
别的
生产=否
然后在nagios模块中,
如果 $facts[production] =~ 是
分配给生产主机组。
Bash:
#!/bin/bash
if [[ $(hostname) =~ '512' ]] ; then
echo production=yes
else
echo production=no
fi
我希望能够在这里使用 $facts[something] 来创建其他基于 OS 和 IP 之类的事实。
我在这里阅读:Custom Facts Walkthrough
但我无法理解自定义事实加载路径,因为我没有该目录。我对木偶很陌生...
也是堆栈溢出的新手...我做对了吗?
谢谢
事实是在 pluginsync 期间生成的。由于您试图在目录执行期间放置外部事实,因此它在目录编译期间不可用,这发生在 pluginsync 之后。
您需要删除您的 nagios::production
class 并将您的外部事实直接放在模块中以利用 pluginsync。它应该位于您的模块结构中,如下所示:
nagios
|__facts.d
|__production.txt
然后在 pluginsync 期间复制外部事实并生成事实。稍后在目录编译期间将可用。 Facter 会期望你的 production.txt
也是 key:value
对。
在此处查看有关正确使用外部事实的更多信息:https://docs.puppet.com/facter/3.5/custom_facts.html#external-facts
我在 puppet 中有两个 classes。
这是第一个:
class nagios::is_production {
file { '/etc/puppetlabs/facter/':
ensure => directory,
}
file { '/etc/puppetlabs/facter/facts.d/':
ensure => directory,
}
file { '/etc/puppetlabs/facter/facts.d/production.txt':
ensure => file,
content => epp('nagios/production.epp')
}
}
这将创建一个自定义事实(production=yes/no 基于节点名称) class 本身就正确地分配了事实。
第二个class:
class nagios::client {
if $facts[production] =~ yes {
@@nagios_host {"${::hostname}":
ensure => present,
address => $::ipaddress,
hostgroups => "production, all-servers",
notifications_enabled => $notifications_enabled,
use => 'generic-server',
}
} else {
@@nagios_host {"${::hostname}":
ensure => present,
address => $::ipaddress,
hostgroups => "non-production, all-servers",
notifications_enabled => $notifications_enabled,
owner => root,
use => 'generic-server',
}
}
}
这将为主机创建导出资源并将其添加到 production/non-production 主机组。
如果存在自定义事实,则主机会正确创建主机组。
我创建了第 3 个 class 来引入这两个只是为了让我自己更容易跟踪它:
class nagios::agent {
Class['nagios::is_production']->Class['nagios::client']
include nagios::is_production
include nagios::client
}
这似乎应该使 ::is_production
运行 在 ::client
之前。当我在人偶 运行 的节点上包含此 class 时,出现此错误:
Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Left match operand must result in a String value. Got an Undef Value. at /etc/puppetlabs/code/environments/production/modules/nagios/manifests/client.pp:3:6 on node
所以事实似乎是没有设置导致主机导出失败。
我错过了什么?
跟进回答
我正在尝试这样做: 如果域名包含 'something' 生产=是 别的 生产=否
然后在nagios模块中, 如果 $facts[production] =~ 是 分配给生产主机组。
Bash:
#!/bin/bash
if [[ $(hostname) =~ '512' ]] ; then
echo production=yes
else
echo production=no
fi
我希望能够在这里使用 $facts[something] 来创建其他基于 OS 和 IP 之类的事实。
我在这里阅读:Custom Facts Walkthrough
但我无法理解自定义事实加载路径,因为我没有该目录。我对木偶很陌生...
也是堆栈溢出的新手...我做对了吗?
谢谢
事实是在 pluginsync 期间生成的。由于您试图在目录执行期间放置外部事实,因此它在目录编译期间不可用,这发生在 pluginsync 之后。
您需要删除您的 nagios::production
class 并将您的外部事实直接放在模块中以利用 pluginsync。它应该位于您的模块结构中,如下所示:
nagios
|__facts.d
|__production.txt
然后在 pluginsync 期间复制外部事实并生成事实。稍后在目录编译期间将可用。 Facter 会期望你的 production.txt
也是 key:value
对。
在此处查看有关正确使用外部事实的更多信息:https://docs.puppet.com/facter/3.5/custom_facts.html#external-facts