1

我正在使用以下配方来执行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 执行日志轮换?

4

1 回答 1

4

我认为这里有一些事情你做得不够理想。让我一一道来:

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

bash 'adding_logrotate_for_consul' 做代码...

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

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

伯克斯文件

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 条目的首选方式)。

进入下一部分。

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

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

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

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

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

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

于 2016-09-23T21:56:20.003 回答