使用Puppet设置sysctl.conf参数


10

CFEngine中这是一件轻而易举的 ……但是我现在在Puppet环境中,需要能够分配/确保/检查某些sysctl.conf变量。在CFEngine的世界中,我可以简单地检查配置文件中的特定行... 在Puppet Wiki上找到了对sysctl模块的小引用,在github中的一个项目看来可以满足我的要求。

但是,两者都没有得到很好的记录。我只是在寻找一种方法来编辑一些值,例如net.core.rmem_defaultnet.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和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";
  }
}

太好了 您是否考虑过将其编写为在puppet forge上发布的模块?
TomOnTime 2013年

Answers:


14

具体的答案:立即来说,您正在调用sysctl :: value,但在sysctl类中未声明value。请参见使用sysctl :: conf声明的此示例。没有define value,没有sysctl :: value子类供您调用。


通用答案和指导:作为Puppet当前版本的一部分的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

@ewwhite您似乎链接到的错误可能适用于您的情况。您可以确认该模块正在目标计算机上加载吗?
杰夫·弗兰

如何检查模块的存在?
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

这样,站点模块将包含层数据或可调参数,并且模块保持通用,可插入和“模块化”。


是的,它与我的问题有关。没有有关该模块的文档,我不确定在哪里安装或如何实际使用它。
ewwhite

抱歉,我没有阅读您的全部问题:)该模块包含一个定义,需要在另一个类中调用它。我将编辑答案并包括代码...
robbyt'2

因此,我收到的错误是: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 :: value”而不是“ sysctl :: set_value”的定义。
罗比

定义位于value.ppmodule-sysctl模块一起分发的清单中。看起来像define sysctl::value ( $key = 'name', $value ) {
ewwhite

0

只要您不必更改该值(或对新值附加行感到满意),就可以使用Common line。更改值时,可以使用一对present/ absent配置。

要更改该值(假设该行已存在),可以replace在同一模块中使用。

或者,您可以看看如何编写这些定义以使其适合您的任务-记住,我确实认为这很简单且通用,应该由默认类型的Puppet提供。

那么,为什么不呢?因为Puppet希望您完全管理要管理的事情。也就是说,您应该分发整个 sysctl文件,而不仅仅是添加或删除一个或另一个值。我并不是说这一定是一件容易的事,但是如果您可以摆脱它,那将是最简单的方法。


我认为管理整个文件不是可伸缩的。我知道可以使用整个文件选项,但是要使用RHEL发行版中的少量更改的情况...在sysctl.confRHEL的各个版本之间可能会有默认更改。我们可能不想忽略/覆盖这些内容,而不是确保可以设置/更改特定的参数。
ewwhite

@ewwhite RHEL没有本地替代文件sysctl.conf吗?还是你的意思,你有不同的配置根据发行?在后一种情况下,您可以制作一个模板并根据操作系统版本选择行。
Daniel C. Sobral
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.