如何从 OHAI 检索网络掩码属性?
How can I retrieve the netmask attribute from OHAI?
我需要能够在引导实例时获取实例接口的网络掩码。在实例上 运行 ohai 之后,我得到以下将提供网络掩码的输出:
"network": {
"interfaces": {
"lo": {
"mtu": "65536",
"flags": [
"LOOPBACK",
"UP",
"LOWER_UP"
],
"encapsulation": "Loopback",
"addresses": {
"127.0.0.1": {
"family": "inet",
"prefixlen": "8",
"netmask": "255.0.0.0",
"scope": "Node"
}
},
"state": "unknown"
},
"ens5": {
"type": "ens",
"number": "5",
"mtu": "9001",
"flags": [
"BROADCAST",
"MULTICAST",
"UP",
"LOWER_UP"
],
"encapsulation": "Ethernet",
"addresses": {
"0E:D6:03:1B:8D:42": {
"family": "lladdr"
},
"10.191.196.213": {
"family": "inet",
"prefixlen": "24",
"netmask": "255.255.255.0",
"broadcast": "10.191.196.255",
"scope": "Global"
}
},...
我没有得到正确的语法,但我发现我可以用这个获得 IP 地址:
node[:network][:interfaces][:eth0][:addresses].detect{|k,v| v[:family] == "inet" }.first
但是,使用它不会获得网络掩码:
node[:network][:interfaces][:ens192][:addresses][:netmask]
关于正确 ruby 获得此值的任何想法?
*编辑 - 使用:
node["network"]["interfaces"]["ens192"]["addresses"].values.find { |i| i["family"] == "inet" }["netmask"]
我收到这个错误:
[2018-04-24T17:06:45-04:00] ERROR:
Chef::Mixin::Template::TemplateError (undefined method `[]' for nil:NilClass) on line #9:
7: DNS2=<%= node['dns_dtbg']['dns_servers_dtbg'][1] %>
8: PEERDNS=no
9: NETMASK=<%= node["network"]["interfaces"]["ens192"]["addresses"].values.find { |i| i["family"] == "inet" }["netmask"] %>
10: TYPE=Ethernet
node["network"]["interfaces"]["ens192"]["addresses"].values.find { |i| i["family"] == "inet" }["netmask"]
你还应该检查一下路上是否没有空的 Mash。
node[:network][:interfaces][:ens5][:addresses].detect do |k,v|
v[:family]=='inet'
end.last[:netmask]
你可以通过将你的json粘贴到pry或irb找到它,并在每次添加另一个嵌套密钥获取后检查结果。此外,您可以使用 Hash#dig
来改进此答案。
我需要能够在引导实例时获取实例接口的网络掩码。在实例上 运行 ohai 之后,我得到以下将提供网络掩码的输出:
"network": {
"interfaces": {
"lo": {
"mtu": "65536",
"flags": [
"LOOPBACK",
"UP",
"LOWER_UP"
],
"encapsulation": "Loopback",
"addresses": {
"127.0.0.1": {
"family": "inet",
"prefixlen": "8",
"netmask": "255.0.0.0",
"scope": "Node"
}
},
"state": "unknown"
},
"ens5": {
"type": "ens",
"number": "5",
"mtu": "9001",
"flags": [
"BROADCAST",
"MULTICAST",
"UP",
"LOWER_UP"
],
"encapsulation": "Ethernet",
"addresses": {
"0E:D6:03:1B:8D:42": {
"family": "lladdr"
},
"10.191.196.213": {
"family": "inet",
"prefixlen": "24",
"netmask": "255.255.255.0",
"broadcast": "10.191.196.255",
"scope": "Global"
}
},...
我没有得到正确的语法,但我发现我可以用这个获得 IP 地址:
node[:network][:interfaces][:eth0][:addresses].detect{|k,v| v[:family] == "inet" }.first
但是,使用它不会获得网络掩码:
node[:network][:interfaces][:ens192][:addresses][:netmask]
关于正确 ruby 获得此值的任何想法?
*编辑 - 使用:
node["network"]["interfaces"]["ens192"]["addresses"].values.find { |i| i["family"] == "inet" }["netmask"]
我收到这个错误:
[2018-04-24T17:06:45-04:00] ERROR:
Chef::Mixin::Template::TemplateError (undefined method `[]' for nil:NilClass) on line #9:
7: DNS2=<%= node['dns_dtbg']['dns_servers_dtbg'][1] %>
8: PEERDNS=no
9: NETMASK=<%= node["network"]["interfaces"]["ens192"]["addresses"].values.find { |i| i["family"] == "inet" }["netmask"] %>
10: TYPE=Ethernet
node["network"]["interfaces"]["ens192"]["addresses"].values.find { |i| i["family"] == "inet" }["netmask"]
你还应该检查一下路上是否没有空的 Mash。
node[:network][:interfaces][:ens5][:addresses].detect do |k,v|
v[:family]=='inet'
end.last[:netmask]
你可以通过将你的json粘贴到pry或irb找到它,并在每次添加另一个嵌套密钥获取后检查结果。此外,您可以使用 Hash#dig
来改进此答案。