您不能使用事实准确地“检索”IP,但目录编译器可以并且确实将其作为事实接收。前者表明目录编译器在该过程中扮演着积极的角色,但事实并非如此。
您有两种通用选择:
您可以通过编写自定义事实来计算节点上的值。它的工作可以通过依靠 Facter 为其提供 IP 来简化。结果将作为它自己的、独立的事实呈现给目录编译器,并且在任何地方都不需要任何特别的东西来使用它。
将派生值计算为事实的不利方面包括这样做的代码被复制到所有节点,在那里它可能会被检查,如果一个节点被破坏,那么原则上这个事实的值可以被欺骗。此外,自定义事实可能需要在 Ruby 中实现,以防这对您来说是个问题。
在目录生成器中执行计算并不是特别困难。您可以将其作为自定义函数执行,其复杂性与自定义事实相当,但我建议在类中执行此操作,并将结果分配给该类的类变量。具体而言,您应该如何实现值计算取决于该计算的细节。例如,
class site::derived_data {
$ip_pieces = split($ipaddress, '[.]')
# This is the derived value we are computing:
$department = $ip_pieces[2] ? {
0 => 'network operations',
# ...
default => 'other'
}
}
然后,您可以像这样在其他地方使用它:
class mymodule::myclass(
# parameters ...
) {
include site::derived_data
notify { $site::derived_data::department : }
}