Defina os parâmetros do sysctl.conf com o Puppet

10

Essa foi uma brisa no CFEngine ... Mas estou em um Ambiente Puppet agora, e precisa ser capaz de atribuir / garantir / verificar certas variáveis sysctl.conf. No mundo CFEngine, eu poderia simplesmente verificar linhas específicas dentro de um arquivo de configuração ... Eu 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 também não estão bem documentados. Estou apenas procurando uma maneira de editar alguns valores como net.core.rmem_default e 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 habilitar pluginsync em meus clientes para passar por alguns erros. Eu pensei que isso fosse 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 conseguir isso com o mínimo de dor?

Editar: Sou afetado por este bug ?

Editar: Corrigido usando a biblioteca Augeas conforme sugerido por Jeff Ferland e do wiki de marionetes .

Eu criei um módulo sysctl ...

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";
  }
}
    
por ewwhite 20.02.2012 / 17:00

3 respostas

13

Resposta específica: Imediatamente falando, você está chamando sysctl :: value, mas o valor não é declarado em 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 geral e orientação: A construção Augeas (veja também A documentação de referência do tipo ), que faz parte das versões atuais do Puppet, permite manter linhas em um arquivo de configuração e respeita mesmo o contexto, para que ele possa gerenciar arquivos como uma configuração do git. O exemplo abaixo serve tanto para demonstrar a funcionalidade quanto para indicar uma grande coleção de referência de 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 o seguinte:

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

Então, se você quiser gerenciar 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 um constructo para uma classe sysctl baseada no Augeus que é semelhante ao que você postou em sua pergunta, para que também possa lançar alguma luz.

    
por 20.02.2012 / 17:24
2

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

Para usá-lo, você terá que instalar o módulo na sua pasta de módulos (provavelmente / etc / puppet / modules / sysctl) incluir a classe em seu nó: (include sysctl) e então chamar o recurso def assim:

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ê pode estar se perguntando: para onde vai esse código? Eu gosto de organizar minha árvore de fantoches assim:

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

Dessa forma, o site-modules contém dados hiera, ou tunables, e os módulos permanecem genéricos, plugáveis e "modulares".

    
por 20.02.2012 / 17:48
0

Contanto que você não tenha que alterar o valor (ou esteja satisfeito com as linhas anexadas aos novos valores), você pode usar Comum line . Você pode usar um par de configurações present / absent quando alterar o valor.

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

Ou você pode ver como essas definições são escritas para torná-las adequadas à sua tarefa - o que, lembre-se, acho simples e comum o suficiente para que ela tenha sido fornecida pelos tipos padrão de Puppet.

Então, por que não? Porque o Puppet espera que você gerencie completamente as coisas que você está gerenciando. Ou seja, você deve distribuir o arquivo sysctl inteiro , em vez de apenas adicionar ou remover um valor ou outro. Eu não estou dizendo que é necessariamente uma coisa fácil de fazer, mas se você pode se dar bem com isso, você é a maneira mais fácil de fazer isso.

    
por 21.02.2012 / 15:56