使用 Puppet 设置 sysctl.conf 参数

使用 Puppet 设置 sysctl.conf 参数

这很容易CF引擎...但我处于Puppet 环境现在,需要能够分配/确保/检查某些 sysctl.conf 变量。在 CFEngine 世界中,我可以简单地检查配置文件中的特定行...我找到了一个小参考sysctl 模块在 Puppet wiki 上以及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 建议的 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 文件,而不是仅仅添加或删除一个值或另一个值。我并不是说这一定是一件容易的事,但如果你能做到这一点,那就是最简单的方法。

相关内容