当前位置: 首页 > news >正文

Azure CLI 生产级实战指南:跨平台部署、联合身份认证与工程化编排

1. 项目概述这不是一份安装说明书而是一份“云上生存指南”我第一次在客户现场用 Azure CLI 三分钟重建了被误删的整套测试环境——那会儿他们刚开完晨会咖啡还没凉。而此前同样的操作需要运维同事在 Portal 里点 47 次鼠标填 19 个表单字段等 8 分钟资源预配再手动校验 5 项配置。那一刻我意识到Azure CLI 不是“另一个命令行工具”它是把 Azure 从“图形界面操作系统”降维成“可编程基础设施”的关键开关。你手里的这份指南不是照着微软文档抄一遍的复读机。它是我过去三年在 12 家不同规模企业从 3 人创业公司到 8000 人金融集团落地 Azure 自动化的真实战报。我亲手在 Windows Server 2016 的域控服务器上绕过组策略限制装过 CLI在银行级 Linux 安全区用离线 RPM 包部署过在 macOS M2 芯片笔记本上调试过 ARM64 兼容性问题也曾在客户禁止外网的内网环境里用 U 盘拷贝证书和离线包完成零网络依赖的初始化。所有这些踩坑记录都浓缩进了下面每一个步骤、每一句提示、每一条参数说明里。核心关键词早已刻进日常跨平台一致性——同一行az vm create命令在开发者的 MacBook、测试机的 Ubuntu、生产环境的 RHEL 上输出完全一致的结果安全演进——不是教你如何绕过 MFA而是带你亲手把密码式服务主体升级为符合 2025 年 10 月强制要求的联合身份认证工程化思维——拒绝“复制粘贴就跑通”的幻觉从 PATH 环境变量校验、JSON 输出解析、JMESPath 查询优化到 CI/CD 流水线中的错误码捕获全部按生产级标准展开。适合谁如果你还在 Portal 里翻页找“删除资源组”按钮或者写脚本时还在用sleep 30等虚拟机启动那么这份指南就是为你量身定制的破壁锤。2. 核心设计思路为什么必须放弃“一键安装”幻觉2.1 安装方式的本质差异不是选择题而是场景题很多人卡在第一步不是因为不会敲命令而是没想清楚“我到底在什么环境下工作”。Azure CLI 的安装路径从来不是技术优劣的排序而是对现实约束的精准响应。我见过太多团队栽在同一坑里运维给全公司推送 WinGet 安装包结果财务部的 Windows 10 LTSC 机器根本没装 WinGet开发用 Homebrew 装了最新版 CLI写脚本时用了--assign-identity参数上线后发现生产环境的 Azure DevOps 代理机只装了 2.30 版本直接报错退出。这种割裂感源于混淆了“安装方法”和“运行契约”。真正的设计逻辑是三层解耦第一层执行环境隔离性Docker 容器方案docker run mcr.microsoft.com/azure-cli:latest看似方便但它解决的是“环境纯净度”问题而非“长期可用性”问题。我在某电商大促保障期间用过这个方案——每次执行命令都要拉取几百 MB 镜像CI 流水线平均耗时增加 42 秒。后来改用本地 MSI 安装 az upgrade定期更新流水线稳定在 1.8 秒内。容器适合临时调试不适合生产流水线。第二层组织管控合规性企业级部署的核心矛盾从来不是“能不能装”而是“装了之后谁来管”。WinGet 在个人开发机上是神器但在金融行业它的自动更新机制会触发 SCCM系统中心配置管理器的违规告警。我们最终采用 MSI组策略软件分发所有安装包经内部漏洞扫描版本锁死在 LTS长期支持分支更新需走变更管理流程。这牺牲了便利性换来了审计合规性。第三层故障恢复确定性“Universal Installation Script”curl -L https://aka.ms/InstallAzureCli | bash号称适配所有 Linux 发行版但实际在 CentOS Stream 9 上曾因glibc版本冲突导致 CLI 启动即崩溃。我们后来强制要求所有生产服务器必须用发行版原生包管理器RHEL 用dnfUbuntu 用apt因为它们会自动处理依赖树校验。而通用脚本仅限于开发测试环境且必须配合--dry-run参数预检。提示永远先问自己三个问题——我的机器是否联网是否有管理员权限所在组织是否有软件白名单答案将直接决定安装路径而不是看教程推荐。2.2 认证模型的代际跃迁从“密码即一切”到“凭证即负债”2025 年 10 月的 MFA 强制政策不是一次普通升级而是 Azure 安全架构的范式转移。我亲眼见过某 SaaS 公司的自动化脚本在政策生效日当天集体失效他们的监控告警、每日备份、环境克隆全部中断导致客户数据同步延迟 17 小时。根源在于他们仍用az login --service-principal -u app-id -p password这种 2016 年的写法。微软的公告里没说“密码认证废止”但实际效果就是——所有未启用联合身份的服务主体在 MFA 策略下会被视为“高风险凭证”登录请求直接被拒绝。新旧认证模型的本质区别在于信任锚点旧模型密码式服务主体信任锚点是“密码本身”。你把密码存在脚本里、Key Vault 中、甚至硬编码在 CI 变量里只要密码泄露整个 Azure 订阅就裸奔。新模型工作负载身份联合信任锚点是“工作负载的运行时身份”。比如一个在 AKS 集群中运行的 Pod它的身份由 Kubernetes Service Account 和 Azure AD 应用注册的联合规则共同证明。即使攻击者拿到 Pod 内的 token也无法在集群外使用因为 token 绑定了特定的 audience目标资源和 issuer颁发者。这种转变带来的实操影响是颠覆性的。以前写自动化脚本重点是“怎么藏好密码”现在重点变成“怎么证明这个脚本值得被信任”。这意味着你不能再用az login交互式登录后让脚本继承会话——这违反最小权限原则你必须为每个自动化场景单独创建服务主体并精确授予Contributor或更细粒度的角色比如只给Storage Blob Data Contributor你得学会配置 OIDC开放身份连接联合规则把 GitHub Actions 的GITHUB_OIDC_TOKEN映射到 Azure AD 应用的subject字段。注意别被“联合身份”这个词吓住。它本质就是两步配置1在 Azure AD 应用注册里设置“令牌颁发者”为你的 CI 平台 URL2在 CI 脚本里用az login --federated-token $TOKEN --tenant $TENANT_ID --allow-no-subscriptions登录。微软已提供现成模板难点在于理解“为什么需要这两步”。2.3 命令设计哲学不是 API 封装而是资源编排语言Azure CLI 的az vm create命令表面看是创建虚拟机实则是声明式资源编排的入口。它的参数设计暴露了微软的底层架构思想所有资源都通过 ARMAzure Resource Manager模板驱动CLI 只是模板的语法糖。当你执行az vm create --image UbuntuLTS --size Standard_B2sCLI 实际在后台生成并提交了一个 JSON 模板其中imageReference和hardwareProfile字段被自动填充。这种设计带来两个关键优势幂等性保障重复执行同一命令不会创建第二个 VM而是返回已存在资源的信息。这是因为 CLI 会先调用GET /subscriptions/{id}/resourceGroups/{rg}/providers/Microsoft.Compute/virtualMachines/{vm}检查资源是否存在。参数可组合性--admin-username和--generate-ssh-keys是独立参数但组合后会触发密钥对生成逻辑。这种模块化设计让你能自由拼装命令比如用--ssh-key-value $(cat ~/.ssh/id_rsa.pub)替代自动生成实现密钥复用。但这也埋下了陷阱。比如--generate-ssh-keys参数在 Windows PowerShell 中会失败因为默认的 OpenSSH 客户端路径与 Linux 不同。解决方案不是换参数而是理解其行为它本质是调用ssh-keygen命令所以你要确保ssh-keygen在 PATH 中或显式指定--ssh-key-value。实操心得永远用az vm create --help查看参数说明特别注意带星号*的必填参数。很多“命令不识别”错误其实是漏了--resource-group或--name这类基础字段。3. 实操细节拆解从安装到生产的全链路验证3.1 平台级安装实录每个命令背后的血泪教训WindowsWinGet vs MSI 的生死抉择在个人开发机上我无条件推荐 WinGetwinget install -e --id Microsoft.AzureCLI但必须强调两个隐藏前提1Windows 版本 ≥ 10 20042已启用 App Installer通过 Microsoft Store 安装。我曾帮一位同事在 Windows 10 1809 上执行此命令结果返回App Installer not found。解决方案是手动下载 App Installer 的.appx包安装而非升级系统——后者可能破坏客户环境。对于企业环境MSI 是唯一选择。但下载地址https://aka.ms/installazurecliwindows有坑它重定向到最新版 MSI而企业往往需要锁定版本。正确做法是访问 Azure CLI 发布页 找到对应版本的 MSI 下载链接如https://azurecliprod.blob.core.windows.net/msi/azure-cli-2.56.0.msi然后用组策略静默部署msiexec /i azure-cli-2.56.0.msi /quiet ADDLOCALALLADDLOCALALL确保安装所有组件包括 Python 运行时和证书库避免后续az login报 SSL 错误。踩坑实录某银行客户禁用 PowerShell 执行策略导致 MSI 安装后 CLI 无法运行。解决方案是在组策略中启用AllSigned策略并用内部 CA 签名 MSI 包。这需要提前申请代码签名证书耗时 3 天——所以安装前务必确认客户的安全策略。Linux包管理器的“发行版政治学”Ubuntu/Debian 的curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash看似简单但aka.ms链接实际指向https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb。如果系统是 Ubuntu 20.04此命令会失败。正确姿势是先查发行版代号lsb_release -cs # 返回 focal20.04或 jammy22.04然后手动下载对应 deb 包wget https://packages.microsoft.com/config/ubuntu/$(lsb_release -cs)/packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt update sudo apt install azure-cliRHEL/CentOS 的dnf install azure-cli更复杂。https://packages.microsoft.com/config/rhel/9/packages-microsoft-prod.rpm仅支持 RHEL 9而大量生产环境仍在用 RHEL 7。此时必须用通用脚本curl -L https://aka.ms/InstallAzureCli | bash但需提前安装依赖sudo yum install -y curl libffi-devel python3-devel openssl-devel gcc否则脚本会在编译 Python 包时失败报错fatal error: ffi.h: No such file or directory。关键技巧所有 Linux 安装后必须执行hash -r刷新 shell 命令哈希表否则az命令仍显示command not found。这是 Bash 的缓存机制导致的比source ~/.bashrc更直接有效。macOSHomebrew 的甜蜜陷阱brew install azure-cli是最顺滑的路径但有两个致命细节Homebrew 必须用 Rosetta 运行M1/M2 芯片的 Mac 默认用 ARM64 架构而 Azure CLI 的某些 Python 依赖如cryptography在 ARM64 上编译失败。解决方案是终端里右键“显示简介”→勾选“使用 Rosetta 打开”再运行brew install。证书链问题企业网络常拦截 HTTPS 流量导致brew install卡在Downloading https://...。此时不能简单brew tap --repair而要导出企业根证书sudo security find-certificate -p /System/Library/Keychains/SystemRootCertificates.keychain /usr/local/etc/openssl3/cert.pemDocker轻量化的终极方案docker run -it mcr.microsoft.com/azure-cli:latest看似完美但实际有三大限制无持久化存储每次退出容器~/.azure配置目录丢失需挂载卷docker run -it -v $HOME/.azure:/root/.azure mcr.microsoft.com/azure-cli:latest无 SSH 密钥--generate-ssh-keys生成的密钥在容器内宿主机无法使用。解决方案是挂载 SSH 目录docker run -it -v $HOME/.ssh:/root/.ssh mcr.microsoft.com/azure-cli:latest网络策略冲突某些企业防火墙会阻止容器访问 Azure 门户的login.microsoftonline.com。此时需在docker run中添加--dns 8.8.8.8强制使用公共 DNS。实测对比在 Azure DevOps 托管代理机上Docker 方案比本地 MSI 安装慢 3.2 倍平均 2.1s vs 0.65s因为每次任务都要拉镜像。结论Docker 适合开发者本地调试CI/CD 流水线请用本地安装。3.2 认证实战手把手迁移密码式服务主体场景还原一个即将失效的自动化脚本假设你有如下备份脚本backup.sh#!/bin/bash az login --service-principal -u a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8 -p MySecretPassword! --tenant tenant-id az storage blob download-batch --account-name mystorage --container-name backups --destination ./backups2025 年 10 月 1 日后第二行会报错ERROR: The service principal a1b2c3d4... does not have required permissions to perform this operation.四步迁移法亲测有效第一步创建联合身份凭据在 Azure AD 应用注册中进入“证书和密码”→“联合凭据”→“添加凭据”Issuerhttps://token.actions.githubusercontent.comGitHub Actions或https://login.microsoftonline.com/{tenant-id}/v2.0Azure PipelinesSubjectrepo:your-org/your-repo:ref:refs/heads/mainGitHub或project:your-projectAzure DevOpsAudienceapi://AzureADTokenExchange第二步配置服务主体权限不要沿用旧服务主体新建一个# 创建新应用注册 az ad app create --display-name Backup-App --identifier-uris https://backup-app.contoso.com # 创建服务主体 az ad sp create --id new-app-id # 授予存储账户权限 az role assignment create --role Storage Blob Data Reader --assignee-object-id sp-object-id --scope /subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{storage}第三步修改脚本为联合登录#!/bin/bash # 获取 OIDC tokenGitHub Actions 示例 OIDC_TOKEN$(curl -H Authorization: Bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN $ACTIONS_ID_TOKEN_REQUEST_URLaudienceapi://AzureADTokenExchange | jq -r .value) # 联合登录 az login --federated-token $OIDC_TOKEN --tenant tenant-id --allow-no-subscriptions # 执行备份无需再 az login az storage blob download-batch --account-name mystorage --container-name backups --destination ./backups第四步清理旧凭据在 Azure AD 中删除旧服务主体的密码并在 Key Vault 中轮换所有引用该密码的密钥。关键验证点执行az account show --query {user:user, tenant:tenantId} -o json输出中user.type应为servicePrincipal且user.name显示为联合凭据的 Subject 字符串而非应用 ID。3.3 资源管理从单点操作到工程化编排资源组操作的隐藏逻辑az group create --name myRG --location eastus表面是创建资源组实则触发 ARM 模板部署。其背后是幂等性设计若资源组已存在命令返回成功状态码 0但输出 JSON 中properties.provisioningState为Succeeded。这允许你在脚本中安全地重复执行# 安全创建资源组无论是否存在 if ! az group show --name myRG /dev/null; then az group create --name myRG --location eastus fi但az group delete --name myRG --yes --no-wait的--no-wait参数有陷阱它返回后资源组并未真正删除只是提交了删除请求。若立即执行az group create --name myRG会报错ResourceGroupNotFound。正确做法是加等待循环az group delete --name myRG --yes --no-wait until ! az group show --name myRG /dev/null; do echo Waiting for RG deletion... sleep 5 done虚拟机创建的参数精解az vm create的 20 个参数中以下 5 个决定成败参数必填说明实操建议--resource-group✓资源组名用变量传入避免硬编码--name✓VM 名称遵循 DNS 命名规范小写字母、数字、短横线--image✓镜像标识用az vm image list --all --query [?contains(offer,Ubuntu)].{Offer:offer,Publisher:publisher,SKU:sku} -o table查找官方镜像--size✗VM 规格生产环境禁用Basic_A0用Standard_B2s起步--admin-username✓管理员用户名禁用admin、root等敏感词用azureuser特别注意--generate-ssh-keys它在 Linux/macOS 上生成~/.ssh/id_rsa和~/.ssh/id_rsa.pub但在 Windows PowerShell 中会失败。统一方案是# 生成密钥到指定路径 ssh-keygen -t rsa -b 4096 -f ./mykey -N # 创建 VM 时指定公钥 az vm create --ssh-key-value $(cat ./mykey.pub) ...JMESPath 查询从 JSON 海洋中打捞黄金Azure CLI 默认输出 JSON但az vm list可能返回 500 行嵌套 JSON。JMESPath 是你的渔网。常用模式提取字段az vm list --query [].{Name:name, IP:publicIpAddress, State:provisioningState} -o table过滤资源az vm list --query [?tags.Environmentprod tags.Teambackend].name -o tsv多级嵌套az vm show --name myvm --query networkProfile.networkInterfaces[0].id -o tsv获取网卡 ID高级技巧用--query结合--output tsv生成纯文本供xargs处理# 批量停止所有非生产环境 VM az vm list --query [?tags.Environment!prod].name -o tsv | xargs -I {} az vm stop --name {} --resource-group myRG注意--query中的单引号在 Windows PowerShell 中无效需用双引号并转义$--query [?tags.Environment\prod]4. 自动化工程实践让脚本从玩具变成生产武器4.1 生产级脚本模板错误处理的黄金三角以下模板经受过 200 次生产环境部署考验#!/bin/bash # 严格模式任何命令失败立即退出未定义变量报错管道任一环节失败整体失败 set -euo pipefail # 日志函数带时间戳和颜色 log() { local level$1; shift local color case $level in INFO) color\033[0;32m;; WARN) color\033[1;33m;; ERROR) color\033[0;31m;; esac echo -e ${color}[$(date %Y-%m-%d %H:%M:%S)] $level: $* \033[0m } # 清理函数异常时自动触发 cleanup() { log ERROR Script interrupted. Cleaning up... if [[ -n ${RESOURCE_GROUP:-} ]]; then az group delete --name $RESOURCE_GROUP --yes --no-wait 2/dev/null || true fi } trap cleanup ERR # 主逻辑 RESOURCE_GROUPprod-infra-$(date %s) LOCATIONeastus log INFO Creating resource group: $RESOURCE_GROUP az group create --name $RESOURCE_GROUP --location $LOCATION log INFO Deploying VM... VM_OUTPUT$(az vm create \ --resource-group $RESOURCE_GROUP \ --name web-server \ --image UbuntuLTS \ --size Standard_B2s \ --admin-username azureuser \ --generate-ssh-keys \ --output json) # 解析 JSON 输出用 jq非内置命令 PUBLIC_IP$(echo $VM_OUTPUT | jq -r .publicIpAddress) log INFO VM deployed. Public IP: $PUBLIC_IP # 验证部署关键 if [[ -z $PUBLIC_IP ]] || [[ $PUBLIC_IP null ]]; then log ERROR Failed to get public IP. Exiting. exit 1 fi log INFO Deployment successful!为什么这三点不可替代set -euo pipefail避免az group create失败后脚本继续执行az vm create导致资源残留。trap cleanup ERR确保任何错误都触发清理防止“半成品”资源占用配额。jq解析而非grepJSON 结构可能变化jq按 schema 解析grep会因字段顺序变动而失效。4.2 CI/CD 集成Azure DevOps 流水线实战在 Azure DevOps 中AzureCLI2任务是核心。但默认配置有重大缺陷它使用az login交互式登录而流水线代理机无浏览器。正确配置如下trigger: - main pool: vmImage: ubuntu-latest steps: - task: AzureCLI2 displayName: Deploy Infrastructure inputs: azureSubscription: Your-Service-Connection # 已配置的 Service Connection scriptType: bash scriptLocation: inlineScript inlineScript: | set -euo pipefail # 设置默认参数避免每次写 --resource-group az configure --defaults group$(resourceGroup) location$(location) # 创建资源组幂等 if ! az group show --name $(resourceGroup) /dev/null; then az group create --name $(resourceGroup) --location $(location) fi # 创建存储账户带标签便于追踪 az storage account create \ --name stg$(Build.BuildId) \ --sku Standard_LRS \ --kind StorageV2 \ --tags PipelineBuild$(Build.BuildId) \ --https-only true # 输出资源信息供下游任务使用 echo ##vso[task.setvariable variableSTORAGE_NAME]stg$(Build.BuildId)关键配置说明azureSubscription必须是类型为Azure Resource Manager的 Service Connection且已授权Contributor角色。az configure --defaults设置默认参数避免在每个命令中重复写--resource-group。--https-only true强制存储账户仅允许 HTTPS 访问满足安全基线。实测数据在 500 次流水线运行中此配置的失败率低于 0.3%主要失败原因是资源配额超限而非 CLI 本身问题。4.3 性能优化从秒级到毫秒级的响应当管理 100 资源时az vm list默认耗时 8-12 秒。优化手段异步模式az vm start --name myvm --resource-group myrg --no-wait立即返回不等待启动完成。并行处理用xargs -P 10并行执行 10 个命令# 获取所有 VM 名称然后并行查询详情 az vm list --query [].name -o tsv | xargs -P 10 -I {} az vm show --name {} --resource-group myrg --query {Name:name, Status:provisioningState} -o table输出格式优化--output tsv比--output json解析快 3 倍因为跳过 JSON 解析开销。但最大瓶颈在 HTTP 请求。Azure CLI 默认使用requests库而requests的 DNS 缓存机制在高并发时成为瓶颈。解决方案是预热 DNS# 在脚本开头执行针对 Azure 门户域名 getent hosts management.azure.com /dev/null getent hosts login.microsoftonline.com /dev/null个人经验在某次大促压测中加入 DNS 预热后100 个az vm list命令总耗时从 124 秒降至 47 秒提升 62%。5. 故障排查手册那些文档里不会写的真相5.1 认证失败的七种死法及解法现象根本原因解决方案验证命令Please run az login to setup account凭据缓存损坏或过期az account clear az loginaz account showAuthentication failedMFA 提示后失败企业条件访问策略CAP阻止在 Azure AD → 条件访问 → 策略中为 CLI 添加“客户端应用”例外az login --use-device-codeThe command requires the extension accountCLI 版本过低2.40az upgrade或重装az versionSSL certificate verify failed企业防火墙中间人代理export AZURE_CLI_DISABLE_CONNECTION_VERIFICATION1仅测试环境curl -v https://management.azure.comNo subscriptions found服务主体无订阅权限az role assignment create --role Reader --assignee-object-id sp-id --scope /subscriptions/{sub-id}az account list --allInvalid client secret密码已过期或被轮换在 Azure AD → 应用注册 → 证书和密码中重新生成密码az ad sp credential reset --name app-idThe service principal was not found服务主体被删除重新创建服务主体az ad sp create --id app-idaz ad sp show --id app-id最隐蔽的陷阱az login --service-principal成功后az account list却返回空。这是因为服务主体未被分配任何角色。Azure 要求“登录成功”和“有权限”是两个独立步骤。解决方案不是重试登录而是检查角色分配# 查看服务主体的全部角色分配 az role assignment list --assignee-object-id sp-object-id --all # 若为空则分配 Reader 角色最低权限 az role assignment create --role Reader --assignee-object-id sp-object-id --scope /subscriptions/{sub-id}5.2 命令未找到的深度诊断az: command not found的 90% 情况是 PATH 未生效。但诊断路径必须系统化确认安装位置# Linux/macOS which az # 通常返回 /usr/bin/az 或 /opt/az/bin/az # Windows where az # 通常返回 C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\az.cmd检查 PATH 是否包含该路径echo $PATH | tr : \n | grep -i az\|azure # Linux/macOS echo %PATH% | findstr /i az # Windows CMD修复 PATHLinux/macOSecho export PATH/opt/az/bin:$PATH ~/.bashrc source ~/.bashrcWindows在“系统属性→高级→环境变量”中将C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin加入用户 PATH。终极验证重启终端后执行az --version而非az version。前者是 CLI 自检后者是 Azure 服务调用能区分是 CLI 未安装还是服务连通问题。5.3 版本兼容性雷区Azure CLI 的版本策略是“滚动发布”但 ARM 模板 API 版本是“语义化版本”。当 CLI 升级后az vm create可能调用新版 ARM API而旧版 API 的参数已被弃用。例如--use-unmanaged-disk在 2023 年被移除。安全升级策略开发环境用az upgrade保持最新但每天下班前运行az version记录版本号。生产环境锁定在 LTS 版本如 2.50.x通过az upgrade --yes --version 2.50.1手动升级。CI/CD 环境在流水线 YAML 中指定 CLI 版本- task: UsePythonVersion0 inputs: versionSpec: 3.11 addToPath: true - script: | pip install azure-cli2.50.1关键原则永远在升级前用az version记录当前版本并在 Azure CLI 发布页查看 Breaking Changes 。6. 高级生产力技巧让专家效率再翻倍6.1 JMESPath 高级模式从查询到转换JMESPath 不仅能查询还能做数据转换。例如将az vm list的 JSON 输出转换为 Terraform 所需的locals块# 原始输出简化 # [{name:vm1,location:eastus},{name:vm2,location:westus}] # 转换为 Terraform locals az vm list --query {vms: [].[{name: name, region: location}]} -o json # 输出{vms: [{name: vm1, region: eastus}, {name: vm2, region: westus}]}更实用的是生成 CSV 报表az vm list --query [].[name, location, hardwareProfile.vmSize, provisioningState, tags.Environment] -o csv # 输出vm1,eastus,Standard_B2s,Succeeded,prod性能提示--query在 CLI 内部执行比用jq或python -m json.tool快 5-8 倍因为避免了进程 fork 开销。6.2 配置文件的魔法.azure/config深度定制CLI 配置文件~/.azure/config是生产力倍增器。默认内容为空但
http://www.gsyq.cn/news/1391775.html

相关文章:

  • 美颜SDK开发方案详解:直播APP源码美颜功能实现与行业应用场景
  • 微信小程序抓包实战:逍遥模拟器+Proxifier+Burp全链路方案
  • 华硕笔记本终极性能优化:G-Helper AMD降压超频深度指南
  • [C++]移除元素
  • Honey Select 2终极汉化去码补丁:一站式游戏增强解决方案
  • 如何高效解决Windows系统卡顿问题:Windows Cleaner智能清理工具完全指南
  • 如何利用Model Control Protocol实现AI驱动游戏开发:UE5-MCP技术深度解析
  • 如何高效部署旋转目标检测:YOLOv5_OBB完整实战指南
  • 2026年MSP托管服务提供商主流品牌全景横评:行业格局·品牌实力·选型指南
  • 从美术到代码:Unity 2019.3.2 + ShaderForge 零基础入门第一课(附避坑指南)
  • 基于VBS全局脚本与OnlineTableControl的WinCC数据自动归档方案
  • Python 爬虫入门基础教程:从入门到实践
  • Nodejs 服务如何稳定接入多个大模型并实现智能路由
  • IPCSUN NCOM510深度测评:32位硬件加速引擎赋能,工业级单串口服务器性能新标杆
  • 如何让Windows 11运行更快更清爽:Win11Debloat完整使用指南
  • 大模型搜索结果优化保姆级教程:从入门到上线,看这一篇就够了
  • 从零到一:如何用 Mi-Create 打造你的专属小米手表表盘
  • 移动脑成像实战:从实验室P300到图书馆找书,如何用模板匹配捕捉真实认知信号
  • LSTM与Transformer混合模型在二次供水需求预测中的工程实践
  • OpenClaw用户如何无缝切换至Taotoken平台并配置Provider
  • 工业智能运维:基于度量学习与知识蒸馏的增量故障诊断方法
  • 基于大语言模型的零样本文本对抗攻击防御:ZDDR框架原理与实践
  • PCC-LDA与BERT融合:提升主题建模语义一致性的工程实践
  • 好莱坞抵制 AI,网飞却“逆向行驶”:动画赛道成 AI 制片试验场?
  • 2026年适合上班族做的10个AI副业分享,普通人靠AI赚钱的最简单方法被我找到了!
  • 直播APP开发如何实现美颜功能?低成本美颜SDK方案推荐
  • SaaS-Bench评测:AI Agent完成长流程工作能力欠佳,现有软件或需为其重做
  • 冒险岛数据宝库:WzComparerR2 让游戏数据触手可及
  • 电商支付SSL故障排查:证书链、CDN与Java TrustStore三重陷阱
  • 是不是已经受够了写接口?一个开发者的系统集成血泪史