作为厨师食谱的一部分执行日志轮换
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
这将 运行 在您的节点上执行该命令。但同样,这不是推荐的方法。
我正在使用以下方法来执行 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
这将 运行 在您的节点上执行该命令。但同样,这不是推荐的方法。