Définissez les paramètres sysctl.conf avec Puppet

10

Ce fut un jeu d'enfant dans CFEngine ... Mais je suis maintenant dans un environnement Puppet , et je dois pouvoir assigner / assurer / vérifier certaines variables sysctl.conf. Dans le monde CFEngine, je pouvais simplement rechercher des lignes spécifiques dans un fichier de configuration ... J'ai trouvé une petite référence à un module sysctl sur le wiki 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 comme net.core.rmem_defaultet net.core.wmem_max. Au format du projet hébergé sur github , la configuration de mon manifeste init.pp devrait ressembler à:

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 confusion sur la différence entre les plugins et 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 surmonter certaines erreurs poilues. Je pensais que c'était un module!

Les erreurs actuelles du client:

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 bug ?

Edit: Correction de l'utilisation de la bibliothèque Augeas comme suggéré par Jeff Ferland et du wiki Puppet .

J'ai créé un sysctlmodule ...

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 appropriés ...

class prod_sysctl {

include sysctl

sysctl::conf {

  # increase PID rollover value
  "kernel.pid_max": value =>  "1048576";
  }
}
ewwhite
la source
C'est excellent. Avez-vous envisagé d'écrire ceci comme un module publié sur la marionnette forge?
TomOnTime

Réponses:

14

Réponse spécifique: Immédiatement, vous appelez sysctl :: value, mais value n'est pas déclarée 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 sysctl :: value à appeler.


Réponse générale et conseils: La construction Augeas (voir aussi sa documentation de référence de type ) qui fait partie des versions actuelles de Puppet permet de maintenir les lignes dans un fichier de configuration et respecte même le contexte, afin de pouvoir gérer des fichiers tels qu'une configuration git. L'exemple ci-dessous est à la fois pour démontrer la fonctionnalité et pour vous diriger vers une grande collection de référence de configurations de marionnettes - le magasin de configuration en direct pour les serveurs 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 exemple simple 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 souhaitez 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
  ],
}

L' exemple Augeas a également une construction pour une classe sysctl basée sur Augeus qui est similaire à ce que vous avez posté dans votre question, ce qui peut également apporter un éclairage.

Jeff Ferland
la source
Le define est dans un value.ppmanifeste distribué avec le module-sysctlmodule. Il ressemble àdefine sysctl::value ( $key = 'name', $value ) {
ewwhite
@ewwhite Il semble que le bogue auquel vous avez lié pourrait s'appliquer à votre situation. Pouvez-vous confirmer que le module se charge sur votre machine cible?
Jeff Ferland
Comment puis-je vérifier la présence du module?
ewwhite
Aller avec l'approche Augeas. Je pense que j'ai rencontré un bug avec l'autre solution.
ewwhite
2

J'ai déjà utilisé ce module avec RHEL5: puppet-sysctl

Pour l'utiliser, vous devrez installer le module dans votre dossier modules (probablement / etc / puppet / modules / sysctl) inclure la classe sur votre nœud: (inclure sysctl) puis 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 donc peut-être où va ce code? J'aime organiser mon arbre de marionnettes comme ceci:

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

Ainsi, site-modules contient des données hiera, ou ajustables, et les modules restent génériques, enfichables et "modulaires".

robbyt
la source
Oui, c'est lié dans ma question. Il n'y a pas de documentation pour le module et je ne sais pas où l'installer ni comment l'utiliser réellement.
ewwhite
Désolé, je n'ai pas lu toute votre question :) Le module comprend un define, qui doit être appelé dans une autre classe. Je vais modifier ma réponse et inclure le code ...
robbyt
Donc avec ça, les erreurs que je reçois sont: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
Il semble que vous appeliez une définition intitulée 'sysctl :: value' et non 'sysctl :: set_value'.
robbyt
Le define est dans un value.ppmanifeste distribué avec le module-sysctlmodule. On diraitdefine sysctl::value ( $key = 'name', $value ) {
ewwhite
0

Tant que vous n'avez pas à modifier la valeur (ou que vous êtes satisfait de l'ajout de lignes avec les nouvelles valeurs), vous pouvez utiliser Common's line . Vous pouvez utiliser une paire de present/ absentconfigurations lorsque vous modifiez la valeur.

Pour modifier la valeur - en supposant que la ligne existe déjà -, vous pouvez utiliser replacedans 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, je pense, est assez simple et commun pour qu'elle ait dû être fournie par les types de marionnettes par défaut.

Alors, pourquoi pas? Parce que Puppet attend de vous que vous gériez entièrement les choses que vous gérez. Autrement dit, vous devez distribuer l' intégralité du fichier sysctl, au lieu d'ajouter ou de supprimer simplement une valeur ou une autre. Je ne dis pas que c'est nécessairement une chose facile à faire, mais si vous pouvez vous en tirer, c'est la façon la plus simple de le faire.

Daniel C. Sobral
la source
Je ne pense pas que la gestion de l'ensemble du fichier soit évolutive. Je savais que l'option de fichier entier était une possibilité, mais utilisez le cas de petits changements dans une version RHEL ... Il peut y avoir des sysctl.confvaleurs par défaut qui changent entre les versions de RHEL. Nous ne souhaitons peut-être pas les ignorer / les remplacer, plutôt que de nous assurer qu'un paramètre spécifique peut être défini / modifié.
ewwhite
@ewwhite RHEL n'a-t-il pas de fichier de remplacement local pour sysctl.conf? Ou voulez-vous dire que vous avez différentes configurations selon la version? Dans ce dernier cas, vous pouvez créer un modèle et avoir des lignes sélectionnées en fonction de la version du système d'exploitation.
Daniel C.Sobral