【问题标题】:Get private IP addresses for VMs in a Scale Set via Python SDK (no public IP addresses in Scale Set)通过 Python SDK 获取规模集中 VM 的私有 IP 地址(规模集中没有公共 IP 地址)
【发布时间】:2020-04-24 01:33:03
【问题描述】:

我正在尝试获取规模集中所有 VM 的专用 IP 地址列表(没有一个 VM 故意具有任何公共 IP 地址)。我找到了如何从az cli 获取此信息,如下所示:

az vmss nic list -g ResourceGroup --vmss-name ScaleSetName --query [].{ip:ipConfigurations[0].privateIpAddress} -o tsv

但是,我无法使用 Python SDK 获得相同的输出。我正在使用以下基本代码:

from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.compute import ComputeManagementClient

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

compute_client = ComputeManagementClient(credentials, SUBSCRIPTION)

vmss = compute_client.virtual_machine_scale_sets.get(RG, SC)
print(vmss.virtual_machine_profile.network_profile.network_interface_configurations[0].ip_configurations[0])

这是在 SDK 对象模型中寻找它们的正确位置吗?据我了解,网络属性应该在规模集级别,这是我在 API 中看到与网络相关的任何内容的唯一位置。但是,我在后续属性中只看到“私有 IP 版本”,并且由于没有公共 IP,因此该部分属性是空白的。

【问题讨论】:

    标签: azure azure-sdk azure-sdk-python


    【解决方案1】:

    很遗憾,您恐怕无法获取虚拟机规模集实例的私有 IP。虚拟机规模集的网络接口不是 Azure 中的资源,您无法获取它们。目前,Azure python SDK 不支持通过 python SDK 获取 VMSS 私有 IP。

    您可以尝试使用 REST API 来达到目的,并通过 CLI 命令调试获取 REST API,如下所示:

    az vmss nic list -g ResourceGroup --vmss-name ScaleSetName --query [].{ip:ipConfigurations[0].privateIpAddress} -o tsv --debug
    

    它将显示进度和 REST API:

    【讨论】:

    • 是的,如问题所述,我知道 az cli 命令。现在,我可以通过从 python 调用该命令作为外部进程来解决问题。但是(1)它非常麻烦,(2)它需要先在给定的机器上验证 az cli
    • @VS_FF 我不是说使用 CLI,我是说在你的 Python 代码中使用 REST API。
    • @VS_FF 现在情况如何?你用我的回答解决问题了吗?或者更多帮助?
    • 由于内部原因,我无法按照您的建议使用 REST。正如我所提到的,我通过从 python 内部生成一个进程来继续使用 AZ 命令。这种方法比 REST 更适合我的目的。如果 SDK 真的支持这么简单的功能当然会更好...
    • @VS_FF 恐怕您目前只能在您的 python 代码中使用 CLI 或 REST API。也许 Azure SDK 会像我们预期的那样在未来支持它。另外,如果您不介意,请在有帮助的时候采纳答案。
    【解决方案2】:

    如果您已经在使用 Python azure sdk,则可以从 azure.identity 凭证中提取 Bearer 令牌,这使得该 REST API 调用更容易执行:

    credentials = ClientSecretCredential(
        client_id=os.environ['AZURE_CLIENT_ID'],
        client_secret=os.environ['AZURE_CLIENT_SECRET'],
        tenant_id=os.environ['AZURE_TENANT_ID']
    )  
    
    # Grab the bearer token from the existing azure credential,
    # and use it to AUTH the REST api call:
    rest_token = credentials._request_token('https://management.core.windows.net//.default')
    vmss_nic_json = vmss_rest_api_list_nics(rest_token.token, subscription_id, resource_group, vmss_name)
    
    # REST API call:
    def vmss_rest_api_list_nics(token, subscription_id, resource_group, vmss_name, api_version='2018-10-01'):
        
        url = f"https://management.azure.com/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/microsoft.Compute/virtualMachineScaleSets/{vmss_name}/networkInterfaces"
        params = {'api-version': api_version}
        request = requests.Request('GET', url, params=params)
        prepped = request.prepare()
        prepped.headers['Authorization'] = f'Bearer {token}'
    
        with requests.Session() as session:
            response = session.send(prepped )
    
            if( response.status_code == 200 ):
                return json.loads(response.text)
            else:
                logger.error(f"Failed to communicate with api service: HTTP {response.status_code} - {response.text}")
                return None
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    相关资源
    最近更新 更多