Puppet을 사용하여 sysctl.conf 매개 변수 설정 “net.core.rmem_default”: value

이것은 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";
  }
}



답변

특정 답변 : 즉시 말하면, 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 파일을 배포해야합니다 . 나는 그것이 반드시 쉬운 일이라고 말하지는 않지만, 그것을 피할 수 있다면 가장 쉬운 방법입니다.


답변