Azure批处理池:如何通过Python使用自定义VM映像?

时间:2017-10-15 15:34:44

标签: python azure azure-batch

我想用Python创建我的游泳池。我可以在市场上使用图像(Ubuntu Server 16.04)时执行此操作,但我想使用自定义图像(还有Ubuntu Server 16.04) - 我已经准备好了所需的库和设置。

这就是我创建游泳池的方式:

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虚拟机映像。

它将参数列为:

  • publisher(str)
  • offer(str)
  • sku(str)
  • version(str)
  • virtual_machine_image_id(str)

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

如何为我的游泳池使用自定义图像?

更新

所以我想出了如何使用自定义图像...事实证明,无论我卸载azure python库多少次并重新安装它们,virtual_machine_image_id都永远不可用。

然后我去here下载了拉链。打开它,查看了ImageReference类,并且virtual_machine_image_id类的__init__函数中提供了ImageReference。然后我下载了python wheel并使用pip来安装它。它起作用了。

或者我想。

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

现在我正在努力进行身份验证...

我得到的错误是:

  

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

     

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

     

azure.batch.models.batch_error.BatchErrorException:{' lang':   ' en-US','值':'服务器无法验证请求。使   确保正确形成Authorization标头的值,包括   该   。签名\ 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等。 al are。

然后我设法找到另一篇看似同样的文档: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,用于您要创建的应用程序类型。后   设置值,选择Create。

请勿选择Native,因为您无法获取应用密钥...

2 个答案:

答案 0 :(得分:2)

所需的最低Azure批处理SDK

需要azure-batch Python SDK v4.0.0或更高版本。通常使用pip install --upgrade azure-batch,您应该获得最新版本。如果这不起作用,您可以将--force-reinstall选项添加到pip以强制它(使用--upgrade)。

节点代理Sku Id

关于node_agent_sku_id的正确值,您需要使用list_node_agent_skus操作来查看操作系统与支持的节点代理skus之间的映射。

需要Azure Active Directory身份验证

关于身份验证问题,您必须使用Azure Active Directory authentication才能使用此功能。它不适用于共享密钥验证。

<强>文档

可以在this guide中找到更多信息,包括启用自定义图片所需的所有先决条件。

答案 1 :(得分:0)

我正在使用azure-batch == 9.0.0,事实证明docs并未按照软件包本身进行更新。使用id代替virtual_machine_image_id可以解决我的问题。