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

时间:2016-09-23 16:14:15

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

我使用以下方法执行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

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

1 个答案:

答案 0 :(得分:3)

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

  

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

     

bash'adding_logrotate_for_consul'做     代码......

这不是创建logrotate条目的好方法。 Chef(和其他业务流程工具)有一个非常好的功能,叫做idempotency。它的基本含义是你可以多次运行相同的配方,它只会自我收敛,或者如果需要则自己“应用”它。你将这样做的一个问题就是你每次运行cookbook时都会运行你的代码块 - 所以在5次运行之后,你将在/etc/logrotate.conf中有5个相同的条目。那不会很好......

值得庆幸的是,有更好的方法可以做你想做的事。你熟悉Chef Supermarket吗?在这个网站上,您可以找到许多预制的烹饪书,以扩展您的食谱功能。因此,对于您当前的问题,您可以使用名为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条目的首选方法。)

转到下一部分。

  

如何在厨师食谱中包含上述命令以便记录日志   可以在文件大小之后使用chef recipe执行旋转   达到了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

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