2016-09-23 3 views
1

ich das folgende Rezept bin mit log rotation auszuführen:Performing Logfolge als Teil der Koch Rezept

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 

Der obige Code völlig in Ordnung läuft und es fügt den folgenden Eintrag in /etc/logrotate.conf

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

Nachdem der obige Eintrag jedoch mithilfe von chef hinzugefügt wurde, muss ich den folgenden Befehl auf dem Knoten jedes Mal manuell ausführen:

Wie kann ich den obigen Befehl in das Kochrezept aufnehmen, so dass die Protokollrotation mit dem Kochrezept durchgeführt werden kann, nachdem die Dateigröße 20M erreicht hat?

Antwort

3

Ich denke, es gibt ein paar Dinge hier tun Sie weniger als ideal. Lassen Sie mich gehen eins nach dem anderen:

ich das folgende Rezept bin mit Log-Rotation auszuführen:

bash 'adding_logrotate_for_consul' do Code ...

Dies ist kein guter Weg, Erstellen eines Logrotate-Eintrags. Chef (und andere Orchestrierungstools) haben eine sehr nette Funktion namens idempotency. Seine grundlegende Bedeutung ist, dass Sie das gleiche Rezept viele Male ausführen können, und es wird nur sich selbst konvergieren, oder "sich" selbst anwenden, wenn es benötigt wird. Ein Problem, das Sie dabei haben werden, ist, dass Ihr Code immer ausgeführt wird, wenn Sie ein Kochbuch laufen haben - nach 5 Läufen haben Sie 5 identische Einträge in /etc/logrotate.conf. Das wäre nicht sehr gut ...

Zum Glück gibt es viel bessere Möglichkeiten zu tun, was Sie tun möchten. Kennen Sie die Chef Supermarket? Auf dieser Seite finden Sie viele vorgefertigte Kochbücher, um die Funktionalität Ihres Kochbuchs zu erweitern. Für Ihr aktuelles Problem könnten Sie beispielsweise das Kochbuch logrotate verwenden. Wie können Sie es in Ihrem eigenen Kochbuch verwenden? Sie müssen es schließen, indem Sie die folgenden auf diese Dateien hinzufügen:

BERKSFILE

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

METADATA.RB

depends 'logrotate' 

Jetzt ist Ihr Kochbuch ist sich der ‚logrotate‘ Kochbuch, und Sie können Verwenden Sie die Küchenchef-Ressourcen, die es zur Verfügung stellt. So könnte man das folgende Rezept erstellen:

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

Nun, wenn Sie Ihr Rezept ausführen, dies den logrotate Eintrag erstellen wird, nur, wenn es nicht bereits existiert. Praktisch! (Beachten Sie, dass dies möglicherweise den Eintrag in /etc/logrotate.d/ anstelle von /etc/logratate.conf erstellt. Dies ist die bevorzugte Methode zum Hinzufügen eines Logrotate-Eintrags).

Weiter zum nächsten Teil.

Wie kann ich den oben genannten Befehl in Kochrezept enthalten, so dass Rotation einloggen kann mit Koch Rezepte durchgeführt werden, nachdem die Dateigröße 20M erreicht ??

Logrotate als ein Programm läuft automatisch, einmal am Tag. Wenn es ausgeführt wird, überprüft es alle Einträge in /etc/logrotate.conf und /etc/logrotate.d/* und führt sie aus, wenn sie die Anforderungen erfüllen (in diesem Fall die Größe 20M). Wie auch immer, seit läuft es nur einmal am Tag, je nachdem, wie schnell Ihr Protokoll wächst, könnte es viel größer als 20M sein, wenn es ausgewertet und gedreht wird!

So, jetzt haben Sie zwei Möglichkeiten. Entweder eine, lassen Sie Logrotate arbeiten, wie es zu erwarten ist, und rotieren Sie Ihr Protokoll einmal am Tag, wenn, wenn es es betrachtet, seine über 20M Größe. Oder zwei, Sie könnten tun, was Sie tun möchten, und diesen Befehl in einem Chef-Rezept ausführen, obwohl dies keine gute Möglichkeit wäre, dies zu tun. Aber aus Gründen der Vollständigkeit werde ich Ihnen sagen, wie Sie mit Chef einen Befehl ausführen können. Aber erinnere dich! Dies wird wiederum NICHT idempotent sein. Deshalb ist das kein guter Weg! Verwenden Sie die execute-Ressource, um einen Befehl von einem Chef-Rezept auszuführen. Zum Beispiel:

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

Das wird diesen Befehl auf Ihrem Knoten ausführen. Aber auch dies ist nicht der empfohlene Weg.

+1

Vielleicht lohnt sich, 'cron_d' aus dem' cron' Kochbuch hinzuzufügen, um einen regelmäßigen Lauf von logrotate einzurichten. – Tensibai

+0

@Tensibai guter Punkt! Wenn die Rotation mehr als einmal am Tag benötigt wird. –

+0

@GeneR vielen Dank für Ihre Antwort. Ich möchte fragen, ob das Kochbuch "Logrotate" von anderen Kochbüchern abhängt. Wenn ja, wie sollte ich diese Kochbücher in Berksfile beziehen? – meallhour