Puppetでsysctl.confパラメータを設定します


10

これはCFEngineで簡単にできました...しかし、今はPuppet環境にいるので、特定のsysctl.conf変数を割り当て/確認/確認できるようにする必要があります。CFEngineの世界では、構成ファイル内の特定の行を簡単にチェックできます... Puppet wikiのsysctlモジュールへの小さな参照と、githubのプロジェクトで、私がやりたいことをしているように見えます。

しかし、どちらも実際には十分に文書化されていません。私は単にのような値のカップルを編集する方法を探していますnet.core.rmem_defaultnet.core.wmem_maxgithubホストされているプロジェクトの形式では、私の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";
        }
}

フォーラムやメーリングリストを見ると、Puppetプラグインとモジュールの違いに混乱があるようです。用語はほとんど同じ意味で使用されています...結局、毛深いエラーを乗り越えるために、クライアントで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 2013

回答:


14

具体的な回答:すぐに言えば、sysctl :: valueを呼び出していますが、sysctlクラスでvalueが宣言されていません。sysctl :: conf宣言を使用するこの例を参照してください。がなければ、define value呼び出すsysctl :: valueサブクラスはありません。


一般的な答えと指導:Augeasの構築物(また、その参照型のリファレンスドキュメントを)人形の現在のバージョンの一部であり、それは、このようなgitの設定などのファイルを管理できるように、設定ファイルとさえ点コンテキストでラインを維持することができます。以下の例は、機能を示すためと、Puppet構成の優れたリファレンスコレクション(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

上記の構成ドキュメントの簡単な例は次のとおりです。

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.ppmodule-sysctlモジュールとともに配布されるマニフェストにあります。それは次のようになりますdefine sysctl::value ( $key = 'name', $value ) {
ewwhite 2012

@ewwhiteリンクしたバグが状況に当てはまる可能性があるようです。モジュールがターゲットマシンにロードされていることを確認できますか?
ジェフファーランド

モジュールの存在を確認するにはどうすればよいですか?
ewwhite 2012

Augeasアプローチを使用します。私は他の解決策でバグにぶつかったと思います。
ewwhite 2012

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

このようにして、site-modulesにはhieraデータまたは調整可能パラメータが含まれ、モジュールは汎用的、プラグ可能、および「モジュール式」のままです。


はい、それは私の質問にリンクされています。モジュールのドキュメントはなく、どこにインストールするか、実際にどのように使用するかわかりません。
ewwhite 2012

申し訳ありませんが、質問全体を読んでいません:)モジュールには、別のクラスで呼び出す必要がある定義が含まれています。私は自分の回答を編集してコードを含めます...
robbyt

だからと、私は受信エラーがあります: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.ppmodule-sysctlモジュールとともに配布されるマニフェストにあります。それは次のようになりますdefine sysctl::value ( $key = 'name', $value ) {
ewwhite 2012

0

値を変更する必要がない(または行に新しい値を追加することに満足している)限り、Common を使用できますline。値を変更する場合は、present/ absent構成のペアを使用できます。

値を変更するには-その行が既に存在すると仮定して- replace同じモジュールで使用できます。

または、これらの定義がどのように作成されてタスクに適したものになるかを確認することもできます。

それで、なぜそうではないのですか?Puppetは、管理しているものを完全に管理することを期待しているからです。つまり、単に値を追加または削除するのではなく、sysctlファイル全体を配布する必要があります。それが必ずしも簡単なことだと言っているわけではありませんが、それをうまくやることができれば、それが最も簡単な方法です。


ファイル全体の管理はスケーラブルではないと思います。ファイル全体のオプションが可能であることがわかっていましたが、RHELリリース内の小さな変更のケースを使用してください... sysctl.confRHELのバージョン間でデフォルトが変更される場合があります。特定のパラメータを設定/変更できるようにするのではなく、それらを無視/上書きしたくない場合があります。
ewwhite 2012

@ewwhite RHELにはローカルオーバーライドファイルがありsysctl.confませんか?それとも、リリースによって構成が異なるということですか?後者の場合、OSのバージョンに応じてテンプレートを作成し、行を選択できます。
ダニエルC.ソブラル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.