Chef:如何使用状态键等于up来收集本地network.interface属性?

时间:2017-11-14 16:15:25

标签: ruby chef chef-recipe

我有兴趣收集任何network_interfaces _ * _ state的关键值:在运行chef-client的主机上运行up属性。所以任何具有状态' up'属性。

我有一个包含配置文件的模板,我需要使用上面的chef属性收集活动的网络设备。我尝试在默认配方文件中编写一些内容,例如:

template '/etc/foo.conf' do
    ....
    variables ({
        netdev: search(node, 'network_interfaces_*_state:up').each {r |r| puts "#{r['network']['interfaces'].select { |i,j| j['state'] == 'up' }.keys } " }
    })
end

所以有两件事显然是错的。

  1. 作为刀具执行此操作-E" ......"返回所有节点上的state:up的接口名称。我只希望它来自运行chef-client的当前节点。
  2. chef-client正在返回一个未定义的方法' search'对于Chef :: Resource :: Template,追溯到' netdev'变量如上所述。
  3. 我不熟悉Ruby并且在这个级别使用Chef,并且真的希望我可以帮助理解两件事。如何从本地主机中提取属性值,以及如何将其写入配方/食谱中?

1 个答案:

答案 0 :(得分:2)

所以你需要的是第一个'up'接口,假设应该避免使用loopback接口,这应该是:

template '/etc/foo.conf' do
    ....
    variables ({
        netdev: node['network']['interfaces'].select { |i,j| j['state'] == 'up' && i != 'lo' }.keys[0]
    })
end

主要思想是在接口状态和名称上过滤接口哈希,保留密钥并获取结果数组中的第一个。

保留以前的答案以供参考。

属性为indexed and flattened,因此您可以只搜索state:up,但可能会找到名为state的其他属性。

使用扁平版本可以:

knife node search 'network_interface_*_state:up' -a network.interfaces

这是从上面链接的文档中的嵌套字段示例中得出的。

如果您希望为每个节点启用每个界面,您可以使用搜索进行搜索,并使用knife exec这样的一点红宝石:

 knife exec -E "nodes.search('network_interfaces_*_state:up').each { |n| puts \"#{n} #{n['network']['interfaces'].select { |i,j| j['state'] == 'up' }.keys } \" }"
node[xxxxxxx] ["eth1", "eth2", "eth3", "usb0"]
node[yyyyyyy] ["docker0"]
node[zzzzzzz] ["eth1", "eth2", "eth3", "usb0"]

这个想法是搜索具有up接口的节点,并且每个过滤接口的属性(j中的select块,因为它们是散列内的散列)状态为up,然后仅保留生成的过滤哈希的keys,它们是状态为up的接口。 (旁注我上面的例子是用状态完成的:向下限制结果)