作为厨师食谱的一部分执行日志轮换

Performing log rotation as a part of chef recipe

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

我认为您在这方面做得不够理想。让我一一道来:

I am using the following recipe to perform log rotation:

bash 'adding_logrotate_for_consul' do code ...

这不是创建 logrotate 条目的好方法。 Chef(和其他编排工具)有一个非常好的功能,叫做 idempotency。它的基本含义是你可以多次运行同一个配方,它只会收敛自己,或者"apply"自己,如果需要的话。你这样做的方式会遇到的一个问题是你的代码块将 运行 每次你 运行 你的食谱 - 所以在 5 运行s 之后,你将有 5 个相同的/etc/logrotate.conf 中的条目。那不是很好...

值得庆幸的是,有更好的方法可以做您想做的事。你熟悉Chef Supermarket? This is a site where you can find many pre-made cookbooks to extend the functionality of your cookbook. So, for your current problem, you could for example use the cookbook called logrotate吗?如何在自己的食谱中使用它?您需要通过将以下内容添加到这些文件来包含它:

BERKSFILE

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

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

进入下一部分。

How can I include the above command in chef recipe so that log rotation can be performed using chef recipe after the file size reached 20M??

Logrotate 作为一个程序 运行 自动,每天一次。当它 运行s 时,它将检查 /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

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