puppet:事实在清单中带有点

puppet:事实在清单中带有点

我正在使用 puppet 4.10.9 和 facter 3.6.8。我对清单中事实的使用有疑问,我将以简单形式和更复杂的形式提出问题。首先,简单的问题。

在代理上我可以看到以下地址:

facter --show-legacy | grep ipaddress
ipaddress => 192.168.25.75
ipaddress_enp0s3 => 10.0.2.15
ipaddress_enp0s8.25 => 192.168.25.75
ipaddress_lo => 127.0.0.1

我想在清单中使用“ipaddress_enp0s8.25”(vlan 接口)。是的,我知道我可以使用“ipaddress”,但出于稍后将解释的原因,我想专门使用 vlan 接口。

当我尝试在清单中使用此接口引用时,出现语法错误:

   listenip => $ipaddress_enp0s8.25

这些参考资料确实有效,但我再次想特别使用 vlan 接口:

   listenip => $ipaddress

   listenip => $networking['ip']

那么我该如何使用“ipaddress_enp0s8.25”?

以下是更复杂的角度和一些背景知识。这是一个大型项目的一部分,涉及频繁回收(启动、终止)同一环境。在进行初始配置时,节点的行为受到了密切关注。我注意到的第一个问题之一是:

'Evaluation Error: Operator '[]' is not applicable to an Undef Value.' 

因为当时我试图使用:

$networking['interfaces']['enp0s8.25']['ip']

首次运行时不存在此信息。我无法跳过“正在加载事实”

所以我选择了 '$networking['ip']',效果很好。但是第一次运行时,它返回 10.0.2.15。在后续运行中,它返回所需的地址 192.168.25.75。结果通常是运行节点,但某些服务会延迟 30 分钟。

我可以在这里使用什么以便所需的 vlan 地址成为值?我想尝试“ipaddress_enp0s8.25”,但由于上述原因,我不能尝试。

需要注意的几项杂项:

  • 我正在使用 razorsedge-network 模块创建该 vlan 接口。
  • 我可以在 puppet 3.8 中使用“ipaddress_enp0s8_25”,没有任何问题

答案1

在版本 4 中,访问事实的方式已经发生了变化。尝试通过 $facts 哈希 $facts['ipaddress_enp0s8.25'] 访问事实,而不是使用顶部范围变量。

您仍然可以使用顶级范围变量来访问事实,但它们已被弃用,您应该尽快转而使用 $facts 哈希。

在这种情况下,这个事实似乎已经更改了名称,这就是您遇到的问题。在以前的版本中,事实名称使用下划线进行转义,而新版本有句点,当使用顶级范围变量访问事实时,句点无法转义(据我所知),因此必须使用 $facts 哈希。

$ipaddress_enp0s8.25 将被错误插入,因为句点需要转义。

由于我们使用单引号访问哈希的元素,因此 $facts['ipaddress_enp0s8.25'] 不会被插入。

在这里了解更多关于如何在 Puppet 4 中使用事实的信息:

https://puppet.com/docs/puppet/4.10/lang_facts_and_builtin_vars.html

答案2

我还没有测试过,但我遇到了这篇博文其中有一些相关建议。(我与该博客及其作者没有任何关系。)

这篇博文的关键点在于,$facts['cmdb_data']['datacenter']如果自定义结构化事实不存在(例如在新配置的主机上),则使用 eg 的新语法访问变量将导致目录编译失败。正如您所发现的。

博客作者对于避免这种情况的方法提出了一些建议,但最后得出结论,如果您使用的是 Puppet 6 或更高版本,那么迄今为止最好的方法就是新get功能。

get函数官方文档

因此,具体来说,您尝试使用$networking['interfaces']['enp0s8.25']['ip']由于初次运行而失败的函数,如果您改用,则可能会成功$networking.get('interfaces."enp0s8.25".ip')。这将返回undef(或者您可以将额外的参数传递给get用作默认值而不是 undef,请参阅文档),并允许目录编译继续进行。

相关内容