Azure Local 离线模式 Azure CLI 配置(系列篇十一)
发布时间:2026/7/5 6:00:36
分类:文化教育
浏览:1234
)
Azure Local 离线模式 Azure CLI 配置 Runbook生产级适用场景Azure Local Azure CLI Disconnected Operations 文档定位可直接用于生产执行的 Runbook工程 SOP来源Use Azure CLI for Disconnected Operations for Azure Local体例说明本 Runbook 用 3 类标签组织✔执行步骤必须按顺序完成⚠故障模式已知问题与排查方向Best Practice仅 production hardening不重复官方内容理论推断统一收纳到末尾 Technical AnalysisIncluding Inferred Behavior——不混入执行步骤。0. 执行前置条件Pre-flight Checklist✔ 必须满足Azure Local appliance 已部署完成已存在Appliance Root CAapplianceRoot.cerLocal portal FQDN例autonomous.cloud.private已具备LocalMachine 管理员权限离线软件分发路径SMB / ISO / Repo⚠ 风险检查部署前签字项目状态Root CA 已导入⬜CLI 版本已确认⬜离线 extension 源已就绪⬜Cloud config FQDN 已与 portal 一致⬜1. 安装 Azure CLI统一 64-bit✔ 执行步骤Step 1从内网镜像源下载官方 64-bit MSIStep 2静默安装msiexec /i AzureCLI.msi /quiet或标准安装# 官方 MSI64-bit only # https://aka.ms/install-azure-cli-windows✔ 验证az version期望输出azure-cli: 2.81.0⚠ 故障模式问题原因排查azcommand not foundPATH 未刷新重启 shell / 重新登录CLI version mismatch装错 MSI32-bit / 旧版重装 64-bit 官方 MSIextension load failarchitecture mismatch32-bit 卸载统一 64-bit Best Practice所有节点统一 64-bit CLI禁止混用 32-bit CLI离线环境不要az upgrade——直接重新装新版 MSI2. 安装 CA 信任链企业级标准✔ 执行步骤Step 1导入根 CA 到 OS Trust Store唯一推荐方式Import-Certificate -FilePath C:\AzureLocal\applianceRoot.cer -CertStoreLocation Cert:\LocalMachine\RootStep 2安装pip-system-certs让 Python 走 OS trust store C:\Program Files\Microsoft SDKs\Azure\CLI2\python.exe -m pip install pip-system-certs✔ 验证Get-ChildItem Cert:\LocalMachine\Root | Where-Object { $_.Subject -like *Azure* }期望看到 appliance root CA 出现在列表中。⚠ 故障模式问题影响修复未导入 CAaz loginTLS failure重新 import仅改cacert.pemupgrade 后失效改回 OS trust store多节点不一致部署漂移GPO / Intune 统一分发 Best Practice关键✔唯一推荐方式OS Trust Store GPO / Intune 分发❌禁止修改certifi/cacert.pem3. 配置 Azure CLI CloudDisconnected Cloud✔ 执行步骤Step 1加载 OperationsModuleImport-Module OperationsModule\Azure.Local.DisconnectedOperations.psd1Step 2生成 cloud config参数以 module introspection 为准$cloudConfig Get-ApplianceAzCliCloudConfig -ExternalFqdn autonomous.cloud.private⚠️不要硬编码其他参数——用Get-Help Get-ApplianceAzCliCloudConfig -Full查实际参数集。Step 3写入配置$cloudConfig | Set-Content $env:APPDATA\Azure\myCloud.jsonStep 4应用 cloudaz cloud set --cloud-config $env:APPDATA\Azure\myCloud.json az cloud show✔ 验证az cloud list期望当前 cloud custom disconnected cloudendpoints 全部指向本地 FQDN。⚠ 故障模式问题原因排查login 仍走azure.comcloud 未 set重新az cloud setendpoint resolution failFQDN 不匹配 portal比对 portal 实际 FQDNJSON schema errormodule version mismatch升级 OperationsModule Best PracticeCloud config当成不可解析配置文件——不要复制字段名当 schema必须纳入CMDB / Git version control——多节点共享同一份每次升级 OperationsModule 后重新生成cloud config4. 登录验证Disconnected Login✔ 执行步骤az login --use-device-code浏览器打开显示的 URL在本地 portal 输入 device code 完成认证。✔ 验证az account show期望返回包含本地 subscription 的 JSON。⚠ 故障模式问题原因排查device code failportal endpoint 不可达Test-NetConnection portal FQDN 443login redirect to public cloudcloud config error重新跑 §35. 安装 Azure CLI Extensions离线模式✔ 执行步骤❗不允许直接 online install离线下会失败Step 1在能联网的镜像机上下载az extension add -n aksarc az extension add -n stack-hci-vm az extension add -n customlocationStep 2复制 extension 目录到内网分发路径%USERPROFILE%\.azure\cliextensions\Step 3在离线节点安装az extension add --source local-path✔ 验证az extension list期望列出 3 个 extension状态为Installed。⚠ 故障模式问题原因排查extension not foundrepo missing检查分发路径version conflictCLI 不兼容升级 / 降级 CLImodule load failcorrupted cacheaz extension remove -n name后重装 Best Practice不写死版本号——extension 版本会随 Azure Local release train 变化内网镜像机每月同步一次最新 extension 索引6. CLI 升级离线模式❗ 关键约束az upgrade在离线环境不可直接使用——会拉https://aka.ms/...失败。✔ 正确流程Step 1从内网 mirror repo 下载新版 MSIStep 2静默升级安装msiexec /i AzureCLI.msi /quietStep 3重启 shell重新加载✔ 验证az version期望azure-cli字段显式显示新版本号不是缓存旧值——这是假升级陷阱。⚠ 故障模式问题原因排查upgrade no effectcached CLI重启 shell /where.exe az确认路径extension brokenversion drift重新装匹配版本的 extension7. 健康检查Post-Install Validation Gate✔ 必须全部通过az version az cloud show az account show az extension list✔ 成功标准项目条件CLI2.81.0或当前文档版本cloudcustom disconnected cloudloginaz account show返回本地 subscriptionextension全部Installed4 项检查全部通过才能认为 CLI 配置完成——任一失败不能进入下一阶段。8. Failure Recovery恢复路径❌ Cloud misconfigurationaz cloud set --name AzureCloud # 重新生成 cloud config参考 §3❌ CA failure# 删除错误 cert Get-ChildItem Cert:\LocalMachine\Root | Where-Object { ... } | Remove-Item # 重新 import Import-Certificate -FilePath C:\AzureLocal\applianceRoot.cer -CertStoreLocation Cert:\LocalMachine\Root❌ Extension corruptionaz extension remove -n name # 重新 copy 离线包 az extension add --source local-path❌ CLI 假升级缓存旧版where.exe az # 确认实际加载的 CLI 路径 # 删除旧 MSI 残留重装新版9. 最终架构总结理解层User CLI ↓ Azure CLI Runtime (Python) ↓ Cloud Config (custom endpoint) ↓ OS Trust Store (CA chain) ↓ Azure Local Control Plane一句话总结这套 Runbook 的本质是把 Azure CLI 从云 CLI变成本地控制平面客户端。 Technical AnalysisIncluding Inferred Behavior本节是 Runbook 推理依据的存档——所有为什么这么做都在这里。不混入执行步骤。A. CLI 与架构选择A.1 为什么统一 64-bit官方从未说 Azure Local 禁止 32-bit但也不支持 32-bit 作为推荐路径。32-bit不是 hard failure而是unsupported untested32-bit Azure CLI 实际可装、可运行但不在 Microsoft 测试矩阵内可能引入兼容性 / 内存 / extension 加载问题企业部署原则按 supported 路径走不赌 untested 边缘场景。A.2 32-bit 实际风险不是技术禁止Python 32-bit 内存上限典型 2 GB—— 大型 ARM 调用可能 OOMExtension 兼容性矩阵窄32-bit MSI 不是 Microsoft 在 Azure Local 场景的推荐路径结论技术上不禁止但工程上不推荐——Runbook 不应该把unsupported包装成禁止。B. CA 信任链B.1pip-system-certs的真实作用范围pip-system-certs只影响 Pythonrequests库的 HTTP 调用。关键点Python-based extension→ 受影响 ✔Go / .NET / native binary extension→不受影响❌WinHTTP / Schannel 路径→不受影响❌因此 OS trust store pip-system-certs是增强信任不是完全替代 trust chain——但已经是最稳妥的方案。B.2 完整 CA 信任链路企业部署应全部覆盖信任层是否受pip-system-certs影响OS trust storeLocalMachine\RootOS 层 多数 native TLSPythonrequests信任✔通过pip-system-certsCLI extension 内部 native TLS❌自行保证Embedded toolsK8s client、Arc bridge❌走各自 trust chain浏览器用于本地 portal系统级OS trust store 已覆盖缺失任一环节都可能导致部分功能 SSL 失败。B.3 为什么禁止改cacert.pem风险说明az upgrade覆盖CLI 升级时cacert.pem被重置pip upgrade重置任何包管理操作都可能 drift配置漂移多节点场景下很快不一致审计风险标为 enterprise security baseline 偏离C. Extension 与 VersioningC.1 Extension 版本是 release-train 绑定stack-hci-vm/aksarc/customlocation强依赖 Azure Arc / Azure Local release train经常月更甚至周更不存在跨文档统一推荐版本VM 文档与 AKS 文档给的版本经常不一致——优先以最新文档为准C.2 Extension 解析源implementation-dependent⚠️ extension resolution 取决于configured source——不是固定机制可能是以下之一或组合Azure endpointaz extension add默认Arc resource provider feedlocal cache离线环境custom repo内网镜像不要在文档中固化Appliance 内置 extension 索引这种说法——它不是稳定公开机制。C.3Get-ApplianceAzCliCloudConfig的版本漂移官方没说参数会变化——但 OperationsModule 是 Microsoft 持续更新的组件。真实风险字段命名 / 必需参数可能随版本调整输出 JSON schema 可能更新甚至 function itself may be replaced across module versions更激进的版本变化应对不要把生成的 JSON 当成稳定 API每次升级 OperationsModule 后重新跑Get-HelpD. CLI 升级与假升级风险D.1 Air-gapped 下az upgrade的陷阱Air-gapped 模式下az upgrade拉https://aka.ms/...会失败部分 CLI 工具会静默 fallback到本地缓存版本表面看az version没变——实际你以为升级了但没有验证升级后az version必须显式显示新版本号否则视为升级失败。D.2 正确的离线升级路径步骤操作1内网 mirror repo 下载新版 MSI2msiexec /i AzureCLI.msi /quiet3重启 shell4where.exe az确认路径5az version显式验证E. Cloud Config 的实际语义Azure Local disconnected environment 确实需要custom cloud definitionendpoint override 指向本地 portal 的 ingress FQDN这是离线场景的核心——没有这一步az login会去找management.azure.com然后失败F. 跨版本兼容性官方没给出完整兼容矩阵——但可以从 release train 推断组件升级顺序Azure Local release notes起点Appliance build配套OperationsModule配套CLI与 OperationsModule 兼容extension绑定到 CLI release train生产升级顺序升级前看 Azure Local release notesCLI→ 2.extension→ 3.OperationsModule→ 4.Appliance逐项验证——不要跨大版本G. 为什么离线下az login --use-device-code是关键--use-device-code不要求本地有浏览器用户在任何能访问 local portal 的机器上输入 code 即可这正是离线场景的登录模式——az login走 local portal认证回调走 device codeH. 文档未明确的边界汇总文档没说Runbook 推断是否能装 32-bitunsupported untested按 64-bit 走cacert.pem修改的后果drift / 升级丢失 / 审计风险禁止extension source 机制implementation-dependent看内网配置Get-ApplianceAzCliCloudConfig稳定性每次升级重新跑Get-Helpaz upgrade离线行为静默 fallback必须显式验证