通过Azure REST API

时间:2018-05-01 05:42:05

标签: rest azure

您是否可以通过Azure REST API获取Azure VM规模集实例专用IP地址列表?

似乎Microsoft不会在检索“ipConfigurations”列表的常规方法下发布VMSS IP配置对象。

以下是一些相关的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

特别是,这个只提供了VM的IP配置,而不是VMSSes: https://docs.microsoft.com/en-us/rest/api/virtualnetwork/networkinterfaces/listall

3 个答案:

答案 0 :(得分:2)

以下是如何通过Ruby获取VM和VMSS实例的私有IP地址列表:

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

答案 1 :(得分:2)

看看Azure CLI,有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

答案 2 :(得分:0)

借助Azure DNS,您可以获得能够解析为IP的VM主机名

$ 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