我如何在 Puppet 中测试日期来实施临时规则?

我如何在 Puppet 中测试日期来实施临时规则?

为了实现临时更改,有什么好方法可以测试 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 >likebashawkdo 来比较字符串,因此您可能希望使用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" {
  ...
}

相关内容