10 votes

Définir les paramètres de sysctl.conf avec Puppet

C'était un jeu d'enfant en CFEngine ... Mais je suis dans une Environnement Puppet maintenant, et j'ai besoin de pouvoir assigner/assurer/vérifier certaines variables sysctl.conf. Dans le monde de CFEngine, je pourrais simplement vérifier des lignes spécifiques dans un fichier de configuration... J'ai trouvé une petite référence à un module sysctl sur le wiki de Puppet et un projet dans github qui semble faire ce que je veux.

Mais ni l'un ni l'autre ne sont vraiment bien documentés. Je cherche simplement un moyen d'éditer quelques valeurs telles que net.core.rmem_default y net.core.wmem_max . Dans le format de l projet hébergé sur github la configuration dans mon manifeste init.pp devrait ressembler à ceci :

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

En parcourant les forums et les listes de diffusion, il semble y avoir une confusion sur la différence entre les plugins et les modules Puppet. Les termes sont presque utilisés de manière interchangeable... J'ai fini par avoir besoin d'activer pluginsync sur mes clients afin de passer outre certaines erreurs épineuses. Je pensais que c'était un module !

Les erreurs du client actuel :

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

Avez-vous des idées sur la façon d'accomplir cela avec le moins de douleur possible ?

Edit : Suis-je affecté par ce problème ?

Edit : Corrigé en utilisant la bibliothèque Augeas comme suggéré par Jeff Ferland et à partir de la page Puppet wiki .

J'ai créé un sysctl module...

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

}

...et un autre module pour définir les paramètres pertinents...

class prod_sysctl {

include sysctl

sysctl::conf {

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

14voto

Tom Points 720

Réponse spécifique : Dans l'immédiat, vous appelez sysctl::value, mais value n'est pas déclaré dans votre classe sysctl. Voir cet exemple qui utilise une déclaration sysctl::conf. Sans le define value il n'y a pas de sous-classe de sysctl::value que vous pouvez appeler.


Réponse et orientation générales : Le site Augeas (voir également son documentation de référence du type ) qui fait partie des versions actuelles de Puppet permet de maintenir des lignes dans un fichier de configuration et respecte même le contexte, de sorte qu'il peut gérer des fichiers tels qu'une configuration git. L'exemple ci-dessous sert à la fois à démontrer la fonctionnalité et à vous indiquer une excellente collection de référence de configurations Puppet - le magasin de configuration en direct pour les serveurs Wikipédia.

[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 exemple simple tiré de la documentation de configuration ci-dessus serait le suivant :

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

Donc, si vous voulez gérer votre /etc/sysctl.conf, entrez ce qui suit :

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

En Exemple d'Augeas a également une construction pour une classe sysctl basée sur Augeus qui est similaire à ce que vous avez posté dans votre question, donc cela peut également apporter une certaine lumière.

2voto

robbyt Points 1622

J'ai utilisé ce module dans le passé avec RHEL5 : Puppet-sysctl

Pour l'utiliser, vous devez installer le module dans votre dossier modules (probablement /etc/Puppet/modules/sysctl) et inclure la classe dans votre noeud : (include sysctl) et ensuite appeler la ressource def comme ceci :

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

Vous vous demandez peut-être où va ce code. J'aime organiser mon arbre de Puppet comme ceci :

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

De cette façon, les modules de site contiennent des données hiérarchiques, ou tunables, et les modules restent génériques, plugables et "modulaires".

0voto

Daniel C. Sobral Points 5453

Tant que vous n'avez pas à changement la valeur (ou se contente d'ajouter des lignes avec les nouvelles valeurs), vous pouvez utiliser la fonction Common's line . Vous pouvez utiliser une paire de present / absent lorsque vous modifiez la valeur.

Pour changer la valeur -- en supposant que la ligne existe déjà --, vous pouvez utiliser replace dans le même module.

Ou vous pouvez regarder comment ces définitions sont écrites pour en faire une adaptée à votre tâche -- ce qui, remarquez-le bien, est suffisamment simple et commun pour qu'il ait été fourni par les types par défaut de Puppet.

Alors, pourquoi ne le fait-elle pas ? Parce que Puppet attend de vous que vous gériez entièrement les choses que vous gérez. C'est-à-dire que vous devez distribuer les ensemble du site sysctl, au lieu de simplement ajouter ou supprimer une valeur ou une autre. Je ne dis pas que c'est nécessairement une chose facile à faire, mais si vous pouvez le faire, c'est la façon la plus simple de le faire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X