ここには、理想的とは言えないことがいくつかあると思います。1つずつ行きましょう:
次のレシピを使用してログのローテーションを実行しています。
bash 'adding_logrotate_for_consul' do code ...
これは、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.conf ではなく、/etc/logrotate.d/ にエントリが作成される可能性があることに注意してください。これは、logrotate エントリを追加するための推奨される方法です)。
次の部分に進みます。
ファイルサイズが20Mに達した後にchefレシピを使用してログローテーションを実行できるように、上記のコマンドをchefレシピに含めるにはどうすればよいですか??
Logrotate は、プログラムとして 1 日 1 回自動的に実行されます。実行すると、/etc/logrotate.conf および /etc/logrotate.d/* 内のすべてのエントリがチェックされ、要件 (この場合は 20M のサイズ) を満たしている場合に実行されます。ただし、ログは1 日に 1 回しか実行されないため、ログの成長速度によっては、評価およびローテーションされるまでに 20M をはるかに超える可能性があります。
したがって、2 つのオプションがあります。いずれかの方法で、logrotate を期待どおりに機能させ、ログを調べたときにサイズが 20M を超えている場合は、ログを 1 日 1 回ローテーションします。または、やりたいことを実行して、そのコマンドを Chef レシピで実行することもできますが、これは良い方法ではありません。しかし、完全を期すために、Chef でコマンドを実行する方法を説明します。でも覚えておいて!これも、冪等ではありません。したがって、これが良い方法ではないのはなぜですか。
Chef レシピからコマンドを実行するには、executeリソースを使用します。例えば:
execute 'rotate_my_log_because_I_cant_wait_24h' do
command 'logrotate -s /var/log/logstatus /etc/logrotate.conf'
end
これにより、ノードでそのコマンドが実行されます。ただし、これは推奨される方法ではありません。