2014-01-30 48 views
0

我对厨师角色的理解是,在角色中,所有内容都是静态的,因为角色内容被加载并解析为json。不会进行替换等。 但是,可以是json或rb文件的环境内容呢?环境 - 使用对其他属性的引用在override_attributes中分配属性

问题的原因是因为我希望能够通过在第二个配方中引用它们来重用一个配方中指定的环境文件中的值。

为了更好地解释我的问题,想象下面的代码中,两个第一个配方http_service和mysql_service“拥有”它们的值名称,ip和端口。 在监视器配方中,可以声明多个监视器端点。但配方不知道实际的食谱 - http_service和mysql_service在这里 - 它只需要名称,IP和端口。 这是我想避免在分配监视器中的值时重复ip,也没有监视器配方知道其他配方 - 在这种情况下它需要保持通用。 我知道使用的语法是错误的,但我希望它传达的意图。 这可以以某种方式完成吗? 我更喜欢“声明一次,引用其他地方”的想法。 :)

"override_attributes": { 

"http_service":{ 
     "name": "Service_1", 
     "ip": "10.10.10.1", 
     "port": "8080" 

    }, 
    "mysql_service":{ 
     "name": "Service_2", 
     "ip": "10.10.10.2", 
     "port": "3306" 
    }, 
    "monitor":{ 
     "monitor_endpoints": 
      [ 
         { 
         "servicename": node[:http_service][:name], 
         "ip": node[:http_service][:ip], 
         "port": node[:http_service][:port] 
         }, 
         { 
         "servicename": node[:mysql_service][:name], 
         "ip": node[:mysql_service][:ip], 
         "port": node[:mysql_service][:port] 
         } 
       ] 
    } 
} 
+1

为什么要在配方中使用'node [:xenserver] [:ip]',如果您可以轻松使用'node [:infrastructure] [:network] [:gateway]'而不引入任何新的属性/变量? –

回答

0

您不能在JSON环境中执行此操作。你可以在配方中做到这一点:

node.override['xenserver']['ip'] = node['infrastructure']['network']['gateway'] 

但请记住,如果感觉不对,它可能是错误的。

+0

即使我已经更新了示例,我猜你的答案将是相同的:在JSON中不可能。但是如果它是在Ruby中完成的呢?无论是json还是ruby,该环境文件都以相同的方式进行解析? – Henrik

+0

如果环境是Ruby,它将无法正常工作。你的环境应该只是数据,所以JSON比Ruby好,imo – sethvargo

+0

好的。感谢你的回答。我猜重复是当时的路要走。这真是一种遗憾,因为我发现在env文件中引用的功能非常强大。 – Henrik

相关问题