Azure Python SDK - список виртуальных машин и генерация пользовательского ответа JSON - PullRequest
0 голосов
/ 20 января 2020

Из az cli у меня есть cmd, чтобы найти все работающие виртуальные машины, и он возвращает всю информацию в виде файла JSON с ключами, которые определяют I .

Мой вопрос: как мне это сделать с помощью Python SDK? Я хотел бы тот же ключ / значение в формате JSON. Я делаю некоторую постобработку в Python, поэтому я предпочитаю использовать Python от начала до конца sh для генерации информации.

рабочий код ниже:

az vm list -d -o json --query `
    "[?powerState=='VM running'].{Name:name, admin:osProfile.adminUsername, STATUS:powerState RG:resourceGroup TAGS:tags}" 

, который возвращает

[
 {
    "Name": "boston",
    "RG": "r_group",
    "STATUS": "VM running",
    "TAGS": {
      "tag_1": "tag_value_1",
      "tag_2": "tag_value_2"
    },
    "admin": "waldo"
  }
]

Ответы [ 2 ]

1 голос
/ 20 января 2020

Вы можете использовать следующий код для отображения VMS,

import azure.mgmt.compute as Compute
from azure.common.client_factory import get_client_from_cli_profile

import retry
import sys
import logging

@retry.retry(RuntimeError, tries=2)
def listVMs(resourceGroup):

    VM = get_client_from_cli_profile(Compute.ComputeManagementClient)

    try:
        VMs = VM.virtual_machines.list(resourceGroup)
        for vm in VMs:
            print(vm)

    except Exception as e:
        logging.error(e)

resourceGroup = sys.argv[1]

if __name__ == '__main__':
    listVMs(resourceGroup)

else:
    print('Running as imported module')
    listVMs(resourceGroup)
0 голосов
/ 21 января 2020

В итоге мне удалось выяснить это с помощью коллеги и множества поисков. Отправьте это здесь в надежде, что другие получат пользу от ответа.

Привет @ Чарльзу Сюю за то, что я начал с этим ответом how-Мог-я-список- azure -virtual-machines-using- python

Мне было трудно найти спецификацию c и соответствующую документацию MS для решения моей проблемы.

ПРИМЕЧАНИЕ: Это работа, и я уверен, что есть много возможностей для улучшения. Я не думаю, что полученный json идеален, но json2 html не жалуется.

А теперь код ...

#!/usr/bin/env python

from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.compute import ComputeManagementClient
import json
from json2html import *

# Tenant ID for your Azure subscription
TENANT_ID = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'

# Your service principal App ID
CLIENT = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'

# Your service principal password
KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'

# Your Azure Subscription ID
subscription_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'

credentials = ServicePrincipalCredentials(
    client_id=CLIENT,
    secret=KEY,
    tenant=TENANT_ID
)

result = []

# Create a Resource Management client
compute_client = ComputeManagementClient(credentials, subscription_id)
vm_list = compute_client.virtual_machines.list_all()
for vm in vm_list:
    resource_group = vm.id.split("/")[4]
    vm_name = vm.name
    details = compute_client.virtual_machines.instance_view(resource_group, vm_name, expand='instanceView')

    status = len(details.statuses) >= 2 and details.statuses[1]
    if status and status.code == 'PowerState/running':
        tagz = compute_client.virtual_machines.get(resource_group, vm_name).tags
        if not tagz:
            tagz = ""
        admin = ''
        if hasattr(details, 'os_profile'):
            admin = details.os_profile.admin_username
        row = {"ComputerName": vm_name, "ResourceGroup": resource_group, "Admin": admin,
               "Status": status.code, "Tags": tagz}
        result.append(row)

data = json.dumps(result)
html = json2html.convert(json=data)
print(html)
...