Azure批:Auto-Deploying批处理应用程序
将应用程序部署到Azure上没有胡说预排一批池
O不我的当前的项目正在与蔚蓝的批处理,我们使用毫升应用程序运行。当我搬到这支球队,部署这个应用程序是一个手动过程。我们必须运行一个脚本,手动设置的版本,这样每次我们需要推动开发或刺激的环境。我的工作之一是自动化这个过程——等等——我主要是做了,但不是没有一些工作。没有太多Python-centric文档可用,所以也许这可能帮助别人在他们的旅程。
T他是Python API文档。
我的目标是自动化部署,要做到这一点,我们需要看看批客户。微软将API结构分为两个不同的客户:
- 管理:管理批处理帐户、存储和帐户密钥
- 服务:管理计算节点、游泳池、任务和工作。
需求
我们需要几个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版本。
- 把应用程序包中引用
我们必须让Azure批知道我们要推出一些新的二进制文件。为此,我们使用application_package。create ()函数。作为回报,我们得到:
- file_name我们应该推动:应用程序的名称
- 容器我们需要推动:blob容器
- sas_token:我们提供的SAS令牌可以用来推动容器
2。将二进制文件
我们现在可以使用上面的细节我们将Azure批希望我们的二进制文件。
3。启动应用程序
提供版本号部署,您现在可以设置新上传的应用程序将使用默认的应用程序池。
第一个激活:
然后设置为默认值:
4。重新启动计算节点
获得最新的二进制文件的节点,我们需要重新启动计算节点。compute节点(s),第一个电话compute_node.list ()方法:
然后,您将需要得到每个计算节点的id。我们只有一个池,所以很容易在我们的案例中。您的代码将不同如果你有超过一个节点:
现在你可以重启各个节点:
如果你担心在运行时重新启动节点任务或不可用,你可以等他们准备好:
你可以用这种方法计算节点的状态:
您还可以调整池包括更多的节点,并指定计算节点应该怎么处理当前运行的任务:
这是相当多的。池重启需要一些时间,所以您可能希望添加一些逻辑来等待它完成任务开始。
作为奖励,你就可以把这一自动化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)
提高
有用的链接
如果有人有更好的解决方案,改进或评论,我欢迎他们。希望这是有帮助的。