2016-09-23 2 views
1

J'utilise la recette suivante pour effectuer log rotation:Effectuer une rotation du journal comme une partie de la recette de chef

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 

Le code ci-dessus est complètement fin et il ajoute l'entrée suivante dans /etc/logrotate.conf

/tmp/output.log { 
     size 20M 
     create 700 root root 
     rotate 3 
} 

Cependant, après l'ajout de l'entrée ci-dessus en utilisant le chef, je dois exécuter manuellement la commande suivante sur le nœud à chaque fois:

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

Comment est-ce que je peux inclure la commande ci-dessus dans la recette de chef de sorte que la rotation de journal puisse être effectuée using la recette de chef après que la taille de dossier ait atteint 20M?

Répondre

3

Je pense qu'il y a quelques petites choses ici que vous faites moins qu'idéalement. Permettez-moi d'aller un par un:

J'utilise la recette suivante pour effectuer la rotation du journal:

bash 'adding_logrotate_for_consul' faire le code ...

Ce n'est pas une bonne façon de créer une entrée de logrotate. Chef (et autres outils d'orchestration) ont une très belle fonctionnalité appelée idempotency. Sa signification de base est que vous pouvez exécuter plusieurs fois la même recette, et elle ne fera que converger, ou "s'appliquer" elle-même, si nécessaire. Un problème que vous aurez avec la façon dont vous faites ceci est que votre bloc de code fonctionnera CHAQUE fois que vous exécuterez votre livre de recettes - ainsi après 5 courses, vous aurez 5 entrées identiques dans /etc/logrotate.conf. Ce ne serait pas très bon ...

Heureusement, il existe de bien meilleures façons de faire ce que vous voulez faire. Connaissez-vous le Chef Supermarket? Ceci est un site où vous pouvez trouver de nombreux livres de cuisine pré-faites pour étendre les fonctionnalités de votre livre de recettes. Donc, pour votre problème actuel, vous pouvez par exemple utiliser le livre de cuisine appelé logrotate. Comment pouvez-vous l'utiliser dans votre propre livre de recettes? Vous devez inclure en ajoutant ce qui suit à ces fichiers:

BERKSFILE

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

METADATA.RB

depends 'logrotate' 

Maintenant, votre livre de cuisine est au courant du livre de recettes « logrotate », et vous pouvez utiliser les ressources Chef qu'il fournit. Ainsi, vous pouvez créer la recette suivante:

logrotate_app 'app_with_logs' do 
    path  '/tmp/output.log' 
    options ['size 20M'] 
    rotate 3 
    create '700 root adm' 
end 

Maintenant, lorsque vous exécutez votre recette, cela va créer l'entrée logrotate, que si elle n'existe pas déjà. Pratique! (Notez que ceci pourrait créer l'entrée dans /etc/logrotate.d/ au lieu de /etc/logratate.conf, c'est la manière préférée d'ajouter une entrée logrotate).

Dans la partie suivante.

Comment puis-je inclure la commande ci-dessus dans la recette de chef de telle sorte que la rotation log peut être effectuée en utilisant la recette de chef après la taille du fichier atteint 20M ??

Logrotate en tant que programme s'exécute automatiquement, une fois par jour. Quand il s'exécute, il vérifie toutes les entrées dans /etc/logrotate.conf et /etc/logrotate.d/*, et les exécute s'il remplit les conditions requises (dans ce cas, la taille de 20M). Cependant, depuis il fonctionne seulement une fois par jour, en fonction de la vitesse de croissance de votre journal, il pourrait être beaucoup plus grand que 20M au moment où il est évalué et tourné!

Alors maintenant, vous avez deux options. Soit, un, laissez le travail de logrotate fonctionner comme prévu, et faites tourner votre journal une fois par jour si, quand il le regarde, sa taille est supérieure à 20M. Ou deux, vous pourriez faire ce que vous voulez faire et exécuter cette commande dans une recette de chef, bien que ce ne serait pas une bonne façon de le faire. Mais, pour être complet, je vais vous dire comment vous pouvez exécuter une commande avec Chef. Mais rappelles-toi! Cela, encore une fois, ne sera pas idempotent. Alors pourquoi ce n'est pas un bon moyen de le faire!

Pour exécuter une commande à partir d'une recette Chef, utilisez la ressource execute. Par exemple:

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

Cela exécutera cette commande sur votre nœud. Mais encore une fois, ce n'est pas la manière recommandée de le faire.

+1

Il vaut peut-être mieux ajouter 'cron_d' à partir du livre de recettes' cron' pour configurer une exécution périodique de logrotate. – Tensibai

+0

@Tensibai bon point! Si la rotation est nécessaire plus d'une fois par jour. –

+0

@GeneR merci beaucoup pour votre réponse. Je veux demander si le livre de recettes «logrotate» dépend d'autres livres de cuisine. Si oui, alors comment devrais-je référencer ces livres de cuisine dans Berksfile? – meallhour