这很容易CF引擎...但我处于Puppet 环境现在,需要能够分配/确保/检查某些 sysctl.conf 变量。在 CFEngine 世界中,我可以简单地检查配置文件中的特定行...我找到了一个小参考sysctl 模块在 Puppet wiki 上以及github 上的项目这似乎做了我想要的事情。
但两者都没有很好的记录。我只是在寻找一种方法来编辑几个值,如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
关于如何以最少的痛苦实现这一目标,您有什么想法吗?
编辑:我是否受到影响这个错误?
编辑:使用 Jeff Ferland 建议的 Augeas 库进行了修复,并Puppet 维基。
我创建了一个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";
}
}
答案1
具体答案:直接说,你正在调用 sysctl::value,但 value 未在你的 sysctl 类中声明。请参阅这个例子使用 sysctl::conf 声明。如果没有define value
,就没有 sysctl::value 子类供您调用。
一般答案和指导:这奥杰阿斯构造(另见其类型参考文档) 是 Puppet 当前版本的一部分,它允许维护配置文件中的行,甚至尊重上下文,因此它可以管理诸如 git 配置之类的文件。下面的示例既是为了演示功能,也是为了向您指出 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 类的构造,与您在问题中发布的内容类似,因此也可能提供一些启示。
答案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
这样,站点模块就包含层次数据或可调参数,并且模块保持通用、可插入和“模块化”。
答案3
只要你不必改变值(或者满足于添加包含新值的行),您可以使用普通的 line
。更改值时可以使用一对present
/配置。absent
要更改值——假设该行已经存在——您可以replace
在同一个模块中使用。
或者您可以看看这些定义是如何编写的,以使其适合您的任务 - 请注意,我确实认为它足够简单和常见,以至于它应该由 Puppet 的默认类型提供。
那么,为什么不呢?因为 Puppet 希望你完全管理你所管理的东西。也就是说,你应该分发所有的sysctl 文件,而不是仅仅添加或删除一个值或另一个值。我并不是说这一定是一件容易的事,但如果你能做到这一点,那就是最简单的方法。