Establecer parámetros sysctl.conf con Puppet

10

Esto fue muy fácil en CFEngine ... Pero ahora estoy en un entorno de Puppet y necesito poder asignar / asegurar / verificar ciertas variables sysctl.conf. En el mundo de CFEngine, simplemente podría verificar si hay líneas específicas dentro de un archivo de configuración ... He encontrado una pequeña referencia a un módulo sysctl en el wiki de Puppet y un proyecto en github que parece hacer lo que quiero.

Pero ninguno de los dos está realmente bien documentado. Simplemente estoy buscando una manera de editar un par de valores como net.core.rmem_defaulty net.core.wmem_max. En el formato del proyecto alojado en github , la configuración en mi manifiesto init.pp debería verse así:

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

Al revisar foros y listas de correo, parece haber confusión sobre la diferencia entre los complementos y módulos de Puppet. Los términos casi se usan indistintamente ... Terminé necesitando habilitar pluginsync en mis clientes para superar algunos errores mentales. ¡Pensé que esto era un módulo!

Los errores actuales del cliente:

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

¿Alguna idea sobre cómo lograr esto con la menor cantidad de dolor?

Editar: ¿Estoy afectado por este error ?

Editar: Se corrigió el uso de la biblioteca Augeas como lo sugirió Jeff Ferland y del wiki Puppet .

Creé un sysctlmódulo ...

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

}

... y otro módulo para configurar los ajustes relevantes ...

class prod_sysctl {

include sysctl

sysctl::conf {

  # increase PID rollover value
  "kernel.pid_max": value =>  "1048576";
  }
}
ewwhite
fuente
Esto es excelente. ¿Has considerado escribir esto como un módulo que se publica en Puppet Forge?
TomOnTime

Respuestas:

14

Respuesta específica: Inmediatamente hablando, está llamando a sysctl :: value, pero el valor no se declara en su clase sysctl. Vea este ejemplo que usa una declaración sysctl :: conf. Sin el define value, no hay una subclase de sysctl :: value a la que pueda llamar.


Respuesta general y orientación: La construcción Augeas (consulte también su documentación de referencia de tipo ) que forma parte de las versiones actuales de Puppet permite mantener líneas en un archivo de configuración e incluso respeta el contexto, por lo que puede administrar archivos como una configuración git. El siguiente ejemplo es para demostrar la funcionalidad y para señalarle una gran colección de referencia de configuraciones de Puppet: la tienda de configuración en vivo para servidores de 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 ejemplo simple de la documentación de configuración anterior sería este:

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

Entonces, si desea administrar su /etc/sysctl.conf, ingrese lo siguiente:

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

El ejemplo de Augeas también tiene una construcción para una clase sysctl basada en Augeus que es similar a lo que publicó en su pregunta, por lo que también puede arrojar algo de luz.

Jeff Ferland
fuente
La definición está en un value.ppmanifiesto distribuido con el module-sysctlmódulo. Parece quedefine sysctl::value ( $key = 'name', $value ) {
ewwhite
@ewwhite Parece que el error al que te vinculaste podría aplicarse a tu situación. ¿Puede confirmar que el módulo se está cargando en su máquina de destino?
Jeff Ferland
¿Cómo puedo verificar la presencia del módulo?
ewwhite
Yendo con el enfoque de Augeas. Creo que encontré un error con la otra solución.
ewwhite
2

He usado este módulo en el pasado con RHEL5: puppet-sysctl

Para usarlo, deberá instalar el módulo en su carpeta de módulos (probablemente / etc / puppet / modules / sysctl) incluya la clase en su nodo: (incluya sysctl) y luego llame al recurso def de esta manera:

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

Entonces te estarás preguntando, ¿a dónde va realmente este código? Me gusta organizar mi árbol de marionetas así:

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

De esa manera, los módulos del sitio contienen datos de hiera, o sintonizables, y los módulos permanecen genéricos, conectables y "modulares".

robbyt
fuente
Sí, está vinculado en mi pregunta. No hay documentación para el módulo y no estoy seguro de dónde instalarlo o cómo usarlo realmente.
ewwhite
Lo siento, no leí toda tu pregunta :) El módulo incluye una definición, que debe llamarse en otra clase.
Editaré
Entonces con eso, los errores que recibo son: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
Parece que está llamando a una definición etiquetada 'sysctl :: value' y no 'sysctl :: set_value'.
robbyt
La definición está en un value.ppmanifiesto distribuido con el module-sysctlmódulo. Parece quedefine sysctl::value ( $key = 'name', $value ) {
ewwhite
0

Mientras no tenga que cambiar el valor (o esté satisfecho con agregar líneas con los nuevos valores), puede usar Common line . Puede usar un par de present/ absentconfiguraciones cuando cambia el valor.

Para cambiar el valor, suponiendo que la línea ya exista, puede usarlo replaceen el mismo módulo.

O bien, puede ver cómo se escriben estas definiciones para adaptarlas a su tarea, lo cual, en mi opinión, creo que es lo suficientemente simple y común como para que los tipos predeterminados de Puppet deberían haberlo proporcionado.

Entonces, ¿por qué no? Porque Puppet espera que administres completamente las cosas que estás administrando. Es decir, debe distribuir todo el archivo sysctl, en lugar de simplemente agregar o eliminar un valor u otro. No digo que sea necesariamente algo fácil de hacer, pero si puedes salirte con la tuya, esa es la forma más fácil de hacerlo.

Daniel C. Sobral
fuente
No creo que administrar el archivo completo sea escalable. Sabía que la opción de archivo completo era una posibilidad, pero use el caso de pequeños cambios dentro de una versión de RHEL ... Puede haber sysctl.confvalores predeterminados que cambien entre las versiones de RHEL. Es posible que no queramos ignorarlos / sobrescribirlos, en lugar de asegurarnos de que se pueda establecer / cambiar un parámetro específico.
ewwhite
@ewwhite ¿No tiene RHEL un archivo de anulación local sysctl.conf? ¿O quiere decir que tiene diferentes configuraciones según el lanzamiento? En el último caso, puede hacer una plantilla y seleccionar líneas según la versión del sistema operativo.
Daniel C. Sobral