傀儡定义的资源 – select性参数化?

我目前正在试图find实现这种傀儡粒度的“最佳方法”:我有一台在testing环境中运行memcached的服务器,另一台运行在生产环境中的服务器。

这些服务器使用不同的memcached选项运行,我使用monit监视并在需要时重新启动它们,monit通过puppetpipe理,它通过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参数化内存参数,如果它在testing环境中运行,应该是64m,if生产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支持模板参数的散列,但混淆了模板的使用,所以你需要看看模板,看看它应该接收哪些参数,我认为这是一个更好的解决scheme…

感谢您的关注和抱歉,如果听起来很困惑:P

我解决这类问题的方法是将所有的魔法数字从我的木偶清单中取出,并在需要时使用extlookup查找它们。 我不需要在模板中使用它,但它应该工作 。

所以在你的情况下,我可能有

extlookup / production.example.com.csv

memcache_memory,3072米

extlookup / testing.example.com.csv

memcache_memory,64M

那么你的模板行就会变成

start program =“/ 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是今天的优秀解决scheme,但是您可能需要阅读并自行决定。

据我所知,这是模板的根本弱点,需要引用它们来了解它们需要的参数。 我自己,我确保模块文档明确了模板需要什么variables,而模板本身可以包含具有相同信息的注释部分。

那么,我不会有一个散列的参数,我只是直接做参数,如下所示:

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

你甚至可以这样做:

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

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

我想这可能会更清楚。