2016-09-23 51 views
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 
} 

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

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

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

回答

3

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

我使用下面的配方来执行日志旋转:

庆典“adding_logrotate_for_consul”做 代码...

这不是一个好办法创建一个logrotate条目。厨师(和其他编排工具)有一个非常好的功能,称为idempotency。它的基本含义是你可以多次运行相同的配方,它只会自己收敛,或者如果需要的话,它自己“应用”。你在做这件事时会遇到的一个问题是,每当你运行你的cookbook时,你的代码块都会运行 - 所以在5次运行后,你将在/etc/logrotate.conf中有5个相同的条目。这不会很好...

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

BERKSFILE

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

METADATA.RB

depends 'logrotate' 

现在你的食谱是意识到了“logrotate的”菜谱,你可以使用它提供的厨师资源。所以,你可以创建以下配方:

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食谱中运行这个命令,虽然这不是一个好的做法。但是,为了完整起见,我会告诉你如何与厨师一起执行命令。但要记住!这将再次不是幂等的。因此,为什么它不是这样做的好方法!

要从厨师食谱运行命令,请使用execute资源。例如:

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

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

+1

也许值得从'cron' cookbook中添加'cron_d'来建立一个定期运行的logrotate。 – Tensibai

+0

@Tensibai好点!如果轮换每天需要一次以上。 –

+0

@GeneR非常感谢您的回复。我想问一下“logrotate”食谱是否依赖于其他食谱。如果是,那么我应该如何将这些食谱转移到Berksfile中? – meallhour