环境 - 使用对其他属性的引用在override_attributes中分配属性

时间:2014-01-30 10:20:45

标签: chef

我对chef角色的理解是,在角色中,一切都是静态的,因为角色内容被加载并解析为json。不会发生替代等。 但是环境的内容可以是json或rb文件呢?

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

为了更好地解释我的问题,想象一下在下面的代码中,两个第一个配方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 个答案:

答案 0 :(得分:0)

您无法在JSON环境中执行此操作。你可以在食谱中做到这一点:

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

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