Azure Local离线模式注册(系列篇之十)
1. 注册流程性质✅ 官方要求官方原文On a machine withinternet access, ensure that Azure CLI and Azure PowerShell are installed.Register 阶段必须在联网机器上一次性执行——是云端元数据登记本地环境依然完全离线。注册采用self-attestation自我声明流程声明硬件配置 → 推送到 Azure → 部署资源上的 banner 消失。 技术分析Register 阶段并不会改变本地 Azure Local 或 Appliance 的配置。它的作用是向 Azure Resource ManagerMicrosoft.EdgeResource Provider提交Hardware Settings 元数据。因此Appliance 仍保持Air-gapped完全离线Control Plane不建立长期 Azure 连接Register仅完成Azure Resource Metadata 更新这就是官方一句话背后的真正含义Register 是声明不是握手。 企业最佳实践Register建议在 Appliance 部署完成并验证正常后立即执行——便于后续 Support 链路打通保存本次 Register 的 PowerShell 输出和提交参数含$bodyJSON、响应 payload——便于后续扩容、审计、重新登记时比对如果管理集群发生硬件变更节点扩容、CPU/内存调整等应关注是否需要重新提交 Hardware Settings并以最新官方要求为准2. Self-Attestation 函数官方原文照搬function New-AzureLocalDisconnectedOperationsSelfAttestation { # .SYNOPSIS Registers your disconnected operations resource using a self-attestation flow. # [CmdletBinding()] param( [Parameter(Mandatory)] [ValidateSet(AzureCloud, AzureUSGovernment)] [string]$Cloud, [Parameter(Mandatory)] [string]$SubscriptionId, [Parameter(Mandatory)] [string]$ResourceGroup, [Parameter(Mandatory)] [string]$ResourceName, [Parameter(Mandatory)] [int]$TotalCores, [Parameter(Mandatory)] [int]$DiskSpaceInGb, [Parameter(Mandatory)] [int]$MemoryInGb, [Parameter(Mandatory)] [string]$Oem, [Parameter(Mandatory)] [string]$HardwareSku, [Parameter(Mandatory)] [int]$Nodes, [Parameter(Mandatory)] [string]$VersionAtRegistration, [Parameter(Mandatory)] [string]$SolutionBuilderExtension, [Parameter(Mandatory)] [string]$DeviceId, [string]$ApiVersion 2026-03-01-preview, [switch]$SkipLogin ) if (-not $SkipLogin) { Connect-AzAccount -EnvironmentName $Cloud -ErrorAction Stop | Out-Null } Select-AzSubscription -SubscriptionId $SubscriptionId -ErrorAction Stop | Out-Null function Get-BearerToken { param( [Parameter(Mandatory)] [ValidateSet(AzureCloud, AzureUSGovernment)] [string]$CloudEnvironment ) $resource switch ($CloudEnvironment) { AzureCloud { https://management.azure.com/ } AzureUSGovernment { https://management.usgovcloudapi.net/ } } $tokenResponse Get-AzAccessToken -ResourceUrl $resource -ErrorAction Stop $token $tokenResponse.Token if ($token -is [System.Security.SecureString]) { $plainTextToken [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($token)) } else { $plainTextToken $token } return Bearer $plainTextToken } $baseEndpoint switch ($Cloud) { AzureCloud { management.azure.com } AzureUSGovernment { management.usgovcloudapi.net } } $token Get-BearerToken -CloudEnvironment $Cloud Write-host Obtained authorization token $token. -ForegroundColor Green $uri https://$baseEndpoint/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroup/providers/Microsoft.Edge/disconnectedOperations/$ResourceName/hardwareSettings/default?api-version$ApiVersion $body { properties { totalCores $TotalCores diskSpaceInGb $DiskSpaceInGb memoryInGb $MemoryInGb oem $Oem hardwareSku $HardwareSku nodes $Nodes versionAtRegistration $VersionAtRegistration solutionBuilderExtension $SolutionBuilderExtension deviceId $DeviceId } } | ConvertTo-Json -Depth 5 Write-Host Creating HardwareSetting for $ResourceName... -ForegroundColor Cyan Write-Host PUT $uri -ForegroundColor DarkGray $response Invoke-RestMethod -Method Put -Uri $uri -Headers { Authorization $token Content-Type application/json } -Body $body Write-Host HardwareSetting created successfully. -ForegroundColor Green $response | ConvertTo-Json -Depth 10 } 技术分析Self-Attestation 实际执行流程整个函数实际上就是5 步标准 ARM REST API 调用——不是什么神秘Internet PC │ ▼ Connect-AzAccount │ ▼ Get-AzAccessToken │ ▼ Invoke-RestMethod (PUT) │ ▼ Azure Resource Manager │ ▼ Microsoft.Edge RP │ ▼ hardwareSettings/default即获取 OAuth Token →PUT一段 JSON → 写Microsoft.Edge/disconnectedOperations/.../hardwareSettings/default资源。本质就是 ARM REST API——没有远程探测、没有持续心跳、没有 TPM 验证。 技术分析Self-Attestation 不是 TPM Attestation也不是 Arc RegistrationSelf-Attestation不是TPM Attestation也不是Azure Stack HCI 的 Arc Registration。它只是用户主动声明Self Declare当前管理集群的硬件配置并提交给 Azure Resource Provider作为 Disconnected Operations Resource 的资产信息。因此微软当前并不会在 Register 阶段主动远程验证本地硬件而是依据用户提交的数据完成资源登记。这是根据 ARM Resource Provider 的调用方式得出的技术分析整个流程只执行了一次PUT到hardwareSettings没有后续对本地环境的远程探测或持续连接。这种分析既符合脚本实现也能帮助读者理解 Self-Attestation 的真正含义而不是把它误认为远程度量证明或硬件可信验证。3. 调用参数示例官方原文# Modify these to fit your disconnected operations resource. # DeviceId 可以通过 Get-ApplianceInstanceConfiguration 在已部署环境获取 $params { Cloud AzureCloud SubscriptionId ResourceGroup ResourceName TotalCores 320 # 总物理核 DiskSpaceInGb 2000 # 管理集群总磁盘 MemoryInGb 2000 # 总内存 Oem # Dell / Lenovo / HPE HardwareSku # AX-760 / MX 655 Nodes 10 # 管理节点数 VersionAtRegistration 2602.2.32510 SolutionBuilderExtension x.y.z DeviceId # 从 portal 拷贝 ApiVersion 2026-03-01-preview } New-AzureLocalDisconnectedOperationsSelfAttestation params 技术分析参数语义精解参数官方示例值实际含义常见误填TotalCores320整个管理集群所有节点的物理 CPU Core 总数——不是Logical Processor含 HT误填 logical processor640DiskSpaceInGb2000管理集群可用于 Azure Local 的总物理容量GB——不是管理集群总磁盘误填总磁盘——Disk物理盘和 Capacity可用容量不是一回事MemoryInGb2000所有节点物理内存总和——不是可用内存误填 free memoryOemDell/Lenovo/HPE—HardwareSkuOEM catalog 中的具体 SKU例AX-760/MX 655—Nodes10管理节点数—VersionAtRegistration2602.2.32510应与 Appliance / Operations Module / Azure Local Build 保持一致误填 2601实际 Appliance 2602→ 部署验证可能失败SolutionBuilderExtensionx.y.zOEM Solution Builder 提供的扩展版本号—DeviceId来自已部署的 Appliance不是用户手工填写误以为需要自己生成ApiVersion2026-03-01-previewARM API 版本以官方 Register 文档为准— 企业最佳实践TotalCores不要包含 Hyper-Threading 后的逻辑核——按物理核统计例3 节点 × 32 物理核 × HT 关闭 96不是 192DiskSpaceInGb要扣除 RAID/热备/系统保留后的净可用容量——这才是可用于 Azure Local 的总物理容量VersionAtRegistration必须在 Register之前从已部署的 Appliance 读取详见 deploy-appliance.md § 版本一致性保存完整 JSON body 和 response payload——便于后续审计/扩容4. 成功标志✅ 官方要求控制台输出Hardware setting created successfully.Azure Portal 上的 banner消失Portal 上资源的硬件属性填充为登记信息 技术分析真正的成功标准Portal Banner 只是 UI 表现——真正成功标准是ARM 资源可读# 验证 1GET hardwareSettings 应返回 200 OK 实际数据 $uri https://management.azure.com/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroup/providers/Microsoft.Edge/disconnectedOperations/$ResourceName/hardwareSettings/default?api-version$ApiVersion Invoke-RestMethod -Method Get -Uri $uri -Headers { Authorization $token }200 OK JSON body→ 资源登记成功404 Not Found→ Register 未生效或资源名错误409 Conflict→ 资源已存在但状态冲突Portal只是UI 表现ARM 才是真理。 企业最佳实践Register 完成后立即跑一次GET验证——确认 ARM 端状态一致保留 GET 响应 payload——与提交时的$bodyJSON 一起存档如果 Portal UI 出现延迟极端场景以ARMGET结果为准5. 为什么必须联网官方只说On a machine withinternet access... 技术分析联网边界分析真正需要联网的是Connect-AzAccountOAuth 登录Get-AzAccessToken拿 Bearer TokenInvoke-RestMethodPUT 到management.azure.com整个Appliance 本身完全不用联网——无论是Install-Appliance、日常运维、Control Plane 通信都不依赖 Azure。因此Air-gapped 模式并没有被破坏——只是 Register 阶段临时借用一台 Internet PC完成元数据登记。很多客户最关心这一点——Register 是声明动作不是持续握手。 企业最佳实践选择临时出站的 Internet PC——可以是 DMZ 的跳板机不推荐用管理集群节点直接出站Register 完成后立即恢复网络隔离——Internet PC 拔网线或重置防火墙保存 Register 时间戳——便于后续审计何时向 Azure 声明了这些硬件6. Register 背后的技术原理官方没有提供 Register 阶段的架构图——但理解数据流有助于排查 Register 失败理解 Self-Attestation 的局限评估 Air-gapped 合规性关键解读数据流是单向的——只有 Internet PC → Azure 的出站Appliance 完全不参与DeviceId 是唯一关联——Internet PC 用 Appliance 提供的 DeviceId 完成 PUTAppliance 始终离线——Air-gapped 边界未被破坏Portal Banner 只是副作用——真正的成功是 ARM 端的hardwareSettings资源可读7. 技术分析官方未展开说明本节专门解释官方文档没有明说的技术原理按 ARM Resource Provider 行为推断。7.1 Register 是一次性还是周期性官方没说——但从 ARM Resource Provider 实现来看Register 本质是创建或更新Microsoft.Edge/disconnectedOperations/.../hardwareSettings资源。从 ARM RP 实现来看它属于资源元数据而不是周期性心跳因此通常只需首次完成 Register。如果硬件规模发生变化如节点扩容则可能需要重新更新Hardware Settings——以最新官方要求为准。7.2 Hardware Information 是否会校验官方没说。但从技术逻辑推断Hardware Settings 主要用于 Azure 对 Disconnected Operations Resource 的资产登记。因此TotalCores/MemoryInGb/DiskSpaceInGb应尽量与实际管理集群一致即使官方没有说明校验策略也不建议故意填写与实际环境不一致的数据这与 §4 真正成功标准 配合以 ARMGET响应为准7.3SolutionBuilderExtension是什么官方没说。技术分析SolutionBuilderExtension更像是OEM Solution Builder 提供的扩展版本号。使用 Microsoft 官方参考实现时保持官方提供的默认值即可OEMDell/HPE/Lenovo未来可能提供自己的 Extension Version——以 OEM 文档为准部署时如果不指定使用x.y.z占位符通常可以接受但生产环境建议填实际值7.4DeviceId的来源官方说明Get-ApplianceInstanceConfiguration在 OperationsModule 里。技术分析DeviceId是Appliance Deployment 生成的唯一标识——Register 阶段只是引用该标识不会重新生成。因此DeviceId应来自已部署完成的 Appliance而不是用户手工填写获取命令必须在Appliance 部署完成后的 OperationsModule 会话中执行不要自己编一个 DeviceId——会导致 ARM 资源与本地 Appliance 无法关联7.5ApiVersion 2026-03-01-preview官方明确提供该值但仍要理解Register 调用本质属于ARM REST APIApiVersion与Microsoft.EdgeResource Provider 生命周期保持一致Preview API 在未来 GA 后可能发生变更——建议始终以官方 Register 文档提供版本为准部署前再次确认参考 Register 官方文档 顶部的 Applies to 版本标记7.6 Register 失败的常见原因症状可能原因排查方向401 UnauthorizedToken 过期 / Subscription ID 错误Get-AzContext检查登录状态404 Not FoundResourceName / ResourceGroup 拼写错误Portal 端核对资源名409 Conflict已 Register 过但值不一致GET hardwareSettings看现有值比对403 ForbiddenRBAC 不足需Microsoft.Edge/disconnectedOperations/.../write权限Invoke-RestMethod 超时Internet PC 出站被防火墙拦检查management.azure.com443 可达性官方未提供失败排查指南——以上为基于 ARM RP 行为的常见推断。生产环境请以 Microsoft Support 实际反馈为准。