如何从 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 来改进此答案。