假设我有一本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的想法,这是一个间接的数量。 也许在任何神奇的守护进程的背景下更有意义。
对于像总内存这样的可调整属性,我可以做很多事情,就像你在问题中所做的那样,通过给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'在我的工作站上。
我也尝试尽可能使用优先级最低的属性,即比普通属性更偏好默认值,而覆盖属性更偏向正常属性。 所以,
请参阅Chef wiki中的属性优先链接),以了解属性相互覆盖的顺序。
在可能的情况下使用最低优先级默认属性可以让您根据环境,angular色和节点设置属性值,但是当您需要做一些棘手的事情时,可以释放高优先级。