头图

azure

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

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

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

image.png

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

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

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

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

image.png

在“Azure Active Directory”的属性页面,可以看到“租户ID”,该ID即为Azure的租户(Tenant)ID。
image.png

获取微软Azure的Client信息

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

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

image.png

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

名称:xxxxxxxx(不能用中文)

受支持的账户类型:建议选择“任何组织目录”

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

image.png

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

image.png

(4)点击刚注册的应用“xxxx”的<证书和密码>,点击<新客户端密码>,说明填写“安恒云API访问”,截止期限选择“从不”,然后点击<添加>即可。

image.png

应用程序资源授权
(1)获得Client信息后,还需要将应用程序在资源上进行授权:在左侧菜单栏选择“资源组”。
image.png

(2)查看资源列表,选择您希望导入到安恒云的资源组,进入后点击<访问控制(标识和访问管理)>子菜单,在授予对此资源的访问权限区域点击<添加角色分配>

image.png

3)在添加角色分配区域,角色选择“所有者”,将访问权限分配到选择默认的“用户、组或服务主体”,选择文本框中输入前面创建的管理员账号关键字,选中后可以看到下面所选成员中存在该账号,点击<保存>。

image.png

(4)此时在访问控制(标识和访问管理)的角色分配页签下,在所有者中即增加了您创建的管理员账号。此后您便可以使用该账号创建的Client信息作为API访问凭证,将资源导入到xx

image.png

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'}}]

锅包肉
89 声望17 粉丝

这个人很懒,没有什么说的。