如何从OHAI检索网络掩码属性?

时间:2018-04-24 14:10:56

标签: ruby chef chef-recipe

我需要能够在引导实例时获取实例接口的网络掩码。在实例上运行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]

有关正确红宝石的任何想法都能获得这个价值吗?

*编辑 - 使用:

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

2 个答案:

答案 0 :(得分:0)

node["network"]["interfaces"]["ens192"]["addresses"].values.find { |i| i["family"] == "inet" }["netmask"]

你还应该检查你是否在路上没有任何空的Mash。

答案 1 :(得分:0)

node[:network][:interfaces][:ens5][:addresses].detect do |k,v|
  v[:family]=='inet'
end.last[:netmask]

您可以通过将json粘贴到pry或irb来找到它,并在添加另一个嵌套密钥提取后每次检查结果。此外,您可以使用Hash#dig改进此答案。