我该如何评估并非每次木偶运行时进行的课程?

我该如何评估并非每次木偶运行时进行的课程?

我希望有一种方法,每天只在特定时间评估一次特定类。现在我正在从 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模块本身的目录中。

相关内容