Как я могу получить атрибут сетевой маски из OHAI? - PullRequest
0 голосов
/ 24 апреля 2018

Мне нужно иметь возможность получить маску сети для интерфейса экземпляра при начальной загрузке экземпляра. После запуска 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 голосов
/ 29 апреля 2018
node[:network][:interfaces][:ens5][:addresses].detect do |k,v|
  v[:family]=='inet'
end.last[:netmask]

Вы можете узнать это, вставив свой json в pry или irb, и проверять результат каждый раз после добавления другой выборки вложенных ключей.Кроме того, вы, вероятно, можете улучшить этот ответ, используя Hash#dig.

0 голосов
/ 24 апреля 2018
node["network"]["interfaces"]["ens192"]["addresses"].values.find { |i| i["family"] == "inet" }["netmask"]

Вы также должны проверить, не получаете ли вы пустой Мес вдоль дороги.

...