Dies war ein Kinderspiel in CFEngine ... Aber ich bin jetzt in einer Puppet-Umgebung und muss in der Lage sein, bestimmte sysctl.conf-Variablen zuzuweisen / sicherzustellen / zu überprüfen. In der CFEngine-Welt konnte ich einfach in einer Konfigurationsdatei nach bestimmten Zeilen suchen ... Ich habe im Puppet-Wiki einen kleinen Verweis auf ein sysctl-Modul und ein Projekt in github gefunden , das anscheinend das tut, was ich will.
Aber beide sind nicht wirklich gut dokumentiert. Ich suche einfach nach einer Möglichkeit, ein paar Werte wie net.core.rmem_default
und zu bearbeiten net.core.wmem_max
. Im Format des auf github gehosteten Projekts sollte die Konfiguration in meinem init.pp-Manifest folgendermaßen aussehen:
class sysctl {
sysctl::value {
"net.core.rmem_default": value => "9000000";
"net.core.wmem_default": value => "9000000";
"net.core.rmem_max": value => "16777216";
"net.core.wmem_max": value => "16777216";
}
}
Beim Durchgehen von Foren und Mailinglisten scheint es Verwirrung über den Unterschied zwischen Puppet-Plugins und Modulen zu geben. Die Begriffe werden fast synonym verwendet ... Ich musste schließlich Pluginsync auf meinen Clients aktivieren, um einige haarige Fehler zu überwinden. Ich dachte das wäre ein Modul!
Die aktuellen Clientfehler:
info: Loading downloaded plugin /var/lib/puppet/lib/puppet/type/sysctl.rb
info: Loading downloaded plugin /var/lib/puppet/lib/puppet/provider/sysctl/parsed.rb
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Puppet::Parser::AST::Resource failed with error
ArgumentError: Invalid resource type sysctl::value at /var/lib/puppet/base/modules/sysctl/manifests/init.pp:12 on node shimano.deore.abc.net
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run
Irgendwelche Gedanken darüber, wie dies mit dem geringsten Schmerz erreicht werden kann?
Bearbeiten: Bin ich von diesem Fehler betroffen ?
Bearbeiten: Mit der Augeas-Bibliothek, wie von Jeff Ferland und aus dem Puppet-Wiki vorgeschlagen, behoben .
Ich habe ein sysctl
Modul erstellt ...
class sysctl {
# nested class/define
define conf ( $value ) {
# $name is provided by define invocation
# guid of this entry
$key = $name
$context = "/files/etc/sysctl.conf"
augeas { "sysctl_conf/$key":
context => "$context",
onlyif => "get $key != '$value'",
changes => "set $key '$value'",
notify => Exec["sysctl"],
}
}
file { "sysctl_conf":
name => $operatingsystem ? {
default => "/etc/sysctl.conf",
},
}
exec { "/sbin/sysctl -p":
alias => "sysctl",
refreshonly => true,
subscribe => File["sysctl_conf"],
}
}
... und ein weiteres Modul zum Einstellen der relevanten Einstellungen ...
class prod_sysctl {
include sysctl
sysctl::conf {
# increase PID rollover value
"kernel.pid_max": value => "1048576";
}
}
quelle
Antworten:
Spezifische Antwort: Sie rufen sofort sysctl :: value auf, aber value ist in Ihrer sysctl-Klasse nicht deklariert. In diesem Beispiel wird eine sysctl :: conf-Deklaration verwendet. Ohne das
define value
gibt es keine sysctl :: value-Unterklasse, die Sie aufrufen können.Allgemeine Antwort und Führung: Das Augias - Konstrukt (siehe auch seine Dokumentation Typenbezeichnung ) , der Teil der aktuellen Versionen von Puppet ist erlaubt Linien in einer Konfigurationsdatei und auch Hinsicht Kontext beibehalten, so dass es Dateien verwalten kann wie zum Beispiel einer git - Konfiguration. Das folgende Beispiel soll sowohl die Funktionalität demonstrieren als auch Sie auf eine großartige Referenzsammlung von Puppet-Konfigurationen verweisen - den Live-Konfigurationsspeicher für Wikipedia-Server.
Ein einfaches Beispiel aus der obigen Konfigurationsdokumentation wäre:
Wenn Sie also Ihre /etc/sysctl.conf verwalten möchten, geben Sie Folgendes ein:
Das Augeas-Beispiel enthält auch ein Konstrukt für eine auf Augeus basierende sysctl-Klasse, das dem ähnelt, was Sie in Ihrer Frage gepostet haben, sodass möglicherweise auch etwas Licht ins Dunkel kommt.
quelle
value.pp
Manifest, das mit demmodule-sysctl
Modul verteilt wird. Es sieht aus wiedefine sysctl::value ( $key = 'name', $value ) {
Ich habe dieses Modul in der Vergangenheit mit RHEL5 verwendet: puppet-sysctl
Um es zu verwenden, müssen Sie das Modul in Ihrem Modulordner installieren (wahrscheinlich / etc / puppet / modules / sysctl), die Klasse auf Ihrem Knoten einschließen: (include sysctl) und dann die def-Ressource wie folgt aufrufen:
Sie fragen sich vielleicht, wohin dieser Code eigentlich geht? Ich mag es, meinen Puppenbaum so zu organisieren:
Auf diese Weise enthalten Site-Module Hiera-Daten oder Tunables, und die Module bleiben generisch, steckbar und "modular".
quelle
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Puppet::Parser::AST::Resource failed with error ArgumentError: Invalid resource type sysctl::value at /var/lib/puppet/base/modules/sysctl/manifests/init.pp:12 on node shimano.deore.abc.net
value.pp
Manifest, das mit demmodule-sysctl
Modul verteilt wird. Es sieht aus wiedefine sysctl::value ( $key = 'name', $value ) {
Solange Sie den Wert nicht ändern müssen (oder mit dem Anhängen von Zeilen mit den neuen Werten zufrieden sind), können Sie Common verwenden
line
. Sie können ein Paarpresent
/absent
Konfigurationen verwenden, wenn Sie den Wert ändern.Um den Wert zu ändern - vorausgesetzt, die Zeile ist bereits vorhanden - können Sie ihn
replace
im selben Modul verwenden.Oder Sie können sich ansehen, wie diese Definitionen geschrieben sind, um sie für Ihre Aufgabe geeignet zu machen - was meiner Meinung nach einfach und häufig genug ist, dass sie von den Standardtypen von Puppet bereitgestellt werden sollten.
Warum nicht? Weil Puppet erwartet, dass Sie die Dinge, die Sie verwalten, vollständig verwalten. Das heißt, Sie sollten die gesamte sysctl-Datei verteilen , anstatt nur den einen oder anderen Wert hinzuzufügen oder zu entfernen. Ich sage nicht, dass das unbedingt einfach ist, aber wenn Sie damit durchkommen können, ist dies der einfachste Weg.
quelle
sysctl.conf
Standardeinstellungen geben, die sich zwischen RHEL-Versionen ändern. Wir möchten diese möglicherweise nicht ignorieren / überschreiben, anstatt sicherzustellen, dass ein bestimmter Parameter festgelegt / geändert werden kann.sysctl.conf
? Oder meinst du, du hast je nach Release unterschiedliche Konfigurationen? Im letzteren Fall können Sie je nach Betriebssystemversion eine Vorlage erstellen und Zeilen auswählen.