为了实现临时更改,有什么好方法可以测试 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 中执行此操作。
答案1
要在主服务器上使用日期,您可以编写一个简单的 shell 包装器,date
并使用生成函数。
$ echo -e '#!/bin/bash\n/bin/date -I\n' >/tmp/dater
$ chmod 755 /tmp/dater
$ bundle exec puppet apply -e 'notice(generate("/tmp/dater"))'
Notice: Scope(Class[main]): 2014-12-23
您可以将结果放入变量中并疯狂操作。
$now = generate("/tmp/dater")
由于 Puppet 不会使用<
and >
likebash
或awk
do 来比较字符串,因此您可能希望使用date +%s
,这样您就可以将时间戳与您定义的目标日期进行数字比较。
顺便说一句,我个人不会实施这种事情。它有很高的风险,让你摔得很重。考虑定义一个全局的 Hiera 键,在日历提醒你这样做之后,你可以手动翻转它。不要把你的友好惊喜放在 Puppet 里。
答案2
为了能够获取 NTP 包的当前版本,您需要编写一个自定义事实,该事实将通过推送到每个托管主机,pluginsync
并通过查询本地包管理器来辨别该值。请参阅https://docs.puppetlabs.com/facter/2.3/custom_facts.html用于编写自定义事实。
然后,您可以使用versioncmp()
清单中的函数,根据事实的值有条件地启用或禁用 NTP 守护程序,并将其与包含修复的已知良好版本的 NTP 进行比较。
答案3
你可以写这样的外部事实:
#!/bin/bash
echo "date=$(date '+%Y-%m-%d')"
要分发它,您可以将其放入一个新模块(例如modules/date/facts.d/date
)。
然后你可以做
if $::date > "2016-05-15" {
...
}