4

我希望 Chef 食谱network_interfaces为我的每个节点提供 ip 地址、网络掩码等的动态值。对我有用的是以下内容:

db_role.rb (block1):

override_attributes(
  "network_interfaces" => {
      :device => 'eth0',
      :address => '123.123.123.123',
  }
)

但这不是很动态。我的想法是将 ip 地址(、网络掩码等)提交给knife bootstrap.

然后节点看起来像这样(block2):

{
    "normal": {
      "network_interfaces" => {
          "device" : "eth0",
          "address" : "123.123.123.123"
      }
    },
    "name": "foobar",
    "run_list": [
       "recipe[zsh]",
       "role[networking_interfaces]"
    ]
}

不幸的是,network_interfaces食谱默认情况下不会选择这些值。我的想法是在角色定义中引用 block2 中显示的节点特定属性,如下所示:

override_attributes(
  "network_interfaces" => {
      :device => node['network_interfaces']['device'],
      :address => node['network_interfaces']['address'],
  }
)

这不起作用,因为它显然不是 json 并且 Chef 无法处理角色文件中动态分配的值。

我怎样才能实现运行network_interfaces配方并将我的节点特定值传递给它?

4

2 回答 2

6

Maciej,我听从了你的建议。我在引导时使用 -j 选项上传自定义参数,如 IP、广播等。

knife bootstrap IP_OF_THE_NODE -r 'role[main_application]' -j '{ "network_interfaces" : {"device" : "eth1.0000", "type" : "static", "address" : "192.168.1.1", "netmask" : "255.255.255.0", "broadcast" : "192.168.0.255","gateway": "192.168.0.1"}}'     

另外我写了一个自定义配方来实现动态匹配。这是代码:

#setup a custom network config per vm
network_interfaces node["network_interfaces"]["device"] do
  Chef::Log.info("Compiling network_interfaces")
  target node["network_interfaces"]["address"]
  mask node["network_interfaces"]["netmask"]
  broadcast node["network_interfaces"]["broadcast"]
  gateway node["network_interfaces"]["gateway"]
  custom node["network_interfaces"]["custom"]
  action :save
end
于 2013-02-13T16:04:54.403 回答
2
于 2013-01-14T11:12:17.527 回答