使用python中的azure sdk从VM对象获取IP

时间:2016-11-21 20:34:42

标签: python azure cloud

我正试图从azure订阅中获取所有IP(附加到VM)。

我已经使用

拉出了所有虚拟机
compute_client = ComputeManagementClient(credentials, subscription_id)
network_client = NetworkManagementClient(credentials,subscription_id)


 for vm in compute_client.virtual_machines.list_all():
      print(vm.network_profile.network_interface)

但是network_profile对象似乎只是一个指针,我已经阅读了文档,无法弄清楚如何将每个vm链接到其附加的IP地址

我遇到了这个:Is there any python API which can get the IP address (internal or external) of Virtual machine in Azure

但似乎有些事情发生了变化。

只有当我知道Public_IP地址对象的名称(并非所有地址对象都具有公共IP)时,我才能解析机器的IP。

我需要能够使用此network_interface并解析其上的IP

2 个答案:

答案 0 :(得分:1)

正如你所说,确实有些事情发生了变化,但并不多。

首先,如下所示,NetworkManagementClientConfiguration已被删除,请参阅link中的详细信息。

network_client = NetworkManagementClient(credentials,subscription_id)

其次,根据source code,参数public_ip_address_name是子网的名称,不再是vm名称。

# Resource Group
GROUP_NAME = 'azure-sample-group-virtual-machines'
# Network
SUBNET_NAME = 'azure-sample-subnet'
PUBLIC_IP_NAME = SUBNET_NAME
public_ip_address = network_client.public_ip_addresses.get(GROUP_NAME, PUBLIC_IP_NAME)

然后,您还可以private_ip_address&来自IPConfiguration

PublicIPAddress public_ip_address
print(public_ip_address.ip_configuration.private_ip_address)
print(public_ip_address.ip_configuration.public_ip_address)

答案 1 :(得分:0)

因此,为了获取IP,您需要解析vm.network_profile.network_interface中给出的URI。然后使用订阅和nic名称获取IP using network_client.network_interfaces.get()

我使用的代码如下:

compute_client = ComputeManagementClient(credentials, subscription_id)
network_client = NetworkManagementClient(credentials,subscription_id)
        try:
            get_private(compute_client, network_client)
        except:
            print("Auth failed on "+ subscription_id)



def get_private(compute_client, network_client):


    for vm in compute_client.virtual_machines.list_all():
        for interface in vm.network_profile.network_interfaces:
            name=" ".join(interface.id.split('/')[-1:])
            sub="".join(interface.id.split('/')[4])

            try:
                thing=network_client.network_interfaces.get(sub, name).ip_configurations

                for x in thing:
                    print(x.private_ip_address)

            except:
                print("nope")

在此示例中,您还可以x.public_ip_address获取公共IP