为部署组预配代理

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

对于部署,可利用部署组轻松定义目标计算机的逻辑组,还可在各计算机上安装所需的代理。 本文介绍了如何创建部署组,以及如何在部署组中的每个虚拟机或物理计算机上安装和预配代理。

可以通过以下任一方式安装代理:

有关代理和管道的信息,请参阅:

在目标服务器上运行安装脚本

  1. 在 Azure Pipelines 的“部署组”选项卡中,选择“+新建”以创建新组。

  2. 输入组的名称和可选的说明,然后选择“创建”。

  3. 在下一页的“使用命令行注册计算机”部分中,选择目标计算机操作系统。

  4. 选择“使用脚本中的个人访问令牌进行身份验证”。 了解详细信息

  5. 选择“将脚本复制到剪贴板”。

  6. 使用具有相应权限的帐户依次登录到每台目标计算机,然后:

    • 打开管理员 PowerShell 命令提示符,粘贴复制的脚本,然后执行该脚本以将计算机注册到此组。

    • 如果在运行脚本时遇到错误,指出无法创建安全通道,请在管理员 PowerShell 提示符下执行此命令:

      [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

    • 当系统提示为代理配置标记时,按 Y 并输入任何标记(你用来标识组中用于部分部署的计算机子集)。

      当在“在计算机组上运行”作业中使用部署组时,可通过你分配的标记将部署限制到特定的服务器上。

    • 当系统提示输入用户帐户时,请按 Return 接受默认值。

    • 等待脚本完成并显示消息 Service vstsagent.{organization-name}.{computer-name} started successfully

  7. 在 Azure Pipelines 的“部署组”页中,打开“计算机”选项卡并验证代理是否正在运行。 如果配置的标记不可见,请刷新页面。

安装 Azure Pipelines 代理 Azure VM 扩展

  1. 在 Azure Pipelines 的“部署组”选项卡中,选择“+新建”以创建新组。

  2. 输入组的名称和可选的说明,然后选择“创建”。

  3. 在 Azure 门户,对于将包含在部署组中的每个 VM,打开“扩展”边栏选项卡,选择“+ 添加”以打开“新建资源”列表,然后选择“Azure Pipelines 代理”。

    安装 Azure Pipelines 代理扩展

  4. 在“安装扩展”边栏选项卡中,指定要使用的 Azure Pipelines 订阅的名称。 例如,如果 URL 为 https://dev.azure.com/contoso,则只需指定 contoso。

  5. 指定项目名称和部署组名称。

  6. (可选)指定代理的名称。 如果未指定,则使用追加了 -DG 的 VM 名称。

  7. 输入用于对 Azure Pipelines 进行身份验证的个人访问令牌 (PAT)

  8. (可选)指定将在代理上配置标记列表(以逗号分隔)。 标记不区分大小写,每个标记不得超过 256 个字符。

  9. 选择“确定”,开始在此 VM 上安装代理。

  10. 将扩展添加到要包含在此部署组中的任何其他 VM。

使用 ARM 模板部署任务

重要

这些说明参考了任务版本 2。 将“任务版本”从 3 切换到 2。

可以使用 ARM 模板部署任务部署 Azure 资源管理器 (ARM) 模板,该模板在创建虚拟机时安装 Azure Pipelines 代理 Azure VM 扩展,或者在创建虚拟机后更新资源组以应用扩展。 或者,可以使用 ARM 模板部署任务的高级部署选项将代理部署到部署组。

使用 ARM 模板安装“Azure Pipelines 代理”Azure VM 扩展

ARM 模板是一个 JSON 文件,其以声明方式定义一组 Azure 资源。 Azure 可以自动读取模板和预配的资源。 在单个模板中,可以部署多个服务及其依赖项。

对于 Windows VM,请创建 ARM 模板并在 Microsoft.Compute/virtualMachine 资源下添加资源元素,如下所示:

"resources": [
  {
    "name": "[concat(parameters('vmNamePrefix'),copyIndex(),'/TeamServicesAgent')]",
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "location": "[parameters('location')]",
    "apiVersion": "2015-06-15",
    "dependsOn": [
        "[resourceId('Microsoft.Compute/virtualMachines/',
                      concat(parameters('vmNamePrefix'),copyindex()))]"
    ],
    "properties": {
      "publisher": "Microsoft.VisualStudio.Services",
      "type": "TeamServicesAgent",
      "typeHandlerVersion": "1.0",
      "autoUpgradeMinorVersion": true,
      "settings": {
        "VSTSAccountName": "[parameters('VSTSAccountName')]",
        "TeamProject": "[parameters('TeamProject')]",
        "DeploymentGroup": "[parameters('DeploymentGroup')]",
        "AgentName": "[parameters('AgentName')]",
        "AgentMajorVersion": "auto|2|3",
        "Tags": "[parameters('Tags')]"
      },
      "protectedSettings": {
      "PATToken": "[parameters('PATToken')]"
     }
   }
  }
]

注意

在 Azure DevOps Server 2022 中,AgentMajorVersion 允许的值为 auto|N。 在 Azure DevOps Server 2022.1 及更高版本中,AgentMajorVersion 允许的值为 auto|2|3

"resources": [
  {
    "name": "[concat(parameters('vmNamePrefix'),copyIndex(),'/TeamServicesAgent')]",
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "location": "[parameters('location')]",
    "apiVersion": "2015-06-15",
    "dependsOn": [
        "[resourceId('Microsoft.Compute/virtualMachines/',
                      concat(parameters('vmNamePrefix'),copyindex()))]"
    ],
    "properties": {
      "publisher": "Microsoft.VisualStudio.Services",
      "type": "TeamServicesAgent",
      "typeHandlerVersion": "1.0",
      "autoUpgradeMinorVersion": true,
      "settings": {
        "VSTSAccountName": "[parameters('VSTSAccountName')]",
        "TeamProject": "[parameters('TeamProject')]",
        "DeploymentGroup": "[parameters('DeploymentGroup')]",
        "AgentName": "[parameters('AgentName')]",
        "AgentMajorVersion": "auto|N",
        "Tags": "[parameters('Tags')]"
      },
      "protectedSettings": {
      "PATToken": "[parameters('PATToken')]"
     }
   }
  }
]

其中:

  • VSTSAccountName 是必需的。 要使用的 Azure Pipelines 订阅。 示例:如果 URL 为 https://dev.azure.com/contoso,只需指定 contoso
  • TeamProject 是必需的。 在其中定义了部署组的项目
  • DeploymentGroup 是必需的。 将对其注册部署代理的部署组
  • AgentName 是可选的。 如果未指定,将使用追加了 -DG 的 VM 名称
  • 标记是可选的。 将在代理上设置的标记列表(以逗号分隔)。 标记不区分大小写,每个标记不得超过 256 个字符。
  • PATToken 是必需的。 个人访问令牌,用于对 Azure Pipelines 进行身份验证,以下载和配置代理

注意

如果要部署到 Linux VM,请确保代码中的 type 参数为 TeamServicesAgentLinux

扩展疑难解答

以下是扩展的一些已知问题:

  • 状态文件变得过大:Windows VM 上出现了此问题;尚未在 Linux VM 上发现此问题。 状态文件包含描述扩展的当前状态的 JSON 对象。 对象是一个占位符,用于列出到目前为止执行的操作。 Azure 读取此状态文件,并将状态对象作为对 API 请求的响应进行传递。 文件具有允许的最大大小;如果大小超过阈值,则 Azure 无法完全读取,并给出状态错误。 每次计算机重新启动时,扩展都会执行一些操作(即使它可能之前安装成功),这会追加状态文件。 如果计算机多次重新启动,状态文件大小将超过阈值,从而导致此错误。 错误消息内容为:Handler Microsoft.VisualStudio.Services.TeamServicesAgent:1.27.0.2 status file 0.status size xxxxxx bytes is too big. Max Limit allowed: 131072 bytes。 请注意,扩展安装可能已成功,但此错误会隐藏扩展的实际状态。

    我们已经针对计算机重新启动修复了此问题(Windows 扩展的版本 1.27.0.2,Linux 扩展的版本 1.21.0.1),因此在重新启动时,不会向状态文件中添加任何内容。 如果在进行修复之前,你的扩展就已经存在此问题(即,你的早期版本的扩展已经存在此问题),并且你的扩展自动更新到具有修复的版本,那么该问题仍然会存在。 这是因为在扩展更新时,较新版本的扩展仍适用于之前的状态文件。 目前,如果你将扩展的某个之前版本与用于关闭次要版本自动更新的标志一起使用,或者如果将较大的状态文件从之前的扩展版本传送到包含修复程序的较新版本,或者出于任何其他原因,你可能仍然会遇到此问题。 如果是这种情况,可以通过卸载并重新安装扩展来解决此问题。 卸载扩展会清理整个扩展目录,因此会为全新安装创建新的状态文件。 您需要安装最新版本的扩展。 此解决方案是一种永久性修复措施,在遵循此解决方案后,应该不会再次遇到此问题。

  • 自定义数据的问题:此问题与扩展无关,但某些客户在切换操作系统版本时报告了有关 VM 上的自定义数据位置的混淆。 建议使用以下解决方法。 Python 2 已弃用,因此我们已将扩展与 Python 3 配合使用。 如果仍在使用较低版本的操作系统(默认未安装 Python 3),那么要运行扩展,应在 VM 上安装 Python 3,或切换到默认安装了 Python 3 的操作系统版本。 在 Linux VM 上,对于较低 Microsoft Azure Linux 代理版本,自定义数据将复制到 /var/lib/waagent/ovf-env.xml 文件,对于较新的 Microsoft Azure Linux 代理版本,则将复制到 /var/lib/waagent/CustomData 文件。 如果客户仅对这两个路径中的其中一个进行硬编码,那么客户在切换操作系统版本时似乎会遇到问题,因为这个文件在新的操作系统版本上不存在,但另一个文件存在。 因此,为了避免中断 VM 预配,应同时考虑模板中的两个文件,以便如果一个失败,另一个应成功。

有关 ARM 模板的详细信息,请参阅在 Azure 资源管理器模板中定义资源

要使用模板:

  1. 在 Azure Pipelines 的“部署组”选项卡中,选择“+新建”以创建新组。

  2. 输入组的名称和可选的说明,然后选择“创建”。

  3. 在 Azure Pipelines 的“发布”选项卡中,创建包含“ARM 模板部署”任务的阶段的发布管道。

  4. 提供任务所需的参数,例如 Azure 订阅、资源组名称、位置和模板信息,然后保存发布管道。

  5. 从发布管道创建发布以安装代理。

使用高级部署选项安装代理

  1. 在 Azure Pipelines 的“部署组”选项卡中,选择“+新建”以创建新组。

  2. 输入组的名称和可选的说明,然后选择“创建”。

  3. 在 Azure Pipelines 的“发布”选项卡中,创建包含“ARM 模板部署”任务的阶段的发布管道。

  4. 选择任务并展开“虚拟机的高级部署选项”部分。 配置此部分中的参数,如下所示:

    • 启用先决条件:选择“使用部署组代理进行配置”。

    • Azure Pipelines/TFS 终结点:选择指向目标的现有 Team Foundation Server/TFS 服务连接。 部署组的代理注册需要具有 Visual Studio 项目的访问权限。 如果没有现有的服务连接,请选择“添加”并立即创建一个。 将其配置为个人访问令牌 (PAT),并将作用域限定为“部署组”。

    • 项目:指定包含部署组的项目。

    • 部署组:指定要对其注册代理的部署组的名称。

    • 将 Azure VM 标记复制到代理:设置(勾选)时,Azure VM 上已配置的任何标记都将复制到相应的部署组代理。 默认情况下,使用 Key: Value 格式复制所有 Azure 标记。 例如,Role: Web

  5. 提供任务所需的其他参数,例如 Azure 订阅、资源组名称和位置,然后保存发布管道。

  6. 从发布管道创建发布以安装代理。

帮助和支持