これは CFEngine ...で簡単にできましたが、私は Puppet環境 にいるので、特定のsysctl.conf変数を割り当て/確認/確認できるようにする必要があります。 CFEngineの世界では、構成ファイル内の特定の行を簡単に確認できます... Puppet wikiで sysctl module への小さな参照とgithubの projectを見つけました それは私がしたいことをするように見えます。
しかし、どちらも実際には十分に文書化されていません。私は単にnet.core.rmem_default
や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";
}
}
フォーラムやメーリングリストを通過すると、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
最小限の痛みでこれを達成する方法についての考えはありますか?
編集: このバグ の影響を受けますか?
編集:ジェフファーランドおよび 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クラスで値が宣言されていません。 sysctl :: conf宣言を使用する この例 を参照してください。 define value
がないと、呼び出すsysctl :: valueサブクラスはありません。
一般的な回答とガイダンス:Augeas 構成(その 型参照ドキュメント も参照) Puppetの現在のバージョンの一部では、構成ファイルの行を維持し、コンテキストを尊重することもできるため、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クラスの構成が含まれているため、いくつかの光を当てることもできます。
私は過去に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データまたは調整可能パラメータが含まれ、モジュールは汎用的、プラグ可能、および「モジュール式」のままです。
値をchangeする必要がない(または新しい値で行を追加することに満足している)限り、 Common'sline
。値を変更するときは、present
/absent
構成のペアを使用できます。
値を変更するには-その行がすでに存在すると仮定して-同じモジュールでreplace
を使用できます。
または、これらの定義をどのように記述してタスクに適合させるかを確認することもできます。これは、デフォルトのタイプのPuppetで提供されるべきであるほど単純で一般的だと思います。
それで、なぜそうではないのですか? Puppetは、管理しているものを完全に管理することを期待しているからです。つまり、ある値または別の値を単に追加または削除するのではなく、wholesysctlファイルを配布する必要があります。それが必ずしも簡単なことだとは言っていませんが、それでうまくいけば、それが最も簡単な方法です。