Stellen Sie die Parameter sysctl.conf mit Puppet ein

10

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_defaultund 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 sysctlModul 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";
  }
}
ewwhite
quelle
Das ist ausgezeichnet. Haben Sie darüber nachgedacht, dies als ein Modul zu schreiben, das auf Puppet Forge veröffentlicht wird?
TomOnTime

Antworten:

14

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 valuegibt 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.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = https://gerrit.wikimedia.org/r/p/operations/puppet
[branch "production"]
    remote = origin
    merge = refs/heads/production

Ein einfaches Beispiel aus der obigen Konfigurationsdokumentation wäre:

augeas { "sshd_config":
 context => "/files/etc/ssh/sshd_config",
  changes => [
    "set PermitRootLogin no",
  ],
}

Wenn Sie also Ihre /etc/sysctl.conf verwalten möchten, geben Sie Folgendes ein:

augeas { "sysctl":
 context => "/files/etc/sysctl.conf",
  changes => [
    "set kernel.sysrq = 0",
    #and whatever other lines are interesting to you
  ],
}

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.

Jeff Ferland
quelle
Die Definition befindet sich in einem value.ppManifest, das mit dem module-sysctlModul verteilt wird. Es sieht aus wiedefine sysctl::value ( $key = 'name', $value ) {
ewwhite
@ewwhite Es sieht so aus, als ob der Fehler, mit dem Sie verlinkt haben, auf Ihre Situation zutreffen könnte. Können Sie bestätigen, dass das Modul auf Ihrem Zielcomputer geladen wird?
Jeff Ferland
Wie kann ich überprüfen, ob das Modul vorhanden ist?
ewwhite
Mit dem Augeas-Ansatz. Ich glaube, ich habe einen Fehler mit der anderen Lösung gefunden.
ewwhite
2

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:

class s_sysctl::rhel_defaults {
    include sysctl

    # Controls IP packet forwarding
    sysctl::set_value { "net.ipv4.ip_forward": 
                         value => 0 
    }

    # Controls source route verification
    sysctl::set_value { "net.ipv4.conf.default.rp_filter": value => 1 }
}

Sie fragen sich vielleicht, wohin dieser Code eigentlich geht? Ich mag es, meinen Puppenbaum so zu organisieren:

site.pp -> nodes.pp -> roles.pp -> /etc/puppet/site-modules/s_sysctl -> /etc/puppet/modules/sysctl

Auf diese Weise enthalten Site-Module Hiera-Daten oder Tunables, und die Module bleiben generisch, steckbar und "modular".

Robbyt
quelle
Ja, es ist in meiner Frage verlinkt. Es gibt keine Dokumentation für das Modul und ich bin mir nicht sicher, wo ich es installieren oder wie ich es tatsächlich verwenden soll.
ewwhite
Entschuldigung, ich habe nicht Ihre gesamte Frage gelesen :) Das Modul enthält eine Definition, die in einer anderen Klasse aufgerufen werden muss. Ich werde meine Antwort bearbeiten und Code einfügen ...
Robbyt
Damit sind die Fehler, die ich erhalte: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
ewwhite
Es sieht so aus, als würden Sie eine Definition mit der Bezeichnung "sysctl :: value" und nicht "sysctl :: set_value" aufrufen.
Robbyt
Die Definition befindet sich in einem value.ppManifest, das mit dem module-sysctlModul verteilt wird. Es sieht aus wiedefine sysctl::value ( $key = 'name', $value ) {
ewwhite
0

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 Paar present/ absentKonfigurationen verwenden, wenn Sie den Wert ändern.

Um den Wert zu ändern - vorausgesetzt, die Zeile ist bereits vorhanden - können Sie ihn replaceim 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.

Daniel C. Sobral
quelle
Ich denke nicht, dass die Verwaltung der gesamten Datei skalierbar ist. Ich wusste, dass die gesamte Dateioption eine Möglichkeit ist, aber verwenden Sie den Fall kleiner Änderungen in einer RHEL-Version ... Es kann sysctl.confStandardeinstellungen 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.
ewwhite
@ewwhite Hat RHEL keine lokale Override-Datei für 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.
Daniel C. Sobral