Ich muss einige Konfigurationsanpassungen an mehreren Servern in unserem kleinen Abteilungsnetzwerk vornehmen. Wir verwenden derzeit RHEL5 und da ich die Arbeit nicht wiederholen möchte, möchte ich RPMs mit dieser Konfiguration erstellen und sie auf unser RHN hochladen.
Nun zum Problem: Angenommen, ich möchte die NTP-Konfiguration über verteilen /etc/ntp.conf
. Leider gibt es kein , /etc/ntp.d/
in das ich meine Dateien legen könnte, daher müsste ich das ntp.conf
mit meinem RPM überschreiben. Wie mache ich das richtig, d. h. ohne die Konfiguration beim Aktualisieren zu verlieren ntp
und auch ohne mögliche Konflikte mit den Konfigurationsdateien?
Antwort1
Entscheiden Sie sich stattdessen für Davids Lösung und verwenden Sie Puppet. Wirklich.
Wenn Sie jedoch entschlossen sind, können Sie ein Paket rassie-ntp-conf erstellen, das "/etc/ntp.conf.rassie" enthält. In der Spezifikationsdatei benötigen Sie ein , %post
das Ihre Konfiguration über die Standardkonfiguration kopiert, und auch ein " %triggerin -- ntp-server
", das dasselbe tut. Auf diese Weise wird die Konfiguration, wenn ein späteres Upgrade die Konfiguration überschreibt, vom Trigger wieder darüber kopiert. Um wirklich sicher zu sein, können Sie vielleicht etwas in /etc/cron.daily ablegen, um dasselbe zu tun ... Wahrscheinlich müssen all diese Skripte service ntpd condrestart
auch nach dem CP ein ausführen.
Das sind die Grundlagen. Wenn Sie dies für mehr Pakete tun möchten, können Sie stattdessen ein Standardskript erstellen, das durch /etc/rassie/ läuft, um Konfigurationen zu finden, die in /etc kopiert werden sollen, und stattdessen das %post- und %triggerin-Zeug ausführen lassen.
Aber ignorieren Sie das wirklich und verwenden Sie Puppet oder Chef oder cfengine ... Diese Art von Schema zum „Herausgeben der Konfiguration über RPM“ ist voller subtiler Probleme, die auf das grundlegende Problem zurückzuführen sind, dass RPM nicht dafür ausgelegt ist, dass zwei verschiedene Pakete um eine einzelne Datei kämpfen. Schwer zu testen, schwer zu debuggen, genau die Art von cleverer Lösung, die Sie später wünschen lässt, Sie hätten sich gleich für Puppet entschieden.
Antwort2
Kann ich eine alternative Lösung vorschlagen? Möglicherweise finden Sie, dass ein Konfigurationsmanagement-Tool wie Puppet oder Cfengine2 das tut, was Sie wollen. Sie schreiben Manifestdateien, die beschreiben, wie ein System aussehen soll, und es ändert das System, sodass es so aussieht. Beachten Sie den wichtigen Unterschied, dass Sie beschreiben, wie das System aussehen soll, und nicht, wie Sie das System ändern. Ein Beispiel für ntp könnte sein:
class ntp {
package {"ntpd":
ensure => latest,
}
file { "/etc/ntp/ntp.conf":
source => "puppet:///ntp/ntp.conf",
owner => "root",
group => "root",
mode => 644,
require => Package["ntpd"],
}
service { "ntpd":
ensure => running,
enable => true,
subscribe => File["/etc/ntp/ntp.conf"],
}
}
Wenn Sie diese Klasse in einen bestimmten Knoten einbinden, installieren Sie das ntpd-Paket, kopieren Ihre Datei auf den Server und stellen sicher, dass der Daemon ausgeführt wird. Wenn Puppet Änderungen an ntp.conf vornimmt, wird der NTP-Daemon neu gestartet (dank der Subscribe-Zeile).
Wie löst das Ihre Probleme? Wenn eine neue Version von NTP installiert wird und das Paket die Konfigurationsdatei überschreibt, kopiert Puppet die alte zurück. Wenn es Unterschiede gibt, wird beim Ändern ein Diff angezeigt, sodass Sie sehen können, welche Änderungen vorgenommen wurden. So können Sie etwaige Unterschiede erkennen und Ihre zentrale Version aktualisieren, wenn Sie diese Änderungen wünschen.
Antwort3
Unabhängig davon, wie Sie die Änderungen veröffentlichen, wenn Sie ntp.conf (oder eigentlich jede andere Konfigurationsdatei) ändern müssen und die Datei nicht komplett ersetzen möchten, werfen Sie einen Blick auf Augeas (http://augeas.net). Es ist zwar ein kleiner Lernaufwand nötig, aber die Komplexität beim Parsen/Bearbeiten von Dateien wird erheblich reduziert.
Antwort4
Ich habe versucht, nur mit RPMs zurechtzukommen. Das ist nur möglich, wenn Ihre Konfigurationsdateien sehr einfach sind.
Der beste Ansatz, der jedoch nicht ganz so einfach umzusetzen ist, ist, wie alle vorgeschlagen haben, die Verwendung von Tools wie Puppet und Cfengine.