为了实施临时更改,在 puppet 中测试当前日期/时间的好方法是什么?
例如,我们刚刚遇到了 NTP 的安全问题,Debian 花了一段时间才发布更新。将 ntp 关闭一段时间似乎是最简单的。
service { 'ntp':
# remember to re-enable this after ntp is secured. CVE-XXXXXXXXXX
ensure => "stopped",
...
}
所以这需要记住回来并改变它。我想做的是使ensure
属性的值依赖于在运行时测试日期的选择器。
谁能提出一个很好的方法来做到这一点?
我可以想象通过 puppet 解析器提供一个函数来执行此操作,如果有人已经编写过它会很高兴,但如果您有办法在没有额外模块的情况下执行此操作,则可以加分。
service { 'ntp':
ensure => date_is_after("23 Dec 2014"): {
true => "running",
false => "stopped"
}
...
}
我还想到,基于 ntp 包的当前版本的测试会非常优雅,但我也不确定你会如何在 puppet 中做到这一点。
为了能够获得 NTP 包的当前版本,您需要编写一个自定义事实,
pluginsync
通过查询本地包管理器将其推送到每个托管主机并识别值。有关编写自定义事实的信息,请参阅https://docs.puppetlabs.com/facter/2.3/custom_facts.html。然后,您可以使用
versioncmp()
清单中的功能,使用该事实的值有条件地启用或禁用 NTP 守护程序,并将其与包含您的修复程序的已知良好版本的 NTP 进行比较。要在 master 上使用日期,您可以编写一个简单的 shell 包装器,并使用generate 函数
date
从清单中调用它。您可以将结果获取到变量中并发疯。
由于 Puppet 不会使用
<
and>
likebash
或awk
do 来比较字符串,因此您可能想要使用date +%s
它,以便您可以将时间戳与您定义的任何目标日期进行数字比较。顺便说一句,我个人会避免实施这种事情。它有很大的风险摔倒在你的脚上。考虑改为定义一个全局 Hiera 键,您可以在日历提醒您这样做后手动翻转它。不要在 Puppet 中建立友好的惊喜。
你可以这样写一个外部事实:
要分发它,您可以将它放入一个新模块中(例如
modules/date/facts.d/date
)。然后你可以做