2014-01-30 42 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

相關問題