Ustaw parametry sysctl.conf za pomocą Puppet

10

To było proste w CFEngine ... Ale teraz jestem w środowisku Puppet i muszę być w stanie przypisać / zapewnić / sprawdzić określone zmienne sysctl.conf. W świecie CFEngine mogłem po prostu sprawdzić określone linie w pliku konfiguracyjnym ... Znalazłem małe odniesienie do modułu sysctl na wiki Puppet i projektu w github, który wydaje się robić to, co chcę.

Ale żadne z nich nie jest tak naprawdę dobrze udokumentowane. Po prostu szukam sposobu na edycję kilku wartości, takich jak net.core.rmem_defaulti net.core.wmem_max. W formacie projektu hostowanym na githubie konfiguracja w moim manifeście init.pp powinna wyglądać następująco:

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";
        }
}

Przechodząc przez fora i listy mailingowe, wydaje się, że istnieje zamieszanie co do różnicy między wtyczkami i modułami Puppet. Terminy są prawie używane zamiennie ... Skończyło się na tym, że musiałem włączyć pluginsync na moich klientach, aby ominąć włochate błędy. Myślałem, że to był moduł!

Bieżące błędy klienta:

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

Czy są jakieś przemyślenia na temat tego, jak to osiągnąć przy jak najmniejszym bólu?

Edycja: Czy ten błąd dotyczy mnie ?

Edycja: Naprawiono używanie biblioteki Augeas, jak zasugerował Jeff Ferland i wiki Puppet .

Stworzyłem sysctlmoduł ...

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"],
   }

}

... i kolejny moduł do ustawienia odpowiednich ustawień ...

class prod_sysctl {

include sysctl

sysctl::conf {

  # increase PID rollover value
  "kernel.pid_max": value =>  "1048576";
  }
}
ewwhite
źródło
To jest doskonałe. Czy zastanawiałeś się nad napisaniem tego jako modułu opublikowanego na marionetkowej kuźni?
TomOnTime,

Odpowiedzi:

14

Konkretna odpowiedź: natychmiast wywołujesz sysctl :: wartość, ale wartość nie jest zadeklarowana w twojej klasie sysctl. Zobacz ten przykład, który używa deklaracji sysctl :: conf. Bez tego define valuenie ma podklasy sysctl :: value, do której można by zadzwonić.


Ogólna odpowiedź i wskazówki: Konstrukcja Augeas (patrz także jej dokumentacja referencyjna ), która jest częścią aktualnych wersji Puppet, pozwala utrzymywać linie w pliku konfiguracyjnym, a nawet szanuje kontekst, dzięki czemu może zarządzać plikami takimi jak konfiguracja git. Poniższy przykład ma na celu zarówno zademonstrowanie funkcjonalności, jak i wskazanie wspaniałego zbioru referencyjnego konfiguracji Puppet - sklepu z konfiguracjami na żywo dla serwerów Wikipedii.

[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

Jednym prostym przykładem z powyższej dokumentacji konfiguracji byłoby:

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

Jeśli więc chcesz zarządzać plikiem /etc/sysctl.conf, wprowadź następujące dane:

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

Przykład Augeas ma również konstrukt dla klasy sysctl oparciu o Augeus, który jest podobny do tego, co napisali w swoim pytaniu, tak że mogą rzucić nieco światła.

Jeff Ferland
źródło
Definicja jest w value.ppmanifeście rozpowszechnianym z module-sysctlmodułem. Wygląda na todefine sysctl::value ( $key = 'name', $value ) {
ewwhite
@ewwhite Wygląda na to, że błąd, do którego linkujesz, może dotyczyć twojej sytuacji. Czy możesz potwierdzić, że moduł ładuje się na maszynę docelową?
Jeff Ferland
Jak mogę sprawdzić obecność modułu?
ewwhite
Stosując podejście Augeas. Myślę, że trafiłem w błąd innym rozwiązaniem.
ewwhite
2

W przeszłości korzystałem z tego modułu z RHEL5: puppet-sysctl

Aby z niego skorzystać, musisz zainstalować moduł w folderze modułów (prawdopodobnie / etc / puppet / modules / sysctl), dołącz klasę w węźle: (dołącz sysctl), a następnie wywołaj zasób def w następujący sposób:

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 }
}

Być może zastanawiasz się, dokąd właściwie ten kod idzie? Lubię organizować moje drzewo lalek w ten sposób:

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

W ten sposób moduły witryny zawierają dane hiera lub tuningi, a moduły pozostają ogólne, można je podłączać i „modułowo”.

robbyt
źródło
Tak, jest to powiązane z moim pytaniem. Nie ma dokumentacji dla modułu i nie jestem pewien, gdzie go zainstalować ani jak z niego korzystać.
ewwhite
Przepraszamy, nie przeczytałem całego pytania :) Moduł zawiera definicję, którą należy wywołać w innej klasie. Zmienię odpowiedź i
dołączę
W związku z tym otrzymuję błędy: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
Wygląda na to, że nazywasz definitywną etykietę „sysctl :: value”, a nie „sysctl :: set_value”.
robbyt
Definicja jest w value.ppmanifeście rozpowszechnianym z module-sysctlmodułem. Wygląda na todefine sysctl::value ( $key = 'name', $value ) {
ewwhite
0

Dopóki nie musisz zmieniać wartości (lub jesteś zadowolony z dodawania wierszy z nowymi wartościami), możesz używać Common line . Podczas zmiany wartości można użyć pary present/ absentkonfiguracji.

Aby zmienić wartość - zakładając, że linia już istnieje - możesz użyć replacew tym samym module.

Możesz też spojrzeć na to, jak te definicje zostały napisane, aby dopasować je do twojego zadania - co, myślę, uważam, że jest proste i na tyle powszechne, że powinno być dostarczone przez domyślne typy Puppet.

Dlaczego tak nie jest? Ponieważ Puppet oczekuje od Ciebie pełnego zarządzania rzeczami, którymi zarządzasz. Oznacza to, że należy rozpowszechniać cały plik sysctl, zamiast dodawać lub usuwać jedną lub inną wartość. Nie twierdzę, że jest to z pewnością łatwa rzecz, ale jeśli możesz sobie z tym poradzić, to najłatwiej to zrobić.

Daniel C. Sobral
źródło
Nie sądzę, aby zarządzanie całym plikiem było skalowalne. Wiedziałem, że cała opcja pliku jest możliwa, ale skorzystaj z przypadku niewielkich zmian w wydaniu RHEL ... Mogą istnieć sysctl.confwartości domyślne, które zmieniają się między wersjami RHEL. Możemy nie chcieć ich ignorować / nadpisywać, zamiast zapewniać możliwość ustawienia / zmiany określonego parametru.
ewwhite
@ewwhite Czy RHEL nie ma lokalnego pliku zastępczego sysctl.conf? Czy masz na myśli, że masz różne konfiguracje w zależności od wydania? W tym drugim przypadku możesz utworzyć szablon i wybrać linie w zależności od wersji systemu operacyjnego.
Daniel C. Sobral