Puppet을 사용하여 sysctl.conf 매개 변수 설정


10

이것은 CFEngine 에서 산들 바람이되었습니다 ...하지만 지금 은 꼭두각시 환경 에 있으며 특정 sysctl.conf 변수를 할당 / 보장 / 확인할 수 있어야합니다. CFEngine 세계에서는 구성 파일 내에서 특정 행을 간단히 확인할 수 있습니다 ... Puppet Wiki 의 sysctl 모듈github프로젝트에 대한 작은 참조를 찾았습니다 .

그러나 실제로는 잘 문서화되어 있지 않습니다. 나는 단순히 net.core.rmem_defaultand와 같은 몇 가지 값을 편집하는 방법을 찾고 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";
  }
}

이것은 우수하다. 꼭두각시 포지에 게시 된 모듈로 작성해 보셨습니까?
TomOnTime

답변:


14

특정 답변 : 즉시 말하면, 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을 클래스의 구조를 가지고있다.


정의는 모듈 value.pp과 함께 배포 된 매니페스트에 module-sysctl있습니다. 그것은 같이 보인다define sysctl::value ( $key = 'name', $value ) {
ewwhite

@ewwhite 연결된 버그가 상황에 적용될 수있는 것 같습니다. 대상 머신에 모듈이로드되고 있는지 확인할 수 있습니까?
Jeff Ferland

모듈의 존재 여부를 어떻게 확인할 수 있습니까?
ewwhite

Augeas 접근 방식으로 가기. 다른 솔루션으로 버그가 발생했다고 생각합니다.
ewwhite

2

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 데이터 또는 튜너 블이 포함되며 모듈은 일반적이고 플러그 가능하며 "모듈 식"으로 유지됩니다.


예, 그것은 내 질문에 연결되어 있습니다. 모듈에 대한 설명서가 없으며 설치 위치 또는 실제로 사용하는 방법을 모르겠습니다.
ewwhite

죄송합니다. 전체 질문을 읽지 못했습니다 :) 모듈에 정의가 포함되어 있으며 다른 클래스에서 호출해야합니다. 답변을 수정하고 코드를 포함
하겠습니다

따라서 내가받는 오류는 다음과 같습니다.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

'sysctl :: set_value'가 아닌 'sysctl :: value'라는 레이블이 붙은 정의를 호출하는 것 같습니다.
robbyt

정의는 모듈 value.pp과 함께 배포 된 매니페스트에 module-sysctl있습니다. 그것은 같이 보인다define sysctl::value ( $key = 'name', $value ) {
ewwhite

0

값 을 변경할 필요가없는 한 (또는 새 값으로 줄을 추가하는 것이 만족 스럽다면) Common 을 사용할 수 있습니다 line. 값을 변경할 때 한 쌍의 present/ absent구성을 사용할 수 있습니다.

행이 이미 있다고 가정하고 값을 변경하려면 replace동일한 모듈에서 사용할 수 있습니다 .

또는 이러한 정의가 작업에 적합하도록 작성되는 방법을 볼 수 있습니다. 기본 유형 Puppet에서 제공했을 정도로 간단하고 일반적이라고 생각합니다.

그렇다면 왜 그렇지 않습니까? Puppet은 관리중인 항목을 완전히 관리하기를 기대하기 때문입니다. 즉, 하나의 값만 추가하거나 제거하는 대신 전체 sysctl 파일을 배포해야합니다 . 나는 그것이 반드시 쉬운 일이라고 말하지는 않지만, 그것을 피할 수 있다면 가장 쉬운 방법입니다.


전체 파일 관리가 확장 가능하다고 생각하지 않습니다. 전체 파일 옵션이 가능하다는 것을 알았지 만 RHEL 릴리스 내에서 약간의 변경이있는 경우를 사용하십시오 sysctl.conf. RHEL 버전 간에는 기본값이 변경 될 수 있습니다 . 특정 매개 변수를 설정 / 변경할 수있는 것보다는 무시하거나 덮어 쓰고 싶지 않을 수 있습니다.
ewwhite

@ewwhite RHEL에 대한 로컬 재정의 파일이 sysctl.conf없습니까? 아니면 릴리스에 따라 다른 구성 가지고 있습니까? 후자의 경우 템플릿을 만들고 OS 버전에 따라 선을 선택할 수 있습니다.
Daniel C. Sobral
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.