【问题标题】:Performing log rotation as a part of chef recipe作为厨师食谱的一部分执行日志轮换
【发布时间】:2017-02-01 13:55:51
【问题描述】:

我正在使用以下配方来执行log rotation

bash 'adding_logrotate_for_consul' do
  code <<-EOH
    echo "" >> /etc/logrotate.conf
    echo "/tmp/output.log {" >> /etc/logrotate.conf
    echo -e "\tsize 20M" >> /etc/logrotate.conf
    echo -e "\tcreate 700 root root" >> /etc/logrotate.conf
    echo -e "\trotate 3" >> /etc/logrotate.conf
    echo "}" >> /etc/logrotate.conf
  EOH
end

上面的代码运行得很好,它在/etc/logrotate.conf中添加了以下条目

/tmp/output.log {
        size 20M
        create 700 root root
        rotate 3
}

但是,使用chef添加上述条目后,我每次都必须在节点上手动运行以下命令:

logrotate -s /var/log/logstatus /etc/logrotate.conf

如何在 chef recipe 中包含上述命令,以便在文件大小达到 20M 后使用 chef recipe 执行日志轮换??

【问题讨论】:

  • 把这个包含在书架上['log_rotation'] { 'file_maxbytes' => 104857600, 'num_to_keep' => 10 } ...你的问题应该解决了。

标签: cron chef-infra chef-recipe logrotate log-rotation


【解决方案1】:

我认为您在这里做的一些事情并不理想。让我一一说:

我正在使用以下配方来执行日志轮换:

bash 'adding_logrotate_for_consul' 做 代码...

这不是创建 logrotate 条目的好方法。 Chef(和其他编排工具)有一个非常好的功能,称为idempotency。它的基本含义是您可以多次运行相同的配方,并且它只会自行收敛,或在需要时“应用”自己。这样做的一个问题是,每次运行说明书时,您的代码块都会运行 - 因此在运行 5 次后,/etc/logrotate.conf 中将有 5 个相同的条目。那不会很好...

谢天谢地,有更好的方法来做你想做的事。你熟悉Chef Supermarket吗?这是一个网站,您可以在其中找到许多预制的食谱来扩展您的食谱的功能。因此,对于您当前的问题,您可以使用名为logrotate 的食谱。您如何在自己的食谱中使用它?您需要通过将以下内容添加到这些文件中来包含它:

BERKSFILE

source 'https://supermarket.chef.io'
metadata

元数据.RB

depends 'logrotate'

现在您的食谱已经知道“logrotate”食谱了,您可以使用它提供的 Chef 资源。因此,您可以创建以下配方:

logrotate_app 'app_with_logs' do
  path      '/tmp/output.log'
  options   ['size 20M']
  rotate    3
  create    '700 root adm'
end

现在,当您运行配方时,这将创建 logrotate 条目,仅当它不存在时。便利! (注意,这可能会在 /etc/logrotate.d/ 而不是 /etc/logratate.conf 中创建条目。这是添加 logrotate 条目的首选方式)。

进入下一部分。

如何在厨师食谱中包含上述命令,以便日志 旋转可以在文件大小后使用厨师食谱执行 达到20M??

Logrotate 作为程序自动运行,每天一次。当它运行时,它会检查/etc/logrotate.conf 和/etc/logrotate.d/* 中的所有条目,如果它们满足要求则运行它们(在这种情况下,大小为20M)。然而,由于它每天只运行一次,这取决于你的日志增长的速度,在它被评估和旋转时它可能会比 20M 大得多!

所以现在,您有两个选择。要么,一个,让 logrotate 按预期工作,如果日志超过 20M,则每天旋转一次。或者二,你可以做你想做的事并在 Chef 食谱中运行该命令,尽管这不是一个好方法。但是,为了完整起见,我将告诉您如何使用 Chef 运行命令。但要记住!同样,这将不是幂等的。因此,为什么它不是这样做的好方法!

要从 Chef 配方运行命令,请使用 execute 资源。例如:

execute 'rotate_my_log_because_I_cant_wait_24h' do
  command 'logrotate -s /var/log/logstatus /etc/logrotate.conf'
end

这将在您的节点上运行该命令。但同样,这不是推荐的方法。

【讨论】:

  • 也许值得从 cron 食谱中添加 cron_d 以设置定期运行 logrotate。
  • @Tensibai 好点!如果每天需要轮换一次以上。
  • @GeneR 非常感谢您的回复。我想问一下“logrotate”食谱是否依赖于另一本食谱。如果是,那么我应该如何在 Berksfile 中引用这些食谱?
  • @meallhour berks 将为您进行递归解析(berks install 和 berks upload with a chef server应该使用正确的knife.rb)
  • @meallhour 就像天丝白说的,你只需要声明你想要的食谱。 Berks 将处理您包含的说明书中的任何依赖项。如果我的回答对您有所帮助,请随时“接受”它,它会对我有所帮助:)
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
相关资源
最近更新 更多