Wie generiere ich mit Puppet gute Serien für DNS-Zonen?

7

Meine Tradition ist es, alle Zonenserien bei Änderung auf den Zeitstempel zu setzen. Jetzt, da Puppet meine neue Religion ist, möchte ich beim Erstellen von Zonendateien aus exportierten Ressourcen serielle Zeitstempel festlegen. Ein etwas trivialisiertes Beispiel könnte so aussehen:

file { "/tmp/dafile": content = inline_template("<%= Time.now.to_i %>"), }

Das Problem bei diesem Ansatz ist, dass der Inhalt ständig unterschiedlich ist, was (letztendlich) die Neuerstellung von Zonendateien bei jeder Puppet-Konfigurationsabfrage provoziert.

Gibt es eine Möglichkeit, einen Zeitstempel einzufügen, ohne dass er in den Daten enthalten ist, die mit dem vorherigen Status verglichen werden?

Bittrance
quelle
Was ist Ihr Problem mit einer häufig wechselnden Seriennummer? Warum nicht einfach akzeptieren, dass es sich häufig ändert?
Zoredache
1
Es verbraucht Systemressourcen; Das Zusammensetzen der Zonendatei aus allen exportierten Ressourcen dauert mehrere zehn Sekunden. Es generiert Protokoll-Spam sowohl von Puppet als auch von Bind. Es erfordert häufiges Neuladen der Bindungskonfiguration, was ein geringes Risiko birgt. Es ist auch unhöflich, die Zone im Wesentlichen jedes Aktualisierungsintervall ungültig zu machen, sofern dies nicht erforderlich ist.
Bittrance
Übrigens, was verwenden Sie, um Ihre DNS-Zonen zu generieren?
Zoredache

Antworten:

3

Verwenden Sie keine Vorlage. Wenn Sie dort versuchen, eine Seriennummer zu verwenden, besteht das Problem darin, dass Sie jedes Mal Änderungen vornehmen.

Ich habe zwei Ideen:

  1. Erstellen Sie einen geeigneten Typ, der DNS mithilfe von DNS-Updates über die Standard-API verwalten kann. Lassen Sie dann BIND die Seriennummer inkrementieren.
  2. Verwenden Sie für jedes Element in Ihrer DNS-Zone ein Dateifragmentmuster und lassen Sie es so, dass die Hauptzonendatei nur aktualisiert wird, wenn sich diese ändern. Sie tun dies, indem Sie eine 'Zonenaktualisierung' ausführen lassen, die Ihre Teile in der endgültigen Zone einschließlich des Headers zusammenfasst. Der Unterschied zwischen den meisten Dateifragmentlösungen besteht darin, dass Sie Ihre Zonenserie aus einem Zeitstempel oder einem ähnlichen Zeitstempel generieren, der immer nur ausgelöst werden sollte, wenn die Teile geändert werden, um die konstanten Änderungen der Seriennummer zu vermeiden, die Sie aus einer Vorlage erhalten würden.

Einige Beispiele für das Dateifragmentmuster finden Sie hier:

http://projects.puppetlabs.com/projects/puppet/wiki/Generating_a_config_file_from_fragments

https://github.com/ripienaar/puppet-concat

Ken Barber
quelle
2

Wie wäre es mit dem Zeitstempel der Datei:

file { "/tmp/dafile": content = inline_template("<%= File.mtime("/tmp/dafile").to_i %>"), }

Das einzige ist, dass dies wahrscheinlich auf jedem Client ausgeführt wird und möglicherweise den Zeitstempel der Datei für jeden Lauf aktualisiert. Wenn dies nicht der Fall ist, sollte es Ihren Anforderungen entsprechen.

Ladadadada
quelle
1

Wie wäre es mit den folgenden,

$utime_serial = inline_template("<%= Time.now.to_i %>")

file { "/var/named/$domain.hosts":
          content => template("named/$domain.hosts.erb"),
          owner => root,
          group => named,
          mode => 0640,
}

wo die erb-Vorlagendatei enthält,

$TTL 1D
@             IN      SOA       galaxy.example.com.  sysadmin.example.com.  (
                               <%=utime_serial %>       ; Serial
                                8H             ; Refresh
                                2H             ; Retry
                                4W             ; Expire
                                1D )           ; Minimum
Danie
quelle
0

Kannst du externe Befehle innerhalb von Puppet ausführen? (Ich verwende Cfengine, kenne Puppet nicht.) Was ist damit? /bin/date '+%Y%m%d00'

ThorstenS
quelle
Das ist sicherlich möglich und ist das, was ich mit dem execBefehl mache (beachten Sie das / bin / Datum dort), aber Sie möchten das nicht als Seriennummer verwenden, als ob Sie mehr als eine Änderung pro Tag in derselben Zone vornehmen, der Seriennummer wird nicht erhöht.
Geoffrey
0

Ich habe Folgendes verwendet, um dies durchzuführen:

file {"${zone['zoneName']}.db":
        name            => "/var/lib/bind/.temp/${zone['zoneName']}.db",
        ensure          => file,
        content         => template('dns/bind/zone.db.erb'),
        owner           => 'root',
        group           => 'bind',
        mode            => 'ug=r,o=',
        require         => File['/var/lib/bind/.temp'],
        notify          => Exec["updateSerial-${zone['zoneName']}"]
}

exec {"updateSerial-${zone['zoneName']}":
        command         => "/bin/sed \"s/#SERIAL#/$(/bin/date '+%s')/\" '/var/lib/bind/.temp/${zone['zoneName']}.db' > '/var/lib/bind/${zone['zoneName']}.db'",
        refreshonly     => true,
        require         => File["${zone['zoneName']}.db"],
        notify          => Service['bind']
}

Die Vorlage hat #SERIAL#als Platzhalter, nachdem die temporäre Datei erstellt wurde, Execwird die benachrichtigt, die dann den Platzhalter verwendet sedund datedurch den aktuellen Unix-Zeitstempel ersetzt, um die Datei schließlich an den richtigen Ort zu schreiben.

Geoffrey
quelle
0

Ich habe dazu tendiert, die Änderungszeit der Manifest- oder Hiera-Datei zu verwenden, in der Sie die Host-Einträge deklarieren, und diese in einen geeigneten Zeitstempel für die Serie zu konvertieren. (Sie können auch die neueste Datei aus einer Reihe von Dateien verwenden, wenn diese auf mehrere Dateien aufgeteilt ist, oder einen Zeitstempel für die letzte Änderung, wenn diese über eine andere Route wie eine Datenbank erfolgt.)

Leider ist die maximale Seriennummer eine 32-Bit-Ganzzahl ohne Vorzeichen, sodass Sie nur Zahlen bis 2147483647 verwenden können. Dies erlaubt uns leider nicht, Sekunden seit der Unix-Epoche als Seriennummer zu verwenden . Stattdessen wird standardmäßig JJJJMMTTxx verwendet. Dies setzt jedoch voraus, dass Sie die aktuelle Seriennummer als Status haben, wenn Sie sie bereits am selben Datum festgelegt haben.

Als Alternative und ohne dass Sie keine Datei einlesen und die Anzahl erhöhen müssen, verwende ich die folgende Inline-Vorlage:

$serial_mtime_file = '/etc/puppetlabs/code/environments/production/site/profile/manifests/dns_dhcp_pxe.pp'
$serial_secs = inline_template("<%= File.mtime(@serial_mtime_file).strftime(\"%y%j\").to_s + (File.mtime(@serial_mtime_file).to_i % 86400).to_s %>")

notify { "Created magical serial number ${serial_secs}": }
validate_numeric($serial_secs)

Dadurch erhalten Sie ein YYDDDsssss-Format (2-stelliges Jahr, 3-stelliger Tag des Jahres, 5-stellige Sekunde-in-Tag), das bis 2099 funktioniert (wenn Sie wie oben beschrieben mit 2000 beginnen) und jede Sekunde ein Update ermöglicht bis dann. Auf diese Weise können Sie diese Variable als Argument für jedes vorhandene Modul verwenden, mit dem Sie die Bindungskonfigurationen erstellen möchten, anstatt eine Vorlage zu benötigen, aus der Sie die vorhandene Seriennummer (zum Inkrementieren) zurücklesen können.

Vorlagen sind also in Ordnung, wenn Sie ein bisschen kreativ sind, woher Sie die Zeit haben, die Seriennummer mit festzulegen :)

Ich habe das oben genannte mit dem Camptocamp / Bind Puppetforge-Modul verwendet und dies funktioniert korrekt

David Gardner
quelle