2016-07-23 2 views
1

ich durch Marionette, um sicherzustellen, müssen, dass die Datei /etc/logrotate.conf den Eintrag haben mussPrüfung und fügen Sie mehrere Zeilen in Puppen

/var/log/secure { 
    monthly 
    rotate 11 
} 

Ich versuchte

$line_string = "/var/log/secure { 
    monthly 
    rotate 11 
}" 

file_line {'ensure correct entry in /etc/logrotate.conf': 
    path => '/etc/logrotate.conf', 
    line => $line_string, 
    match => $line_string, 
} 

Es den Eintrag erstellt das erste Mal, aber wenn Ich gebe den Puppencode ein zweites Mal an und fügt den Eintrag erneut hinzu.

[~] # puppet apply /home/vijay/logrot.pp 
Notice: Compiled catalog for lxv9824 in environment production in 0.10 seconds 
/var/lib/puppet/lib/puppet/provider/file_line/ruby.rb:36: warning: regexp has invalid interval 
/var/lib/puppet/lib/puppet/provider/file_line/ruby.rb:36: warning: regexp has `}' without escape 
Notice: /Stage[main]/Main/File_line[ensure correct entry in /etc/logrotate.conf]/ensure: created 
Notice: Finished catalog run in 0.06 seconds 

[~] # more /etc/logrotate.conf 
/var/log/secure { 
    monthly 
    rotate 11 
} 
/var/log/secure { 
    monthly 
    rotate 11 
} 

Wie kann ich prävenieren? nt Marionette, den Eintrag ein zweites Mal hinzuzufügen?

+0

Haben Sie darüber nachgedacht, stattdessen eine Datei in /etc/logrotate.d zu speichern? – daxlerod

Antwort

3

Die Ressource file_line von puppetlabs-stdlib ist nicht idempotent, wenn das Attribut line in seinem Parameter Zeilenumbrüche enthält. Sie könnten mit dem Attribut match etwas dagegen tun, aber die von Ihnen angegebene Regexp ist ungültig (beachten Sie die Warnungen von file_line.rb).

Da scheint es, dass die /etc/logrotate.conf enthält nur den Eintrag, könnten Sie tun:

file { '/etc/logrotate.conf': 
    ensure => file, 
    content => $line_string, 
} 

oder Sie tun können (mit nicht veraltete Puppen- und Zukunft Parser wenn 3.8.x):

['/var/log/secure {', ' monthly', ' rotate 11', '}'].each |$line| { 
    file_line { "ensure $line in /etc/logrotate.conf": 
    path => '/etc/logrotate.conf', 
    line => $line, 
    match => $line, 
    } 
} 

oder Sie könnten augeas verwenden, was ich persönlich verabscheue, aber lassen Sie mich wissen, wenn Sie mehr Optionen benötigen.

Es gibt auch so auf Dateien verketten Module ein: https://github.com/puppetlabs/puppetlabs-concat

Sie auch Ihre regexp versuchen Festsetzung könnte, mit den beiden Warnungen beginnen:

$line_string_regexp = "/var/log/secure \{ 
    monthly 
    rotate 11 
\}" 

Sie haben viele Möglichkeiten, hier zu sei ehrlich.

0

automatisch um idempotence des Skripts zu testen, können Sie in diesem Tool interessieren: https://github.com/citac/citac

CITAC führt systematisch Ihre Puppet manifestiert sich in verschiedenen Konfigurationen, unterschiedliche Ressourcenhinrichtungsbefehle und vieles mehr. Die generierten Testberichte informieren Sie über Probleme mit nicht idempotenten Ressourcen, Konvergenzprobleme usw.

Das Tool verwendet Docker-Container zur Ausführung, daher bleibt Ihr System während des Testens unberührt.

Glückliche Puppenprüfung!