Puppet 定义资源-选择性参数化?

Puppet 定义资源-选择性参数化?

我目前正在绞尽脑汁寻找实现这种粒度的“最佳方法”:我有一个在测试环境中运行 memcached 的服务器,另一个在生产环境中运行的服务器。

这些服务器使用不同的 memcached 选项运行,我使用 monit 来监视它们并在需要时重新启动它们,monit 通过 puppet 进行管理,它通过 memcached.monitrc 监视 memcached,到目前为止非常简单。

我的问题是:我有一个名为“monit::monitor”的定义资源,它接收一个名称,获取该资源的模板,例如

monit::monitor { 'memcached': }

这是 monit::monitor 的代码:

define monit::monitor($template_params = {}) {
    file { "/etc/monit/monit.d/${name}.monitrc":
            ensure => present,
            content => template("monit/${name}.monitrc.erb"),
    }
}

这将在 modules/monit/templates 目录中查找“memached.monitrc.erb”并将其打印出来,但在该文件中,我需要参数化 memcached 的内存参数,如果它在测试环境中运行,则应该是 64m,如果在生产中运行,则应该是 3072m。

templates/memcached.monitrc.erb 看起来像这样

 check process memcached with pidfile /var/run/memcached0.pid
  start program = "/usr/bin/memcached -d -p 11211 -U 11211 -u memcached -m <%= template_params['memory'] %> -t 4 -c 1024 -P /var/run/memcached/memcached0.pid"
  stop program = "/bin/kill -9 `cat /var/run/memcached0.pid`; rm /var/run/memcached0.pid"
  if failed host 127.0.0.1 port 11211 then restart
  group cache

我现在使用的是 monit::monitor 支持模板参数的哈希,但这会混淆模板的使用,因此您需要查看模板以了解它应该接收哪些参数,我认为对此有更好的解决方案......

感谢您的关注,如果听起来有点混乱,请见谅:P

答案1

我对这类问题的解决方案是将所有魔法数字从我的傀儡清单中保留下来,并在需要时使用外部查找。我不需要将其用于模板,但它应该管用

所以在你的情况下我可能会

extlookup/production.example.com.csv

memcache_memory,3072米

extlookup/testing.example.com.csv

memcache_memory,64m

然后你的模板行将变为

启动程序 = “/usr/bin/memcached -d -p 11211 -U 11211 -u memcached -m <%= extlookup('memcache_memory') %> -t 4 -c 1024 -P /var/run/memcached/memcached0.pid”

并且该值将自动为每台机器设置正确的值。

我应该指出,一些木偶开发者思考在清单或模板中查找数据是一件坏事,您应该在节点中定义所有数据,并将其明确传递到需要通过参数化类和定义的地方。阅读该邮件列表主题后,我仍然认为 extlookup 是当今的最佳解决方案,但您可能需要阅读它并自行决定。

答案2

据我所知,模板的一个根本缺点是需要参考它们才能知道它们需要哪些参数。我自己确保模块文档清楚地说明了模板需要哪些变量,并且模板本身可以包含具有相同信息的注释部分。

答案3

好吧,我不会对参数进行哈希处理,我只会直接执行参数,如下所示:

define monit::monitor($memory = "64m") {
  # ...
}

你甚至可以这样做:

define monit::monitor::testing($memory = "64m") {
  # ...
}

为每个定义创建几个不同的定义,并使用相同的模板文件。这样,定义就用名称标记(monit::monitor::testing、monit::monitor::prod 等),参数也在定义中。让他们调用一个主要定义,也许,使用为其正常默认值指定的所有值,或类似的东西。

我认为这样可能会更清楚。

相关内容