Chef:如何收集状态键等于 up 的本地 network.interface 属性?
Chef: How to gather local network.interface attribute with state key equal to up?
我有兴趣收集主机上任何 network_interfaces_*_state:up 属性的 运行ning 的键值,主厨客户端 运行 .所以任何具有 state '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
所以有两处明显是错误的。
- 运行 这是 knife exec -E "......" returns 所有节点上 state:up 的接口名称。我只希望它来自主厨客户端 运行 所在的当前节点。
- chef-client 正在为 Chef::Resource::Template 返回一个未定义的方法 'search',追溯到上面发布的 'netdev' 变量。
我不熟悉 Ruby 和在这个级别使用 Chef,我真的希望我能在理解两件事上得到帮助。如何从本地主机中提取属性值,以及如何将其写入 recipe/cookbook?
所以你需要的是第一个'up'接口,假设应该避免环回接口,应该这样做:
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
这源自上面链接的文档中嵌套字段的示例。
如果您希望为每个节点设置每个接口,您可以使用搜索和一些 ruby 和 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
in select
块,因为它们是散列中的散列)状态已启动,然后仅保留结果过滤哈希的 keys
,这是状态为 up 的接口。 (旁注我上面的例子是用 state:down 完成的以限制结果)
我有兴趣收集主机上任何 network_interfaces_*_state:up 属性的 运行ning 的键值,主厨客户端 运行 .所以任何具有 state '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
所以有两处明显是错误的。
- 运行 这是 knife exec -E "......" returns 所有节点上 state:up 的接口名称。我只希望它来自主厨客户端 运行 所在的当前节点。
- chef-client 正在为 Chef::Resource::Template 返回一个未定义的方法 'search',追溯到上面发布的 'netdev' 变量。
我不熟悉 Ruby 和在这个级别使用 Chef,我真的希望我能在理解两件事上得到帮助。如何从本地主机中提取属性值,以及如何将其写入 recipe/cookbook?
所以你需要的是第一个'up'接口,假设应该避免环回接口,应该这样做:
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
这源自上面链接的文档中嵌套字段的示例。
如果您希望为每个节点设置每个接口,您可以使用搜索和一些 ruby 和 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
in select
块,因为它们是散列中的散列)状态已启动,然后仅保留结果过滤哈希的 keys
,这是状态为 up 的接口。 (旁注我上面的例子是用 state:down 完成的以限制结果)