乐趣区

关于python3.x:python-获取Azure-下的虚拟机列表

azure

事实上,微软 Azure 并没有一个所谓的“API 拜访凭证”的概念,咱们须要通过它的“Active Directory”中的应用程序 Client 信息来进行 API 的拜访。而且相较其它云厂商而言,微软 Azure 的 API 拜访凭证略显简单,且须要通过多个步骤获取,它由订阅(Subscription)ID、租户(Tenant)ID、Client ID 和 Client Secret 四个局部形成。

获取微软 Azure 的订阅(Subscription)ID

每个 Azure 用户在应用时都会接触到订阅的概念。您在购买 Azure 产品之前,必须先创立一个订阅,而后须要在这个订阅下购买云资源,云资源不能跨订阅拜访。因而,当您存在多个订阅时,请您确保输出的订阅 ID 是您须要导入的云资源所属订阅,否则可能会呈现无奈列出云资源的状况。

登录 Azure 控制台,在左侧菜单栏抉择“老本治理 + 计费”(菜单程序可自定义调整,截图仅供示意)。

在概述中,找到您要导入的云资源所属订阅,获取订阅 ID。如果您有多个订阅,都心愿通过安恒云来治理,那么请在安恒云中创立多个云账户分批导入。

获取微软 Azure 的租户(Tenant)ID

租户是 Active Directory 中的一个概念,示意组织;租户蕴含组织中的用户以及用户的相干信息(如明码、用户配置文件数据、权限等)。

(1)在 Azure 控制台的左侧菜单栏中抉择“Azure Active Directory”。

在“Azure Active Directory”的属性页面,能够看到“租户 ID”,该 ID 即为 Azure 的租户(Tenant)ID。

获取微软 Azure 的 Client 信息

所谓 Client 信息,即 Active Directory 中应用程序的 API 访问信息,包含 Client ID 和 Client Secret 两局部。

(1)在 Azure Active Directory 中,点击 < 利用注册 >,将会列呈现有的所有应用程序,建议您新建一个专门的应用程序供安恒云调用 API。点击 < 新注册 >。

(2)在注册应用程序页面,输出以下信息后点击 < 注册 >。

名称:xxxxxxxx(不能用中文)

受反对的账户类型:倡议抉择“任何组织目录”

重定向 URI:填写 https://xxxxxxxx

(3)注册实现后如下图所示,该应用程序 (客户端)ID 即是 Client ID

(4)点击刚注册的利用“xxxx”的 < 证书和明码 >,点击 < 新客户端明码 >,阐明填写“安恒云 API 拜访”,截止期限抉择“从不”,而后点击 < 增加 > 即可。

应用程序资源受权
(1)取得 Client 信息后,还须要将应用程序在资源上进行受权:在左侧菜单栏抉择“资源组”。

(2)查看资源列表,抉择您心愿导入到安恒云的资源组,进入后点击 < 访问控制(标识和拜访治理)> 子菜单,在授予对此资源的拜访权限区域点击 < 增加角色调配 >

3)在增加角色调配区域,角色抉择“所有者”,将拜访权限调配到抉择默认的“用户、组或服务主体”,抉择文本框中输出后面创立的管理员账号关键字,选中后能够看到上面所选成员中存在该账号,点击 < 保留 >。

(4)此时在访问控制(标识和拜访治理)的角色调配页签下,在所有者中即减少了您创立的管理员账号。尔后您便能够应用该账号创立的 Client 信息作为 API 拜访凭证,将资源导入到 xx

Code

from azure.identity import ClientSecretCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.network import NetworkManagementClient
from azure.mgmt.compute import ComputeManagementClient

Subscription_Id = "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Tenant_Id = "axxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Client_Id = "7exxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Secret = "wxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
GROUP_NAME = 'Cxx'
AZRUE_URL = 'https://management.chinacloudapi.cn'

credentials = ClientSecretCredential(
    tenant_id=Tenant_Id,
    client_id=Client_Id,
    client_secret=Secret
)
resource_client = ResourceManagementClient(credential=credentials, subscription_id=Subscription_Id, base_url=AZRUE_URL,
                                           credential_scopes=["https://management.chinacloudapi.cn/.default"])
compute_client = ComputeManagementClient(credential=credentials, subscription_id=Subscription_Id, base_url=AZRUE_URL,
                                         credential_scopes=["https://management.chinacloudapi.cn/.default"])
network_client = NetworkManagementClient(credential=credentials, subscription_id=Subscription_Id, base_url=AZRUE_URL,
                                         credential_scopes=["https://management.chinacloudapi.cn/.default"])
### 获取 虚拟机名字列表
vm_list = compute_client.virtual_machines.list(GROUP_NAME)
vm_name_list = []
i = 0
for vm in vm_list:

    array = vm.id.split("/")
    resource_group = array[4]
    vm_name = array[-1]
    statuses = compute_client.virtual_machines.instance_view(resource_group, vm_name).statuses
    status = len(statuses) >= 2 and statuses[1]
    vm_name_list.append(vm_name)

print(vm_name_list)
vm_info_list = []


for i in vm_name_list:
    virtual_machine = compute_client.virtual_machines.get(GROUP_NAME, i)
    vm_dict = dict()
    vm_dict['name'] = virtual_machine.name
    vm_dict['os_type'] = virtual_machine.storage_profile.os_disk.os_type
    vm_dict['vmSize'] = virtual_machine.hardware_profile.vm_size
    vm_dict['disk_size'] = virtual_machine.storage_profile.os_disk.disk_size_gb
    vm_dict['data_disks'] = []
    vm_dict['ip'] = []
    try:
        vm_dict['image_reference'] = dict(exact_version=virtual_machine.storage_profile.image_reference.exact_version, sku=virtual_machine.storage_profile.image_reference.offer)
    except Exception as e:
        vm_dict['image_reference'] = 'null'

    for item in virtual_machine.storage_profile.data_disks:
        vm_dict['data_disks'].append(dict(lun=item.lun, name=item.name, disk_size_gb=item.disk_size_gb))
    for item in virtual_machine.network_profile.network_interfaces:
        network_interface_name = item.id.split('/')[-1]
        a = network_client.network_interfaces.get(GROUP_NAME, network_interface_name)
        for ip in a.ip_configurations:
            vm_dict['ip'].append(ip.private_ip_address)
    print(vm_dict)
    vm_info_list.append(vm_dict)

print(vm_info_list)

  • 输入后果:
['Zxxxx6-Server']

[{'name': 'Zxxxxix6-Server', 'os_type': 'Linux', 'vmSize': 'Standard_D4s_v3', 'disk_size': 30, 'data_disks': [], 'ip': ['10.2x.5x.1x'], 'image_reference': {'exact_version': '8.2.2020111800', 'sku': 'CentOS'}}]
退出移动版