我希望Chef cookbook network_interfaces
为每个节点提供ip地址,netmasks等的动态值.对我有用的是:
db_role.rb(block1):
override_attributes( "network_interfaces" => { :device => 'eth0', :address => '123.123.123.123', } )
但这不是很有活力.我的想法是将ip地址(,网络掩码等)提交给每个节点knife bootstrap
.
然后该节点看起来像这样(块2):
{ "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
配方并将特定于节点的值传递给它?
Maciej,我听从你的建议.我在bootstrap上使用-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