Defina os parâmetros sysctl.conf com o Puppet

10

Foi uma brisa no CFEngine ... Mas agora estou em um ambiente Puppet e preciso atribuir / garantir / verificar determinadas variáveis ​​sysctl.conf. No mundo do CFEngine, eu poderia simplesmente procurar linhas específicas dentro de um arquivo de configuração ... Encontrei uma pequena referência a um módulo sysctl no wiki do Puppet e um projeto no github que parece fazer o que eu quero.

Mas nenhum deles está realmente bem documentado. Estou simplesmente procurando uma maneira de editar alguns valores como net.core.rmem_defaulte net.core.wmem_max. No formato do projeto hospedado no github , a configuração no meu manifesto init.pp deve se parecer com:

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 por fóruns e listas de discussão, parece haver confusão sobre a diferença entre os plugins e módulos do Puppet. Os termos são quase usados ​​de forma intercambiável ... Acabei precisando ativar o pluginsync em meus clientes para superar alguns erros cabeludos. Eu pensei que este era um módulo!

Os erros atuais do 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

Alguma idéia de como fazer isso com o mínimo de dor?

Edit: Sou afetado por esse bug ?

Edit: Corrigido usando a biblioteca Augeas como sugerido por Jeff Ferland e do wiki Puppet .

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

}

... e outro módulo para definir as configurações relevantes ...

class prod_sysctl {

include sysctl

sysctl::conf {

  # increase PID rollover value
  "kernel.pid_max": value =>  "1048576";
  }
}
ewwhite
fonte
Isto e excelente. Você já pensou em escrever isso como um módulo publicado no Puppet Forge?
TomOnTime 5/08/13

Respostas:

14

Resposta específica: Imediatamente falando, você está chamando sysctl :: value, mas o valor não é declarado na sua classe sysctl. Veja este exemplo que usa uma declaração sysctl :: conf. Sem o define value, não há subclasse sysctl :: value para você chamar.


Resposta e orientação geral: A construção Augeas (consulte também a documentação de referência de tipo ) que faz parte das versões atuais do Puppet permite manter linhas em um arquivo de configuração e até respeita o contexto, para que ele possa gerenciar arquivos como uma configuração git. O exemplo abaixo é para demonstrar a funcionalidade e apontar para uma ótima coleção de referências das configurações do Puppet - o armazenamento de configuração ao vivo para servidores da 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

Um exemplo simples da documentação de configuração acima seria este:

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

Portanto, se você deseja gerenciar o seu /etc/sysctl.conf, digite o seguinte:

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

O exemplo do Augeas também tem uma construção para uma classe sysctl baseada no Augeus que é semelhante ao que você postou na sua pergunta, portanto, isso também pode esclarecer algumas coisas.

Jeff Ferland
fonte
A definição está em um value.ppmanifesto distribuído com o module-sysctlmódulo. Parecedefine sysctl::value ( $key = 'name', $value ) {
ewwhite
@ewwhite Parece que o bug ao qual você vinculou pode se aplicar à sua situação. Você pode confirmar que o módulo está carregando na sua máquina de destino?
21412 Jeff Ferland
Como posso verificar a presença do módulo?
ewwhite
Indo com a abordagem Augeas. Acho que atingi um bug com a outra solução.
ewwhite
2

Eu usei este módulo no RHEL5: puppet-sysctl

Para usá-lo, você precisará instalar o módulo na pasta de módulos (provavelmente / etc / puppet / modules / sysctl) inclua a classe no seu nó: (inclua sysctl) e chame o recurso def da seguinte forma:

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

Então você deve estar se perguntando: para onde esse código realmente vai? Eu gosto de organizar minha árvore de bonecos assim:

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

Dessa forma, os módulos do site contêm dados hiera, ou ajustáveis, e os módulos permanecem genéricos, plugáveis ​​e "modulares".

Robbyt
fonte
Sim, está vinculado na minha pergunta. Não há documentação para o módulo e não sei onde instalá-lo ou como usá-lo.
ewwhite
Desculpe, não li toda a sua pergunta :) O módulo inclui uma definição, que precisa ser chamada em outra classe. Vou editar a minha resposta e incluir o código ... #
3100 robbyt
Então, com isso, os erros que recebo são: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 você está chamando uma definição denominada 'sysctl :: value' e não 'sysctl :: set_value'.
robbyt
A definição está em um value.ppmanifesto distribuído com o module-sysctlmódulo. Parecedefine sysctl::value ( $key = 'name', $value ) {
ewwhite
0

Contanto que você não precise alterar o valor (ou esteja satisfeito com o acréscimo de linhas com os novos valores), você poderá usar o Common line . Você pode usar um par de present/ absentconfigurações quando alterar o valor.

Para alterar o valor - assumindo que a linha já exista -, você pode usar replaceno mesmo módulo.

Ou você pode ver como essas definições são escritas para adequá-las à sua tarefa - que, em sua opinião, acho que é simples e comum o suficiente para que ela fosse fornecida pelos tipos padrão de Puppet.

Então, por que não? Porque o Puppet espera que você gerencie completamente o que está gerenciando. Ou seja, você deve distribuir o arquivo sysctl inteiro , em vez de apenas adicionar ou remover um valor ou outro. Não estou dizendo que isso é necessariamente uma coisa fácil de fazer, mas se você puder se safar, é a maneira mais fácil de fazê-lo.

Daniel C. Sobral
fonte
Eu não acho que gerenciar o arquivo inteiro seja escalável. Eu sabia que a opção de arquivo inteiro era uma possibilidade, mas use o caso de pequenas alterações em uma versão do RHEL ... Pode haver sysctl.confpadrões que mudam entre as versões do RHEL. Podemos não querer ignorá-los / substituí-los, em vez de garantir que um parâmetro específico possa ser definido / alterado.
ewwhite
@ewwhite O RHEL não possui um arquivo de substituição local sysctl.conf? Ou você quer dizer que tem configurações diferentes de acordo com o lançamento? Neste último caso, você pode criar um modelo e selecionar linhas, dependendo da versão do sistema operacional.
Daniel C. Sobral