我有兴趣收集任何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
所以有两件事显然是错的。
我不熟悉Ruby并且在这个级别使用Chef,并且真的希望我可以帮助理解两件事。如何从本地主机中提取属性值,以及如何将其写入配方/食谱中?
答案 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的接口。 (旁注我上面的例子是用状态完成的:向下限制结果)