我希望有一种方法,每天只在特定时间评估一次特定类。现在我正在从 cron 运行我的 puppet 代理,但我想将其更改为作为守护进程运行,或更频繁地运行。增加频率的障碍是,有一个类需要大约 4 分钟来处理,并且不需要经常发生。我正在尝试找到一些方法,每天只从 cron 评估一次该特定类。
有没有一种简单的方法可以让我设置环境变量(FOO=bar;puppet agent ..
),或者向 crontab 添加命令行选项(puppet agent .. --foo bar
),这样我就可以使用它来在清单中包含或不包含该类?
class foobar {
if 'bar' == $::foo {
# do the slow stuff
}
}
答案1
A日程听起来它能提供您想要的东西。首先,您要创建一个计划资源,指定何时可以运行以及在给定时间段内可以运行多少次。
schedule { "slow":
range => "1 - 5",
period => daily,
repeat => 1,
}
上述示例只会在凌晨 1 点至凌晨 5 点期间评估或运行,且最多运行一次。您可以删除该range
参数,它会在一天中的任何时间运行,但同样,只能运行一次。
在资源上,您可以指定schedule
元参数将它们链接到上面的时间表:
exec { "example":
command => "/usr/bin/foo",
unless => "/usr/bin/bar",
schedule => "slow",
}
当您使用 运行 Puppet 时--debug
,如果已经按照给定的次数进行了评估,或者范围不适用,您将看到以下内容:
debug: /Stage[main]//Exec[example]: Not scheduled
如果你有一些资源,你可以使用资源默认值在您要限制的类中影响同一类型的所有资源:
Exec {
schedule => "slow",
}
您需要针对每种资源类型(Exec、File、Augeas 等)执行此操作。
关于改进这一点的几点说明:
- 我不知道如何将它应用于课堂上的所有类型的资源
- 将
schedule
元参数应用于类似乎不起作用,可能需要提出一个错误
答案2
我相信你可以通过以下方式实现这一点环境声明。您可以在命令行上调用它:
puppet agent --environment latetbus
您可以使用它在 puppet.conf 文件中指定不同的清单:
[latebus]
manifest = $confdir/latetbus/site.pp
甚至可以通过这种方式制作不同的模块。
还有一种方法将自定义事实添加到 facter。这利用了插件来实现。您可以创建一个自定义 ruby 文件来检查某些内容:
# run_latebus.rb
facter.add("latebus_exec") do
setcode do
%x{if [ -e /tmp/run_latebus ] ; then echo "true" ; else echo "false" ; fi}.chomp
end
end
touch /etc/run_latebus
在启动之前,Puppet 代理调用脚本将位于何处puppet agent
,该脚本在 Puppet 运行期间由 Facter 进行评估。
.rb 文件放置在自定义模块中,特别是在lib/facter
模块本身的目录中。