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_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 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 sysctl
mó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";
}
}
fonte
Respostas:
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.
Um exemplo simples da documentação de configuração acima seria este:
Portanto, se você deseja gerenciar o seu /etc/sysctl.conf, digite o seguinte:
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.
fonte
value.pp
manifesto distribuído com omodule-sysctl
módulo. Parecedefine sysctl::value ( $key = 'name', $value ) {
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:
Então você deve estar se perguntando: para onde esse código realmente vai? Eu gosto de organizar minha árvore de bonecos assim:
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".
fonte
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
value.pp
manifesto distribuído com omodule-sysctl
módulo. Parecedefine sysctl::value ( $key = 'name', $value ) {
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 depresent
/absent
configurações quando alterar o valor.Para alterar o valor - assumindo 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 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.
fonte
sysctl.conf
padrõ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.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.