厨师 – 如何计算节点特定值的属性?

假设我有一本configuration和安装一个神奇的deamon的食谱:

神奇-守护进程/食谱/ default.rb:

template "/etc/magical-deamon/magical.conf" do source "magical.conf" mode 0644 notifies :restart, resources(:service => "magical-deamon") end 

神奇-守护进程/属性/ default.rb:

 default['magical-deamon']['memory'] = 1024 

神奇-守护进程/模板/默认/ magical.conf.erb:

 memory = <%= node['magical-deamon']['memory'] %> 

正如我理解厨师,我会使用节点属性来设置内存值,如:

 { "normal": { "tags": [], "magical-deamon": { "memory": 256 } }, "name": "server.example.com", "chef_environment": "production", "run_list": [ "role[base]" ] } 

或者通过一个angular色:

 { "name": "base", "default_attributes": { "magical-deamon": { "memory": 756 } }, "json_class": "Chef::Role", "env_run_lists": { }, "run_list": [ ], "description": "base role applied to all nodes", "chef_type": "role", "override_attributes": { }, } } 

或者一个环境:

 { "name": "production", "default_attributes": { "magical-deamon": { "memory": 756 } }, "json_class": "Chef::Environment", "description": "", "cookbook_versions": { }, "override_attributes": { }, "chef_type": "environment" } 

到现在为止还挺好…

现在我有一个愚蠢的想法,设置“内存”节点特定的dynamic值。

让我们说我们的魔法deamon应该消耗节点拥有的总内存的75%。

 value = total_memory * 0.75 

从程序员的背景来看,我喜欢把这些知识留给食谱,因为我喜欢我的食谱可以被其他人重用。

我认为正确的地方应该是设置属性的地方。 但是在json或ruby dsl中做这样的计算是不可能的。

所以我的问题是:

  • 我的一般做法(价值= total_memory * 0.75)是一个愚蠢的想法?
  • 你将如何设置这种属性? 请记住:将会有多个值和一个节点:)可能有一些计算涉及MB – > KB和四舍五入等等。 将每个属性硬连线到配方,不应该是一个选项;)

我不那么热衷于total_memory的想法,这是一个间接的数量。 也许在任何神奇的守护进程的背景下更有意义。

对于像总内存这样的可调整属性,我可以做很多事情,就像你在问题中所做的那样,通过给attributes / default.rb添加一个合理的默认值(当有人忘记显式设置一个值时减less支持问题)环境,angular色或节点特定的值。

在ERB文件中可以这样做:

 memory = <%= (node['memory']['total'][0..-3].to_i / 1024) * node['magical-daemon']['memory'] %> 

Ohai提供免费(1)的统计数据,其中包括以kB为单位的总内存。 node ['memory'] ['total'] ='12312432kB'在我的工作站上。

我也尝试尽可能使用优先级最低的属性,即比普通属性更偏好默认值,而覆盖属性更偏向正常属性。 所以,

  • 尽可能select明智的配方默认
  • 使用默认的环境属性(在示例中使用override属性)
  • 为一组节点使用一个angular色属性(再次使用覆盖属性)
  • 最后是默认的节点属性

请参阅Chef wiki中的属性优先链接),以了解属性相互覆盖的顺序。

在可能的情况下使用最低优先级默认属性可以让您根据环境,angular色和节点设置属性值,但是当您需要做一些棘手的事情时,可以释放高优先级。