Получение частных IP-адресов масштабируемого набора виртуальных машин Azure через Azure REST API

Можно ли получить список частных IP-адресов экземпляра масштабируемого набора виртуальных машин Azure через Azure REST API?

Похоже, что Microsoft не публикует объекты конфигурации IP VMSS с помощью обычных методов получения списка «ipConfigurations».

Вот несколько соответствующих страниц документации API:

https://docs.microsoft.com/en-us/rest/api/compute/virtualmachinescalesets/listall https://docs.microsoft.com/en-us/rest/api/compute/virtualmachinescalesets/get https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines/listall

В частности, это дает вам только IP-конфигурацию виртуальных машин, а не VMSSes: https://docs.microsoft.com/en-us/rest/api/virtualnetwork/networkinterfaces/listall


person Nigel Sheridan-Smith    schedule 01.05.2018    source источник


Ответы (3)


Вот как получить список частных IP-адресов для виртуальных машин и экземпляров VMSS через Ruby:

require 'openssl'

require 'azure_mgmt_network'
require 'azure_mgmt_compute'
require 'awesome_print'

options = {
    tenant_id: '<tenant_id>',
    client_id: '<client_id>',
    client_secret: '<client_secret>',
    subscription_id: '<subscription_id>'
}

def net_interface_to_ip_mapping(client)
  network_interfaces = client.network_interfaces.list_all
  pairs = network_interfaces.collect { |ni| [ni.id.split('/').last, ni.ip_configurations.collect { |ip| ip.private_ipaddress }.flatten.compact[0] ] }
  [network_interfaces, pairs]
end

def net_interface_to_vm(ni)
  interface_vm_set = ni.collect { |prof| [prof.id, prof.virtual_machine, prof.ip_configurations.collect(&:id)] }
  ipconf_to_host = interface_vm_set.collect { |x| [x[2][0], x[1]&.id&.split('/')&.last] }.to_h
  conf_ip_map = ni.collect(&:ip_configurations).flatten.compact.collect { |ipconf| [ipconf&.id, ipconf&.private_ipaddress] }.to_h
  [ipconf_to_host, conf_ip_map]
end

puts "*** Network Interfaces"
puts
client = Azure::Network::Profiles::Latest::Mgmt::Client.new(options)
ni, pairs = net_interface_to_ip_mapping(client)
pairs.to_h.each do |ni, ip|
  puts "  #{ni}: #{ip}"
end

puts
puts "*** Virtual Machines"
puts

ipconf_to_host, conf_ip_map = net_interface_to_vm(ni)
ipconf_to_host.each do |ipconf, host|
  ni_name = ipconf.split('/')[-3]
  puts "  #{host || '#  ' + ni_name} - #{conf_ip_map[ipconf]}"
end

puts
puts "*** Virtual Machine Scale Sets"
puts

vns = client.virtual_networks.list_all
vns.each do |vn|
  resource_group = vn.id.split('/')[4]
  puts
  vn_details = client.virtual_networks.get(resource_group, vn.name,  expand: 'subnets/ipConfigurations')
  ip_configs = vn_details&.subnets&.collect { |subnet| subnet&.ip_configurations&.collect { |ip| [ip&.id, ip&.name, ip&.private_ipaddress] } }.compact
  vmss_ipconf = ip_configs.collect { |subnet| subnet.select { |ipconf| ipconf[0].include?('/virtualMachineScaleSets/') } }
  vmss_ipconf.each do |subnet|
    subnet.each do |ipconf|
      vmss_name = ipconf[0].split('/')[8]
      vmss_instance = ipconf[0].split('/')[10]
      puts "#{vmss_name} ##{vmss_instance} - #{ipconf[2]}"
    end
  end
end
person Nigel Sheridan-Smith    schedule 01.05.2018

В интерфейсе командной строки Azure есть az vmss nic list, который возвращает все сетевые интерфейсы в масштабируемом наборе виртуальных машин. Глядя на результаты, есть

{
  "dnsSettings": {
    ...
  },
  "ipConfigurations": [
    {
      privateIpAddress: "..."
    }
   ]
}

Вы можете использовать синтаксис --query, чтобы получить все частные IP-адреса.

az vmss nic list -g <resource_group> --vmss-name <vmss_name> --query [].{ip:ipConfigurations[0].privateIpAddress} -o tsv
person Bill Pratt    schedule 31.07.2018

вы можете получить имена хостов виртуальных машин, которые будут преобразованы в IP-адреса благодаря Azure DNS.

$ curl -H "Authorization: Bearer $JWT_TOCKEN"  -sf https://management.azure.com/subscriptions/${subscription_id}/resourceGroups/${resourc_group}/providers/Microsoft.Compute/virtualMachineScaleSets/${scale_set}/virtualMachines?api-version=2018-10-01 |  jq '.value[].properties.osProfile.computerName'
"influx-meta000000"
"influx-meta000001"

$ getent hosts influx-meta000001
10.120.10.7     influx-meta000001.l55qt5nuiezudgvyxzyvtbihmf.gx.internal.cloudapp.net
person Alexander Komlik    schedule 13.12.2018