将现有基于代理的混合辅助角色迁移到基于扩展的混合辅助角色

重要

Azure 自动化基于代理的用户混合 Runbook 工作者(Windows 和 Linux)已于 2024 年 8 月 31 日停用,不再受支持。 请按照本文中有关如何从现有的基于代理的用户混合 Runbook 辅助角色迁移到基于扩展的混合辅助角色的指南进行操作。

本文介绍基于扩展的用户混合 Runbook 辅助角色的优势,以及如何将现有基于代理的用户混合 Runbook 辅助角色迁移到基于扩展的混合辅助角色。

Azure 自动化支持两种 Hybrid Runbook Workers 安装平台:

  • 基于代理的混合 Runbook 辅助角色 (V1) - 基于代理的混合 Runbook 辅助角色依赖于 Log Analytics 代理
  • 基于扩展的混合运行手册工作角色 (V2) - 基于扩展的混合运行手册工作角色通过虚拟机(VM)扩展框架实现对混合运行手册工作角色的本地集成。 

在混合 Runbook 工作器上运行 Runbook 的过程对于这两个平台来说是相同的。

扩展基础的用户混合运行手册工作者相比代理基础的工作者的优势

基于扩展的方法旨在简化混合辅助角色的安装和管理,并消除使用基于代理的版本的复杂性。 下面是一些主要优势:

  • 无缝部署 - 基于代理的混合 Runbook 工作者的部署方法依赖于 Log Analytics 代理,此过程步骤多、耗时且容易出错。 基于扩展的方法提供更高的安全性,并且不再依赖于 Log Analytics 代理。

  • 易于管理 - 提供与 Azure 资源管理器(ARM)身份和混合运行手册辅助角色的本机集成,通过策略和模板为大规模治理提供灵活性。

  • 基于 Microsoft Entra ID 的身份验证 - 该方法使用 Microsoft Entra ID 提供的 VM 系统分配的托管标识。 这将集中控制和管理标识和资源凭据。

  • 统一体验 - 为管理 Azure 和启用了 Arc 的非 Azure 计算机提供相同的体验。

  • 多个加入渠道 - 可以选择通过 Azure 门户、PowerShell cmdlet、Bicep、ARM 模板、REST API 和 Azure CLI 来加入和管理基于扩展的辅助角色。

  • 默认自动升级 - 默认提供次要版本的自动升级,大大降低了保持最新版本更新的可管理性。 建议启用自动升级,以利用任何安全或功能更新,免除人工开销。 您也可以随时选择退出自动升级。 当前不支持任何主版本升级,应对其进行手动管理。

注意

基于扩展的混合 Runbook 辅助角色仅支持用户混合 Runbook 辅助角色类型,不包括更新管理功能所需的系统混合 Runbook 辅助角色。

先决条件

计算机最低要求

  • 双核
  • 4 GB RAM
  • 非 Azure 计算机必须已安装 Azure Connected Machine 代理。 若要安装AzureConnectedMachineAgent,请参阅适用于已启用 Arc 的服务器文章从 Azure 门户将混合计算机连接到 Azure
  • 必须在 Azure 虚拟机或已启用 Arc 的服务器上启用系统分配的托管标识。 如果未启用系统分配的托管标识,将在安装过程中通过 Azure 门户启用它。

支持的操作系统

Windows (x64) Linux (x64)
● Windows Server 2022(包括 Server Core)
● Windows Server 2019(包括 Server Core)
● Windows Server 2016 版本 1709 和 1803(不包括 Server Core)
● Windows Server 2012、2012 R2(不包括 Server Core)
● Windows 10 企业版(包括多会话)和专业版
• Windows 11 企业版(包括多会话)和专业版
● Debian GNU/Linux 8、9、10 和 11
● Ubuntu 18.04 LTS, 20.04 LTS 和 22.04 LTS
● SUSE Linux Enterprise Server 15.2、15.3、15.4、15.5 和 15.6
● Red Hat Enterprise Linux Server 7、8 和 9
● Rocky Linux 9
● Oracle Linux 7、8 和 9
混合工作者扩展将遵循操作系统供应商的支持时间线

其他要求

Windows (x64) Linux (x64)
Windows PowerShell 5.1(下载 WMF 5.1)。 不支持 PowerShell Core。 不得启用 Linux 强化。 
.NET Framework 4.6.2 或更高版本。 

适用于 Linux 的包要求

所需程序包 说明 最低版本
Glibc GNU C 库 2.5-12
OpenSSL OpenSSL 库 1.0(支持 TLS 1.1 和 TLS 1.2)
卷曲 cURL Web 客户端 7.15.5
Python-ctypes 适用于 Python 的外部函数库 需要 Python 2.x 或 Python 3.x
PAM 可插入验证模块
可选包 说明 最低版本
PowerShell Core 若要运行 PowerShell runbook,需要安装 PowerShell Core。 有关说明,请参阅在 Linux 上安装 PowerShell Core 6.0.0

混合工作者凭据的权限

如果基于扩展的混合辅助角色使用自定义混合辅助角色凭据,请确保向自定义用户分配以下文件夹权限,以避免作业暂停。

资源类型 文件夹权限
Azure VM C:\Packages\Plugins\Microsoft.Azure.Automation.HybridWorker.HybridWorkerForWindows(读取并执行)

注意

  • 当前,虚拟机规模集 (VMSS) 不支持混合 Runbook Worker。

将现有基于代理的混合辅助角色迁移到基于扩展的混合辅助角色

若要利用基于扩展的混合辅助角色的优势,必须将所有现有基于代理的用户混合辅助角色迁移到基于扩展的辅助角色。 混合工作机可以在基于代理 (V1) 和基于扩展 (V2) 的平台上共存。 基于扩展的安装不会影响基于代理的工作进程的安装或管理。

若要在基于代理的现有混合辅助角色上安装混合辅助角色扩展,请确保在执行以下步骤之前满足先决条件

  1. 在“流程自动化”下选择“混合工作组”,然后选择您现有的混合工作组,进入“混合工作组”页面。

  2. 在“混合工作组”下,选择“混合工作者”然后点击“+ 添加”以转到“将计算机添加为混合工作者”页面。

  3. 选中现有“基于代理(V1)”的混合工作器旁边的复选框。 如果你的基于代理的混合辅助角色未列出,请确保该计算机上已安装 Azure Arc Connected Machine Agent。 若要安装AzureConnectedMachineAgent,请参阅适用于已启用 Arc 的服务器文章从 Azure 门户将混合计算机连接到 Azure

    将设备添加为混合工作器的屏幕截图。

  4. 选择“添加”将计算机附加到组中。

    “平台”列将同一混合工作器显示为“基于代理 (V1)”和“基于扩展 (V2)”。 熟练使用基于扩展的混合辅助角色体验后,可以删除基于代理的辅助角色。

    显示基于代理或基于扩展的混合辅助角色的平台字段的屏幕截图。

要大规模迁移多个基于代理的混合辅助角色,还可以使用其他渠道,例如 Bicep、ARM 模板、PowerShell cmdlet、REST API 和 Azure CLI。

使用 Bicep 和 ARM 模板、REST API、Azure CLI 和 PowerShell 管理混合辅助角色扩展

注意

Windows Server 2008 和 Windows Server 2008 R2 已停止支持(EOS)。 有关详细信息,请参阅对 Windows Server 2008 和 Windows Server 2008 R2 的支持结束就地升级到 Windows Server 2016、2019、2022 或 2025。 相应地查看使用情况和计划 OS 升级和迁移。

可以使用 Bicep 文件创建新的混合辅助角色组,创建新的 Azure Windows VM 并将其添加到现有的混合辅助角色组。 详细了解 Bicep

按照下面提到的作为示例的步骤进行操作:

  1. 创建混合工作组。
  2. 创建 Azure VM 或已启用 Arc 的服务器。 也可使用现有的 Azure VM 或已启用 Arc 的服务器。
  3. 将 Azure VM 或已启用 Arc 的服务器连接到上面创建的混合辅助角色组。
  4. 生成新的 GUID 并将其作为混合工作器的名称使用。
  5. 在 VM 上启用系统分配的托管标识。
  6. 在 VM 上安装混合辅助角色扩展。
  7. 若要确认扩展是否已成功安装在 VM 上,请在“Azure 门户”中转到“VM”“扩展”选项卡并检查安装在 VM 上的混合辅助角色扩展的状态。
param automationAccount string
param automationAccountLocation string
param workerGroupName string

@description('Name of the virtual machine.')
param virtualMachineName string

@description('Username for the Virtual Machine.')
param adminUsername string

@description('Password for the Virtual Machine.')
@minLength(12)
@secure()
param adminPassword string

@description('Location for the VM.')
param vmLocation string = 'China North 3'

@description('Size of the virtual machine.')
param vmSize string = 'Standard_DS1_v2'

@description('The Windows version for the VM. This will pick a fully patched image of this given Windows version.')
@allowed([
  '2008-R2-SP1'
  '2012-Datacenter'
  '2012-R2-Datacenter'
  '2016-Datacenter-with-Containers'
  '2016-Datacenter'
  '2019-Datacenter'
  '2019-Datacenter-Core'
  '2019-Datacenter-Core-smalldisk'
  '2019-Datacenter-Core-with-Containers'
  '2019-Datacenter-Core-with-Containers-smalldisk'
  '2019-Datacenter-smalldisk'
  '2019-Datacenter-with-Containers'
  '2019-Datacenter-with-Containers-smalldisk'
])
param osVersion string = '2019-Datacenter'

@description('DNS name for the public IP')
param dnsNameForPublicIP string

var nicName_var = 'myVMNict'
var addressPrefix = '10.0.0.0/16'
var subnetName = 'Subnet'
var subnetPrefix = '10.0.0.0/24'
var subnetRef = resourceId('Microsoft.Network/virtualNetworks/subnets', virtualNetworkName_var, subnetName)
var vmName_var = virtualMachineName
var virtualNetworkName_var = 'MyVNETt'
var publicIPAddressName_var = 'myPublicIPt'
var networkSecurityGroupName_var = 'default-NSGt'
var UniqueStringBasedOnTimeStamp = uniqueString(resourceGroup().id)

resource publicIPAddressName 'Microsoft.Network/publicIPAddresses@2020-08-01' = {
  name: publicIPAddressName_var
  location: vmLocation
  properties: {
    publicIPAllocationMethod: 'Dynamic'
    dnsSettings: {
      domainNameLabel: dnsNameForPublicIP
    }
  }
}

resource networkSecurityGroupName 'Microsoft.Network/networkSecurityGroups@2020-08-01' = {
  name: networkSecurityGroupName_var
  location: vmLocation
  properties: {
    securityRules: [
      {
        name: 'default-allow-3389'
        properties: {
          priority: 1000
          access: 'Allow'
          direction: 'Inbound'
          destinationPortRange: '3389'
          protocol: 'Tcp'
          sourceAddressPrefix: '*'
          sourcePortRange: '*'
          destinationAddressPrefix: '*'
        }
      }
    ]
  }
}

resource virtualNetworkName 'Microsoft.Network/virtualNetworks@2020-08-01' = {
  name: virtualNetworkName_var
  location: vmLocation
  properties: {
    addressSpace: {
      addressPrefixes: [
        addressPrefix
      ]
    }
    subnets: [
      {
        name: subnetName
        properties: {
          addressPrefix: subnetPrefix
          networkSecurityGroup: {
            id: networkSecurityGroupName.id
          }
        }
      }
    ]
  }
}

resource nicName 'Microsoft.Network/networkInterfaces@2020-08-01' = {
  name: nicName_var
  location: vmLocation
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            id: publicIPAddressName.id
          }
          subnet: {
            id: subnetRef
          }
        }
      }
    ]
  }
  dependsOn: [

    virtualNetworkName
  ]
}

resource vmName 'Microsoft.Compute/virtualMachines@2020-12-01' = {
  name: vmName_var
  location: vmLocation
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    hardwareProfile: {
      vmSize: vmSize
    }
    osProfile: {
      computerName: vmName_var
      adminUsername: adminUsername
      adminPassword: adminPassword
    }
    storageProfile: {
      imageReference: {
        publisher: 'MicrosoftWindowsServer'
        offer: 'WindowsServer'
        sku: osVersion
        version: 'latest'
      }
      osDisk: {
        createOption: 'FromImage'
      }
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: nicName.id
        }
      ]
    }
  }
}

resource automationAccount_resource 'Microsoft.Automation/automationAccounts@2021-06-22' = {
  name: automationAccount
  location: automationAccountLocation
  properties: {
    sku: {
      name: 'Basic'
    }
  }
}

resource automationAccount_workerGroupName 'Microsoft.Automation/automationAccounts/hybridRunbookWorkerGroups@2022-02-22' = {
  parent: automationAccount_resource
  name: workerGroupName
  dependsOn: [

    vmName
  ]
}

resource automationAccount_workerGroupName_testhw_UniqueStringBasedOnTimeStamp 'Microsoft.Automation/automationAccounts/hybridRunbookWorkerGroups/hybridRunbookWorkers@2021-06-22' = {
  parent: automationAccount_workerGroupName
  name: guid('testhw', UniqueStringBasedOnTimeStamp)
  properties: {
    vmResourceId: resourceId('Microsoft.Compute/virtualMachines', virtualMachineName)
  }
  dependsOn: [
    vmName
  ]
}

resource virtualMachineName_HybridWorkerExtension 'Microsoft.Compute/virtualMachines/extensions@2022-03-01' = {
  name: '${virtualMachineName}/HybridWorkerExtension'
  location: vmLocation
  properties: {
    publisher: 'Microsoft.Azure.Automation.HybridWorker'
    type: 'HybridWorkerForWindows'
    typeHandlerVersion: '1.1'
    autoUpgradeMinorVersion: true
    enableAutomaticUpgrade: true
    settings: {
      AutomationAccountURL: automationAccount_resource.properties.automationHybridServiceUrl
    }
  }
  dependsOn: [
    vmName
  ]
}

output output1 string = automationAccount_resource.properties.automationHybridServiceUrl

删除基于代理的混合辅助角色

  1. 在管理员模式下打开 PowerShell 会话,并运行以下命令:

     Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\HybridRunbookWorker\<AutomationAccountID>\<HybridWorkerGroupName>" -Force -Verbose
    
  2. 在“流程自动化”下选择“混合辅助角色组”,然后选择你的混合辅助角色组转到“混合辅助角色组”页 。

  3. 在“混合工作人员组”下,选择“混合工作人员”。

  4. 选中要删除的计算机旁边的复选框,以便从混合工作者组中移除。

  5. 选择“删除”以删除基于代理的 Windows 混合辅助角色。

    注意

    • 在自动化帐户中禁用私有链接后,可能最多需要60分钟才能删除混合 Runbook 工作器。
    • 在删除混合工作器后,计算机上的混合工作器身份验证证书的有效期为 45 分钟。

后续步骤