2017-10-15 99 views
1

我想用Python创建我的Pool。我可以在市场上使用映像(Ubuntu Server 16.04)时做到这一点,但我想使用自定义映像(也包括Ubuntu Server 16.04) - 我已经准备好了所需的库和安装程序。Azure批处理池:如何通过Python使用自定义VM映像?

这是我如何创建我的池:

new_pool = batch.models.PoolAddParameter(
     id=pool_id, 
     virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
      image_reference=image_ref_to_use, # ?? 
      node_agent_sku_id=sku_to_use), 
     vm_size=_POOL_VM_SIZE, 
     target_dedicated_nodes=_POOL_NODE_COUNT, 
     start_task=start_task, 
     max_tasks_per_node=_CORES_PER_NODE 
) 

我成像,我需要使用batch.models.ImageReference()创建我的形象参考...但我不知道如何使用它。

是的,我查了documentation,它说以下内容:

到Azure的虚拟机市场的图像或自定义 Azure的虚拟机映像的引用。

它列出的参数为:

  • 发布者(STR)
  • 报价(STR)
  • SKU(STR)
  • 版本(STR)
  • virtual_machine_image_id(STR)

但是,t他参数virtual_machine_image_id不存在...换句话说,batch.models.ImageReference(virtual_machine_image_id)是不允许的。

如何为我的Pool使用自定义图像?

UPDATE

所以我想通了如何使用自定义图像......事实证明,无论多少次,我卸载蔚蓝的Python库,并重新安装它们,在virtual_machine_image_id从不可用。

然后我去了here下载了zip。打开它,检查了ImageReference类和低看,virtual_machine_image_id可用于ImageReference类的__init__功能。然后我下载了python wheel并使用pip来安装它。繁荣它的工作。

或者我想。

然后,我试图找出node_agent_sku_id是什么......只有通过手动创建一个池并看到Batch Node Agent SKU ID字段我设法找到它。

现在我与认证挣扎......

我得到的错误是:

服务器无法验证请求。确保 授权标头的值正确地形成,包括签名。

AuthenticationErrorDetail:指定的认证类型 当Compute类型的外部资源链接到 时,不允许使用SharedKey。

azure.batch.models.batch_error.BatchErrorException:{'lang': 'en-US','value':'服务器未能认证请求。使 肯定是正确形成授权报头的值,包括所述 签名 \ nRequestId:f8c1a3b3-65c4-4efd-9c4f-75c5c253f992 \ n时间:2017-10-15T20:36:06.7898187Z'}

从错误,我明白我不允许使用SharedKeyCredentials

credentials = batchauth.SharedKeyCredentials(_BATCH_ACCOUNT_NAME, 
              _BATCH_ACCOUNT_KEY) 

batch_client = batch.BatchServiceClient(
    credentials, 
    base_url=_BATCH_ACCOUNT_URL) 

我该怎么办?

更新2

确定。用户fpark告诉我,我需要使用:

from azure.batch import BatchServiceClient 
from azure.common.credentials import ServicePrincipalCredentials 

credentials = ServicePrincipalCredentials(
    client_id=CLIENT_ID, 
    secret=SECRET, 
    tenant=TENANT_ID, 
    resource="https://batch.core.windows.net/" 
) 
    batch_client = BatchServiceClient(
    credentials, 
    base_url=BATCH_ACCOUNT_URL 
) 

进行身份验证。不幸的是,上面的代码被描述为here,并且没有提及什么是CLIENT_ID et。 al是。

我然后设法找到另一块文档这似乎是同样的事情:https://azure-sdk-for-python.readthedocs.io/en/v2.0.0rc3/resourcemanagementauthentication.html

那页指出我到另一个网页:https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal

我跟着该教程和管理,以最终验证我的应用程序...

注意

当创建应用程序,本教程将告诉你:

提供应用程序的名称和URL。选择Web应用程序/ API或Native作为您要创建的应用程序的类型。在 设置值后,选择创建。

不要选择Native,你将不必得到应用密钥的选项...

+0

你可以发布一个完整的工作代码版本吗? – RedPanda

+0

这是非常有帮助的 - 你是如何计算出你需要在图片名称前加入/预订/预订的? – RedPanda

+0

我终于找到了Azure在odata.metadata下的HTTP记录器中返回的详细错误文本,其中他们指定了virtual_machine_image_id的正确格式。这让我意识到,您需要复制Azure门户上图像的“资源ID”字段,该字段可以在查看VM映像详细信息时看到。 – RedPanda

回答

0

您需要安装Python的azure-batch SDK V4.0.0或更高版本。通常与pip install --upgrade azure-batch,你应该只是得到最新版本。如果这不起作用,您可以将--force-reinstall选项添加到点来强制它(与--upgrade)。

关于node_agent_sku_id的适当值,您需要使用list_node_agent_skus操作来查看操作系统和支持的Node Agent Skus之间的映射。

关于认证问题,您必须使用Azure Active Directory authentication来使用此功能。它不适用于共享密钥身份验证。不幸的是,围绕此功能的文档不多,目前正在更新。

+0

谢谢,你有一个如何使用'Azure Active Directory认证'的例子吗?我怎样才能做到这一点?我要传递到'batch.BatchServiceClient( 凭证, base_url = _BATCH_ACCOUNT_URL)'? – pookie

+0

我添加了一个链接,显示如何做到这一点。 – fpark