Impostare i parametri sysctl.conf con Puppet


10

Questo è stato un gioco da ragazzi in CFEngine ... Ma adesso mi trovo in un ambiente Puppet e devo essere in grado di assegnare / garantire / controllare determinate variabili sysctl.conf. Nel mondo CFEngine, potrei semplicemente verificare la presenza di righe specifiche all'interno di un file di configurazione ... Ho trovato un piccolo riferimento a un modulo sysctl sul wiki Puppet e un progetto in github che sembra fare quello che voglio.

Ma nessuno dei due è davvero ben documentato. Sto semplicemente cercando un modo per modificare un paio di valori come net.core.rmem_defaulte net.core.wmem_max. Nel formato del progetto ospitato su github , la configurazione nel mio manifest init.pp dovrebbe apparire come:

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

Passando attraverso forum e mailing list, sembra esserci confusione sulla differenza tra plugin e moduli Puppet. I termini sono quasi usati in modo intercambiabile ... Alla fine ho dovuto abilitare il pluginsync sui miei clienti per superare alcuni errori pelosi. Pensavo fosse un modulo!

Gli errori client correnti:

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

Qualche idea su come ottenere questo risultato con la minima quantità di dolore?

Modifica: sono affetto da questo errore ?

Modifica: risolto utilizzando la libreria Augeas come suggerito da Jeff Ferland e dalla wiki Puppet .

Ho creato un sysctlmodulo ...

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

}

... e un altro modulo per impostare le impostazioni pertinenti ...

class prod_sysctl {

include sysctl

sysctl::conf {

  # increase PID rollover value
  "kernel.pid_max": value =>  "1048576";
  }
}

Questo è eccellente Hai mai pensato di scriverlo come un modulo pubblicato su Puppet Forge?
TomOnTime

Risposte:


14

Risposta specifica: parlando immediatamente, stai chiamando sysctl :: value, ma value non è dichiarato nella tua classe sysctl. Vedi questo esempio che utilizza una dichiarazione sysctl :: conf. Senza il define value, non c'è sottoclasse sysctl :: value che puoi chiamare.


Risposta generale e guida: il costrutto Augeas (vedi anche la documentazione di riferimento del tipo ) che fa parte delle versioni correnti di Puppet consente di mantenere le linee in un file di configurazione e persino di rispettare il contesto, in modo da poter gestire file come una configurazione git. L'esempio che segue è sia per dimostrare la funzionalità sia per indicare una grande raccolta di riferimento di configurazioni Puppet: l'archivio di configurazione live per i server Wikipedia.

[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

Un semplice esempio dalla documentazione di configurazione sopra potrebbe essere questo:

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

Quindi, se vuoi gestire il tuo /etc/sysctl.conf, inserisci quanto segue:

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

L' esempio di Augeas ha anche un costrutto per una classe sysctl basata su Augeus che è simile a quello che hai pubblicato nella tua domanda, quindi potrebbe anche far luce.


La definizione è in un value.ppmanifest distribuito con il module-sysctlmodulo. Sembradefine sysctl::value ( $key = 'name', $value ) {
ewwhite,

@ewwhite Sembra che il bug a cui ti sei collegato potrebbe applicarsi alla tua situazione. Puoi confermare che il modulo sta caricando sul tuo computer di destinazione?
Jeff Ferland,

Come posso verificare la presenza del modulo?
ewwhite,

Seguendo l'approccio di Augeas. Penso di aver colpito un bug con l'altra soluzione.
ewwhite,

2

Ho usato questo modulo in passato con RHEL5: puppet-sysctl

Per usarlo, dovrai installare il modulo nella cartella dei tuoi moduli (probabilmente / etc / puppet / modules / sysctl) includere la classe sul tuo nodo: (include sysctl) e quindi chiamare la risorsa def in questo modo:

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

Quindi ti starai chiedendo, dove va effettivamente questo codice? Mi piace organizzare il mio burattino in questo modo:

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

In questo modo, i moduli del sito contengono dati hiera o sintonizzabili e i moduli rimangono generici, plugable e "modulari".


Sì, è collegato alla mia domanda. Non c'è documentazione per il modulo e non sono sicuro di dove installarlo o come utilizzarlo effettivamente.
ewwhite,

Mi dispiace non ho letto tutta la tua domanda :) Il modulo include un define, che deve essere chiamato in un'altra classe.
Modificherò la

Quindi, con ciò, gli errori che ricevo sono: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,

Sembra che tu stia chiamando un definito etichettato 'sysctl :: value' e non 'sysctl :: set_value'.
Robbyt,

La definizione è in un value.ppmanifest distribuito con il module-sysctlmodulo. Sembradefine sysctl::value ( $key = 'name', $value ) {
ewwhite,

0

Finché non è necessario modificare il valore (o si è soddisfatti dell'aggiunta di righe con i nuovi valori), è possibile utilizzare Common line . È possibile utilizzare una coppia di present/ absentconfigurazioni quando si modifica il valore.

Per modificare il valore - supponendo che la linea esista già -, è possibile utilizzare replacenello stesso modulo.

Oppure puoi vedere come sono scritte queste definizioni per adattarle al tuo compito - che, sia chiaro, penso sia abbastanza semplice e comune da dover essere fornito dai tipi predefiniti di Puppet.

Quindi, perché no? Perché Puppet si aspetta che tu gestisca completamente le cose che stai gestendo. Cioè, dovresti distribuire l' intero file sysctl, invece di aggiungere o rimuovere un valore o un altro. Non sto dicendo che è necessariamente una cosa facile da fare, ma se riesci a cavartela, è il modo più semplice di farlo.


Non penso che la gestione dell'intero file sia scalabile. Sapevo che l'intera opzione del file era una possibilità, ma uso il caso di piccole modifiche all'interno di una versione di RHEL ... Potrebbero esserci delle sysctl.confimpostazioni predefinite che cambiano tra le versioni di RHEL. Potremmo non voler ignorare / sovrascrivere quelli, piuttosto che garantire che un parametro specifico possa essere impostato / modificato.
ewwhite,

@ewwhite RHEL non ha un file di override locale per sysctl.conf? O vuoi dire che hai diverse configurazioni in base alla versione? In quest'ultimo caso, è possibile creare un modello e selezionare le linee in base alla versione del sistema operativo.
Daniel C. Sobral,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.