Azure批:Auto-Deploying批处理应用程序

将应用程序部署到Azure上没有胡说预排一批池

O不我的当前的项目正在与蔚蓝的批处理,我们使用毫升应用程序运行。当我搬到这支球队,部署这个应用程序是一个手动过程。我们必须运行一个脚本,手动设置的版本,这样每次我们需要推动开发或刺激的环境。我的工作之一是自动化这个过程——等等——我主要是做了,但不是没有一些工作。没有太多Python-centric文档可用,所以也许这可能帮助别人在他们的旅程。

T他是Python API文档。

我的目标是自动化部署,要做到这一点,我们需要看看批客户。微软将API结构分为两个不同的客户:

  • 管理:管理批处理帐户、存储和帐户密钥
  • 服务:管理计算节点、游泳池、任务和工作。

需求

我们需要几个Azure资源来得到这个工作。

  1. Azure批帐户
  2. Azure存储账户

这里我假设你都已经,如果不是,与语言无关的文档。

从这三个Azure资源,我们需要几件事情。

  • 承租者ID
  • 订阅ID
  • 批处理资源ID
  • 批处理管理URL:https://management.core.windows.net/
  • 批处理资源的URL:https://batch.core.windows.net/
  • 权威网址:https://login.microsoftonline.com/
  • 批处理帐户URL
  • 批池名称
  • 批处理应用程序名称
  • 资源组名
  • Active Directory的秘密:与广告进行身份验证。这是一个秘密中创建一个关键的金库。

基本流程是如何看:

三个简单的步骤

实现

betway娱乐官网媒介的代码实现并不是最好的,所以我将这段代码作为copy-able比特的文章保持可读性。

我有一个配置。json文件设置,地图上面需要变量,然后读成一个对象。这让我很容易地访问变量无需提供代码。它看起来像这样:

我使用的配置文件的一个示例,以方便访问

创建客户端

在客户端启动之前,我们需要创建令牌管理和服务客户。这些需要一个身份验证上下文对象。有更多的方法获取令牌——例如,但手动过程的自动化,我们将需要acquire_token_with_client_credentials ()方法。

创建身份验证上下文,和两个令牌服务和管理令牌。

现在我们可以创建批处理客户端。

注意,不同的客户需要不同的参数。

准备二进制文件

准备应用程序,我们需要做的就是闭嘴了代码。如何压缩文件上有多个资源在Python中,所以我不包括在这里。我们有一个自定义函数,让我们中的zip文件格式计算节点的预期。

记住你的应用程序启动时计算节点。你需要结构的zip文件,允许你的应用被称为正常。

部署二进制文件

部署二进制文件,我们有一个五步的过程,都在一个方法:

0找出你想推版

如果这是一直手动设置,你可以跳过这一步。帮助自动化,然而,你需要抓住当前设置默认版本。我还没有找到一种方法,得到这个特定值的API,所以我使用的作用在名单上的应用程序,您可以从API。

作用并不适用于所有版本格式。我有麻烦排序-例如1.1.0_test和1.1.0.test之间。后者是一种更容易理解的版本,牢记这一点。确保所有应用程序版本遵循相同的格式。我创建了自己的迷你解析函数当我们发现这种情况下,如果作用返回一个意想不到的或unparseable版本。

  1. 把应用程序包中引用

我们必须让Azure批知道我们要推出一些新的二进制文件。为此,我们使用application_package。create ()函数。作为回报,我们得到:

  • file_name我们应该推动:应用程序的名称
  • 容器我们需要推动:blob容器
  • sas_token:我们提供的SAS令牌可以用来推动容器
创建应用程序资源,并得到所需的存储细节

2将二进制文件

我们现在可以使用上面的细节我们将Azure批希望我们的二进制文件。

这里我用一个存储账户关键因为我创建一个BlockBlobService客户机,但是您还可以使用SAS Azure提供的令牌。

3启动应用程序

提供版本号部署,您现在可以设置新上传的应用程序将使用默认的应用程序池。

第一个激活:

然后设置为默认值:

allow_updates将允许您覆盖这个应用程序的二进制文件的版本。

4重新启动计算节点

获得最新的二进制文件的节点,我们需要重新启动计算节点。compute节点(s),第一个电话compute_node.list ()方法:

得到节点的列表在你的游泳池。service_client_dev批服务客户端

然后,您将需要得到每个计算节点的id。我们只有一个池,所以很容易在我们的案例中。您的代码将不同如果你有超过一个节点:

得到节点id的所有计算节点在你的游泳池

现在你可以重启各个节点:

如果你担心在运行时重新启动节点任务或不可用,你可以等他们准备好:

_wait_for_pool()是一个简单的自定义函数,等待节点成为“闲置”。

你可以用这种方法计算节点的状态:

您还可以调整池包括更多的节点,并指定计算节点应该怎么处理当前运行的任务:

这是相当多的。池重启需要一些时间,所以您可能希望添加一些逻辑来等待它完成任务开始。

作为奖励,你就可以把这一自动化CI / CD平台和汽车在夜间或公关构建部署代码。对于我们的夜间,我们只是部署、测试和恢复版本。PRs,我们部署和保留新状态,如果测试通过。

满Copy-able代码列表

计算节点获得最新的版本

def _get_latest_app_version (batch_client app_id):
”“”
批处理应用程序的名称,返回最新版本使用。
注意:这里的假设是,最新的版本是一个设置为默认的版本。的作用将排序
版本不顾大多数格式,并返回有序列表。
:param batch_client:批处理客户端
:param app_id:应用程序的名称
返回:最新版本出现在应用程序的应用程序包的列表
”“”
pool_item = batch_client.application.get (app_id)
logger.debug(作用(pool_item.versions))
返回的作用(pool_item.versions) [1]

创建应用程序资源

app_object = mgt_client.application_package.create (
< ResourceGroupName >,
< BatchAccountName >,
< BatchApplicationName >,
< VersionToDeploy >)
项= app_object.storage_url.split (“/”)
sas_token =项目[1].split (' ? ') [1]
file_name =项目[1].split (' ? ') [0]
容器=项目[3]

上传应用程序二进制文件

blob_client = azureblob.BlockBlobService (
< StorageAccountName >、< StorageAccountKey)
#使用数据从之前的代码块。
blob_client.create_blob_from_path (< ContainerName >,
< BlobName >,
< PathToZipFile >)

启动应用程序

mgt_client.application_package.activate (
< ResourceGroupName >,
< BatchAccountName >,
< ApplicationName >,
< VersionToActivate >,
格式=“zip”)

应用程序设置为默认

mgt_client.application。更新(< ResourceGroupName >、< BatchAccountName >,
< ApplicationName >参数= {
“default_version”: < VersionToSetDefault >,
“allow_updates”:没错,
“display_name”: < VersionToSetDefault >
})

池中得到的节点列表

batch_service_client.compute_node.list (< BatchPoolName >)

重新启动计算节点

batch_service_client.compute_node.reboot (
< BatchPoolName >、< ComputeNodeID >)

调整一个游泳池

def _resize_pool (batch_service_client、pool_id pool_vm_count = 1, node_deallocation_option = taskCompletion, resize_timeout = 15):
”“”
调整一个给定的池,给定的节点的数量。

:param batch_service_client:批处理服务客户端
:param pool_id:池的ID来调整
:param pool_vm_count:调整节点的数目
:param node_deallocation_option:如何处理当前的任务可能会运行在节点上。
:param resize_timeout:要等多长时间才能调整时抛出异常。
”“”

resize_settings = batch_client.models。PoolResizeParameter (target_dedicated_nodes = pool_vm_count,
resize_timeout = resize_timeout,
node_deallocation_option = node_deallocation_option)
试一试:
old_pool = batch_service_client.pool.get (pool_id)
batch_service_client.pool。调整(pool_id pool_resize_parameter = resize_settings)
time . sleep (2)
_wait_pool_allocation (old_pool batch_service_client resize_timeout)
batchmodels除外。BatchErrorException犯错:
_print_batch_exception (err)
提高

有用的链接

如果有人有更好的解决方案,改进或评论,我欢迎他们。希望这是有帮助的。

- - -

- - -

得到了媒介的应用betway娱乐官网

Baidu