在角色中使用节点值

时间:2013-11-21 09:31:11

标签: chef

我有一个角色,我需要使用特定于该节点的值:

default_attributes "varnish" => {
  "listen_address" => node['ipaddress'],
  "listen_port" => "80",
  # ...
}

然而,这可能是:NameError: undefined local variable or method node'for role [caching_server]:Chef :: Role`。

厨师 - 客户评估“角色”吗?我是否需要以稍微不同的方式访问此变量?或者是否应该在角色之外定义此属性?

1 个答案:

答案 0 :(得分:4)

角色是静态的,并在上传时评估。

这就是为什么角色被视为邪恶:全局,静态的东西,你不能对它们进行版本化。

社区现在遵循Berkshelf方式(http://www.slideshare.net/opscode/the-berkshelf-way-20882903http://www.youtube.com/watch?v=hYt0E84kYUI)。

其中一个原则是将逻辑从您的角色推向配方,您可以更好地控制节点的配置方式。

  1. 您构建应用程序食谱,例如myface
  2. 创建以您的角色命名的食谱:app_proxy.rb。那是你的整合方法。
  3. 覆盖所有需要的属性(就像你在角色中所做的那样): node.override ['varnish'] ['listen_address'] = node ['ipaddress'] node.override ['varnish'] ['listen_port'] =“80” ...
  4. 将run_list从角色移至该食谱