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

重要

Azure 自动化基于代理的用户混合 Runbook 辅助角色(Windows 和 Linux)将于 2024 年 8 月 31 日停用,在此日期之后不再受支持。 必须在 2024 年 8 月 31 日之前将现有基于代理的用户混合 Runbook 辅助角色迁移到基于扩展的辅助角色。 此外,从 2023 年 11 月 1 日开始,将无法创建新的基于代理的混合辅助角色。 了解详细信息

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

Azure 自动化支持两个混合 Runbook 辅助角色安装平台:

  • 基于代理的混合 Runbook 辅助角色 (V1) - 基于代理的混合 Runbook 辅助角色依赖于 Log Analytics 代理
  • 基于扩展的混合 Runbook 辅助角色 (V2) - 基于扩展的混合 Runbook 辅助角色通过虚拟机 (VM) 扩展框架提供混合 Runbook 辅助角色的本机集成。 

在混合 Runbook 辅助角色上执行 Runbook 的过程对于这两个平台是相同的。

基于扩展的用户混合 Runbook 辅助角色相比基于代理的辅助角色的优势

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

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

  • 易于管理 - 与混合 Runbook 辅助角色的 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 Enterprise(包括多会话)和 Pro
● 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
● Red Hat Enterprise Linux Server 7、8 和 9
● CentOS Linux 7 和 8
● SUSE Linux Enterprise Server (SLES) 15
● Rocky Linux 9
● Oracle Linux 7 和 8
混合辅助角色扩展将遵循 OS 供应商的支持时间线。 

其他要求

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 cURL Web 客户端 7.15.5
Python-ctype 适用于 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(读取和执行)
已启用 Arc 的服务器 C:\ProgramData\AzureConnectedMachineAgent\Tokens(读取)
C:\Packages\Plugins\Microsoft.Azure.Automation.HybridWorker.HybridWorkerForWindows(读取和执行)

注意

虚拟机规模集 (VMSS) 目前不支持混合 Runbook 辅助角色。

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

若要利用基于扩展的混合辅助角色的优势,必须将所有现有基于代理的用户混合辅助角色迁移到基于扩展的辅助角色。 混合辅助角色计算机可以在“基于代理(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 管理混合辅助角色扩展

可以使用 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 分钟。

后续步骤