头图

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控制台,在左侧菜单栏选择“成本管理+计费”(菜单顺序可自定义调整,截图仅供示意)。

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 声望
16 粉丝
0 条评论
推荐阅读
ingress does not contain a valid IngressClass
{代码...} test写本机 hostip domain创建 ingresstest

台湾省委书记阅读 293

封面图
比特熊故事汇2.0 | 矛盾个性是促成创意不竭的正反合
2023年开年故事汇,我们请来一位“熟悉的新朋友”,他乐观、谨慎、敢于尝试、富有想象力,擅长Azure、AI、C#、产品设计。他是拥有10年+经验的微软MVP,也是有点社恐却谈笑风生的开发人。本期比特熊故事汇主人公——王...

微软技术栈阅读 920

封面图
限量红包封面开抢啦!祝你兔年好运连连
① 请先微信搜索关注“微软开发者MSDN”公众号② 选择你喜欢的技能,私信发送对应兔子名称(飞飞兔、灵灵兔、康康兔、美美兔、安安兔)③ 后台会自动弹出一张海报,请扫码领取封面

微软技术栈阅读 910

封面图
jumpserver api创建资产
jumpserver apidomain+/api/docspython {代码...} GO {代码...}

台湾省委书记阅读 622

封面图
正式发布丨Azure OpenAI Service
大型语言模型正迅速成为用户无限创新、应用 AI 解决重要问题的平台。随着 Azure OpenAI 服务的正式发布,更多企业用户可以访问世界先进的人工智能模型,以创建创新应用,包括 GPT-3.5、Codex 和 DALL•E 2——基于微...

微软技术栈阅读 566

封面图
基于OpenCV的人脸、视频、文字检测以及识别的项目(一 项目准备)
numpy是一个定义了数值数组和矩阵类型和它们的基本运算的语言扩展,OpenCV引用了numpy模块,所以安装OpenCV之前必须安装numpy。numpy:第一步:先去网站下载对应的numpy版本,这个numpy要对应你的python版本号 下...

胡子老爷爷阅读 521

微软 Azure 作为 OpenAI 独家云服务提供商,助力企业致胜人工智能时代
近期,微软宣布扩大与 OpenAI 的合作关系。微软 Azure 作为 OpenAI 的独家云服务提供商,自 2019 年开始便以其出色的、面向 AI 时代的领先架构,为 OpenAI 的快速发展提供助力。

微软技术栈阅读 503

封面图

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

89 声望
16 粉丝
宣传栏