이것은 CFEngine 에서 산들 바람이되었습니다 …하지만 지금 은 꼭두각시 환경 에 있으며 특정 sysctl.conf 변수를 할당 / 보장 / 확인할 수 있어야합니다. CFEngine 세계에서는 구성 파일 내에서 특정 행을 간단히 확인할 수 있습니다 … Puppet Wiki 의 sysctl 모듈 과 github 의 프로젝트에 대한 작은 참조를 찾았습니다 .
그러나 실제로는 잘 문서화되어 있지 않습니다. 나는 단순히 net.core.rmem_default
and와 같은 몇 가지 값을 편집하는 방법을 찾고 net.core.wmem_max
있습니다. github 에서 호스팅 되는 프로젝트 형식 에서 init.pp 매니페스트의 구성은 다음과 같아야합니다.
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";
}
}
포럼과 메일 링리스트를 살펴보면 꼭두각시 플러그인과 모듈의 차이점에 대해 혼란스러워하는 것 같습니다. 용어는 거의 상호 교환 적으로 사용됩니다 … 나는 머리카락이 많은 오류를 피하기 위해 클라이언트에서 pluginsync를 활성화해야했습니다. 나는 이것이 모듈이라고 생각했다!
현재 클라이언트 오류 :
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
최소한의 고통으로 이것을 달성하는 방법에 대한 생각이 있습니까?
편집 : 이 버그의 영향을 받 습니까?
편집 : Jeff Ferland와 Puppet wiki 에서 제안한 Augeas 라이브러리를 사용하여 수정되었습니다 .
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"],
}
}
… 및 관련 설정을 설정하는 다른 모듈 …
class prod_sysctl {
include sysctl
sysctl::conf {
# increase PID rollover value
"kernel.pid_max": value => "1048576";
}
}
답변
특정 답변 : 즉시 말하면, sysctl :: value를 호출하지만 sysctl 클래스에서 value가 선언되지 않습니다. sysctl :: conf 선언을 사용하는 이 예제 를 참조하십시오 . 이 없으면 define value
호출 할 sysctl :: value 서브 클래스가 없습니다.
일반적인 대답과 지침 : Augeas의 구조 (또한 참조 형의 참조 문서를 이 같은 자식 구성으로 파일을 관리 할 수 있습니다) 인형의 현재 버전의 일부 구성 파일, 심지어면 맥락에서 선을 유지 허용한다. 아래 예제는 기능을 보여주고 Wikipedia 서버의 라이브 구성 저장소 인 Puppet 구성의 훌륭한 참조 모음을 보여줍니다.
[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
위의 구성 문서에서 하나의 간단한 예는 다음과 같습니다.
augeas { "sshd_config":
context => "/files/etc/ssh/sshd_config",
changes => [
"set PermitRootLogin no",
],
}
따라서 /etc/sysctl.conf를 관리하려면 다음을 입력하십시오.
augeas { "sysctl":
context => "/files/etc/sysctl.conf",
changes => [
"set kernel.sysrq = 0",
#and whatever other lines are interesting to you
],
}
Augeas의 예는 그 또한 도움이 되거 수 있도록 또한, 당신이 당신의 질문에 게시 된 것과 유사하다 Augeus에 따라 sysctl을 클래스의 구조를 가지고있다.
답변
RHEL5에서 과거에이 모듈을 사용했습니다 :
puppet-sysctl
이를 사용하려면 모듈을 모듈 폴더에 설치하고 (아마도 / etc / puppet / modules / sysctl) 노드에 클래스를 포함시키고 (sysctl 포함) 다음과 같이 def 리소스를 호출해야합니다.
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 }
}
이 코드가 실제로 어디로 가는지 궁금 할 것입니다. 꼭두각시 트리를 다음과 같이 구성하고 싶습니다.
site.pp -> nodes.pp -> roles.pp -> /etc/puppet/site-modules/s_sysctl -> /etc/puppet/modules/sysctl
따라서 사이트 모듈에는 hiera 데이터 또는 튜너 블이 포함되며 모듈은 일반적이고 플러그 가능하며 “모듈 식”으로 유지됩니다.
답변
값 을 변경할 필요가없는 한 (또는 새 값으로 줄을 추가하는 것이 만족 스럽다면) Common 을 사용할 수 있습니다 line
. 값을 변경할 때 한 쌍의 present
/ absent
구성을 사용할 수 있습니다.
행이 이미 있다고 가정하고 값을 변경하려면 replace
동일한 모듈에서 사용할 수 있습니다 .
또는 이러한 정의가 작업에 적합하도록 작성되는 방법을 볼 수 있습니다. 기본 유형 Puppet에서 제공했을 정도로 간단하고 일반적이라고 생각합니다.
그렇다면 왜 그렇지 않습니까? Puppet은 관리중인 항목을 완전히 관리하기를 기대하기 때문입니다. 즉, 하나의 값만 추가하거나 제거하는 대신 전체 sysctl 파일을 배포해야합니다 . 나는 그것이 반드시 쉬운 일이라고 말하지는 않지만, 그것을 피할 수 있다면 가장 쉬운 방법입니다.