ruby – Chef中的动态角色属性

我希望Chef cookbook network_interfaces为每个节点提供ip地址,netmasks等的动态值.对我有用的是:

db_role.rb(block1):

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

但这不是很有活力.我的想法是在刀具引导程序上向每个节点提交ip地址(,网络掩码等).

然后该节点看起来像这样(块2):

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

不幸的是,network_interfaces cookbook认不会获取这些值.我的想法是在角色定义中引用block2中显示的节点特定属性,如下所示:

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

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

如何运行network_interfaces配方并将特定于节点的值传递给它?

解决方法

如果通过knife bootstrap -j …添加常规属性,并在角色中保留覆盖属性,则覆盖将接管(有关属性优先级的完整列表,请参阅 http://docs.opscode.com/essentials_node_object_attributes_precedence.html).如果在运行刀启动之前已从db_role.rb中删除了override_attributes,或者将其更改为default_attributes,则在节点属性中设置IP应该有效.

最后一个片段不起作用:角色是Chef服务器上的静态JSON文档,并且在将角色上传到服务器时,Ruby只能用刀解释一次(http://docs.opscode.com/essentials_roles_formats.html).你不能从角色的Ruby代码中引用节点的属性,因为它甚至在触及任何节点之前都被编译为JSON.如果您想尝试类似的方法,您需要使用自定义食谱(例如,my_network_interfaces),其配方看起来像这样:

node.set['network_interface']['device'] = …
node.set['network_interface']['address'] = …
include_recipe 'network_interfaces'

这样,您就可以将network_interfaces用作“库”菜谱,由“应用程序”菜谱调用my_network_interfaces,它可以实现您需要的任何逻辑.从你的问题,我不能建议你如何计算设备和地址,因为你的例子只是试图复制相同的属性,这是一个无操作.据我了解您想要实现的目标,您希望在角色中使用default_attributes,并将具有普通属性的特定JSON传递给knife bootstrap以覆盖认值.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...