关于 azure-landing-zone-checklist
用于在通过 Bicep 或 Terraform 部署前填写 Microsoft Azure Landing Zone Accelerator 清单的技能。它收集决策、应用基于 CAF 的默认建议、映射订阅与 IP 信息,并在 Excel 中标出需要人工确认的项目。
主要功能
- 01读取并填写 Excel 清单
- 02分批收集部署决策
- 03将订阅映射到 ALZ 角色
- 04整合现有 IP 地址规划
- 05为建议和待审项目添加说明
- 06处理 Bicep 与 Terraform 清单页
适用场景
- 01准备 ALZ Accelerator 部署
- 02将基础设施选择整理为已填写的清单
- 03检查订阅和网络前置条件
- 04标记需要人工跟进的未决事项
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ julianobarbosa/ claude-code-skills --skill azure-landing-zone-checklist安装后在 Claude Code 中输入/azure-landing-zone-checklist确认已加载。
附带文件references/alz-best-practices.md
详细介绍
Azure Landing Zone 清单技能
此技能将指导你填写 Microsoft Azure Landing Zone (ALZ) 加速器清单——这份电子表格记录了通过 ALZ Accelerator 工具使用 Bicep 或 Terraform 部署 ALZ 前所需的所有决策。
目标是生成一份填写完整的 Excel 清单,其中每项决策都有合理依据,默认采用最佳实践,并清楚标记需要人工输入的项目,提醒用户注意。
为什么这很重要
ALZ 加速器清单是平台 Landing Zone 部署的唯一事实来源。填写错误会导致网络配置错误、安全漏洞或数小时的返工。此技能通过应用 Microsoft Cloud Adoption Framework (CAF) 的建议,同时尊重用户现有的基础设施(IP 范围、订阅、命名约定),确保一致性。
工作流程
阶段 1:阅读清单
使用 openpyxl 读取上传的 .xlsx 清单,以了解其结构。ALZ 清单通常包含三个选项卡:
- Accelerator - Bootstrap:IaC 类型、VCS、订阅、命名、CI/CD 设置
- Accelerator - Bicep:场景选择、组件开关、IP 寻址、策略
- Accelerator - Terraform:与 Bicep 相同,另有其他选项(AMBA、主权 LZ)
解析清单,识别哪些字段已有值(列 F = “Chosen Value”),哪些为空。这能告诉你用户已经做出哪些决定,以及哪些仍需输入。
阶段 2:询问用户
通过结构化问题收集决策。每批提出 3-4 个问题,避免让用户应接不暇。按以下顺序优先提问:
第 1 批 — 基础决策:
- IaC 类型(Bicep 或 Terraform)
- 版本控制系统(Azure DevOps、GitHub 或本地)
- 网络拓扑场景(中心辐射型还是 vWAN、单区域还是多区域、Azure Firewall 还是 NVA)
- Azure 区域
第 2 批 — 组件决策:
- 要部署哪些组件(DDoS、Private DNS、Bastion、VPN Gateway、ExpressRoute、Zero Trust)
- 安全态势(AMA、Defender 计划)
第 3 批 — 特定环境的详细信息:
- Azure DevOps / GitHub 组织和项目名称
- 订阅 ID(Management、Connectivity、Identity、Security)
- 流水线审批人
- IP 寻址(询问用户是否有现有文档)
当用户说“采用最佳实践”或推迟某项决策时,应用 references/alz-best-practices.md 中的建议。始终说明提出建议的原因——用户理解建议的依据后才会信任这些建议。
阶段 3:映射订阅
如果用户提供了订阅列表(来自 az account list 或类似命令),根据命名模式将订阅映射到 ALZ 角色:
| 模式 | ALZ 角色 |
|---|---|
*mgmt*、*management* | 管理 |
*connectivity*、*network*、*hub* | 连接 |
*identity*、*ad*、*entra* | 身份 |
*security*、*sentinel*、*defender* | 安全 |
如果缺少必需的订阅(通常是 Security),使用黄色高亮标记,并添加注释说明可选方案:
- 创建专用订阅(推荐)
- 与 Management 订阅共用(预算受限时的替代方案)
阶段 4:整合 IP 寻址
如果用户提供了 IP 文档(Markdown、CSV、Excel 或文本),解析文档以提取:
- 订阅级 CIDR 块 — 映射到 ALZ 中心/辐射型 VNet
- 现有中心 VNet 布局 — 识别子网分配(Gateway、Firewall、Bastion、共享服务)
- 本地公共 IP — 将其写入注释,以供 VPN/防火墙规则参考
- AKS 网络 — 适用时填写 Pod/服务 CIDR
对于 ALZ 中心 VNet,建议使用连接订阅的 CIDR 块采用以下子网布局:
Hub VNet: <connectivity-base>/16
GatewaySubnet: <base>.0.0/27 (30 hosts)
AzureFirewallSubnet: <base>.0.64/26 (62 hosts)
AzureFirewallManagementSubnet:<base>.0.128/26 (62 hosts)
AzureBastionSubnet: <base>.0.192/26 (62 hosts)
Shared Services: <base>.1.0/24 (254 hosts)
DNS Resolver Inbound: <base>.2.0/28
DNS Resolver Outbound: <base>.2.16/28
如果未提供 IP 文档,则使用 ALZ 默认值并标记为待审核。
第 5 阶段:填写清单
使用 openpyxl 将值写入相应选项卡的 F 列(“Chosen Value”)。应用一致的格式:
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.comments import Comment
# Confirmed values — green background
green_fill = PatternFill('solid', fgColor='CCE5CC')
# Items needing user action — yellow background + red bold text
yellow_fill = PatternFill('solid', fgColor='FFFF00')
action_font = Font(bold=True, color='FF0000', size=10)
# Informational notes — italic yellow background
note_fill = PatternFill('solid', fgColor='FFFFCC')
note_font = Font(italic=True, size=10)
对于每个填写的单元格:
- 添加批注,说明理由或最佳实践参考
- 对已确认的决策使用绿色填充
- 对需要用户操作的项目(例如“TO BE DEFINED”“TO BE PROVIDED”)使用黄色填充和红色文字
- 对使用默认值、但应由用户审核的项目使用浅黄色填充和斜体
选项卡专属逻辑:
仅填写与用户 IaC 选择相匹配的选项卡。如果另一选项卡中有上次尝试留下的值,则将其清空。对于当前选项卡:
- Scenarios 部分:将选定的场景设为“Yes”,其他场景全部设为“No”。用更亮的绿色突出显示选中的场景。
- Options 部分:应用用户选择的组件。对于未明确讨论的选项,应用最佳实践默认值,并在批注中注明。
- Bootstrap 选项卡:无论选择哪种 IaC,都始终填写,因为这是共享内容。
第 6 阶段:呈现结果
保存已填写的清单后:
- 打印汇总表,显示所有已填写的值
- 列出标记为需要用户操作的项目(黄色高亮)
- 指出任何架构方面的注意事项(例如,若 ALZ 区域与现有基础设施所在区域不同,则需要进行跨区域对等互连)
- 提供文件下载链接
最佳实践建议
阅读 references/alz-best-practices.md,了解完整建议。用户选择暂不决定时,应用以下关键默认值:
- 专用网络:true(状态存储绝不应公开访问)
- 独立的 CI/CD 模板仓库:true(在代码和流水线定义之间建立安全边界)
- 分支策略:true(所有变更都要求通过 PR 提交)
- 自托管 Agent/运行器:true(专用网络所必需)
- DDoS Protection:Yes(为所有 VNet 资源提供网络层防护)
- Private DNS Zones:Yes(跨中枢辐射型拓扑使用 Private Endpoints 所必需)
- Azure Bastion:Yes(无需暴露公共 IP 即可安全访问 VM)
- AMA(Azure Monitoring Agent):保持启用(集中式监控)
- Defender 计划:保持启用(跨所有资源类型进行威胁检测)
- Zero Trust:Yes(最小权限访问和微分段)
- AMBA 警报(仅 Terraform):Yes(主动监控平台资源)
- Sovereign Landing Zone:No(除非合规要求明确规定必须使用)
跨区域注意事项
如果用户的现有基础设施与 ALZ 部署位于不同区域,请在 Bootstrap 选项卡的区域批注中标记这一点。他们需要规划 ALZ 中枢与任何现有中枢辐射型拓扑之间的跨区域 VNet 对等互连。
单元格引用映射
清单采用固定结构。写入值时,请使用这些确切的单元格引用,以避免行偏移错误。始终先检查 B 列(Name)是否与预期字段相符,再写入 F 列。
Bootstrap 选项卡(加速器 - Bootstrap)
| 行 | 单元格 | 字段(B 列) | 配置设置(D 列) |
|---|---|---|---|
| 4 | F4 | 基础设施即代码 | iac_type |
| 5 | F5 | 版本控制系统 | bootstrap_module_name |
| 6 | F6 | 入门模块 | starter_module_name |
| 8 | F8 | Bootstrap 资源区域 | bootstrap_location |
| 9 | F9 | 父级管理组 ID | root_parent_management_group_id |
| 10 | F10 | 管理订阅 ID | subscription_id_management |
| 11 | F11 | 连接订阅 ID | subscription_id_connectivity |
| 12 | F12 | 标识订阅 ID | subscription_id_identity |
| 13 | F13 | 安全订阅 ID | subscription_id_identity(注意:模板中的拼写错误) |
| 15 | F15 | Bootstrap 订阅 ID | bootstrap_subscription_id |
| 16 | F16 | 资源命名:服务名称 | service_name |
| 17 | F17 | 资源命名:环境名称 | environment_name |
| 18 | F18 | 资源命名:后缀数字 | postfix_number |
| 21 | F21 | 为模板使用单独的存储库 | use_separate_repository_for_templates |
| 22 | F22 | 使用专用网络 | use_private_networking |
| 23 | F23 | 允许从我的 IP 访问存储 | allow_storage_access_from_my_ip |
| 24 | F24 | 应用审批者 | apply_approvers |
| 25 | F25 | 创建分支策略 | create_branch_policies |
| 28 | F28 | Azure DevOps PAT | azure_devops_personal_access_token |
| 29 | F29 | Azure DevOps Agent PAT | azure_devops_agents_personal_access_token |
| 30 | F30 | Azure DevOps 组织 | azure_devops_organization_name |
| 31 | F31 | Azure DevOps 旧版 URL | azure_devops_use_organisation_legacy_url |
| 32 | F32 | 创建 Azure DevOps 项目 | azure_devops_create_project |
| 33 | F33 | Azure DevOps 项目 | azure_devops_project_name |
| 34 | F34 | 使用自托管 Agent | use_self_hosted_agents |
注意:第 7、14、19、20、26、27、35、36、41 行为空白或为分节标题,请跳过。
Bicep 选项卡(加速器 - Bicep)— 场景
| 行 | 单元格 | 场景 |
|---|---|---|
| 6 | F6 | 多区域中心辐射型网络 + Azure Firewall |
| 7 | F7 | 多区域 vWAN + Azure Firewall |
| 8 | F8 | 多区域中心辐射型网络 + NVA |
| 9 | F9 | 多区域 vWAN + NVA |
| 10 | F10 | 仅管理组、策略和管理 |
| 11 | F11 | 单区域中心辐射型网络 + Azure Firewall |
| 12 | F12 | 单区域 vWAN + Azure Firewall |
| 13 | F13 | 单区域中心辐射型网络 + NVA |
| 14 | F14 | 单区域 vWAN + NVA |
Bicep 选项卡 — 选项(第 17-30 行)
| 行 | 单元格 | 选项 |
|---|---|---|
| 17 | F17 | 资源命名约定 |
| 18 | F18 | 自定义管理组名称 |
| 19 | F19 | 部署 DDOS Protection Plan |
| 20 | F20 | 部署 Private DNS |
| 21 | F21 | 部署 Bastion Host |
| 22 | F22 | 部署 VPN Gateway |
| 23 | F23 | 部署 ExpressRoute Gateway |
| 24 | F24 | 部署到 2 个以上区域 |
| 25 | F25 | IP 地址 |
| 26 | F26 | 更改策略分配强制模式 |
| 27 | F27 | 移除策略分配 |
| 28 | F28 | 关闭 Azure Monitoring Agent |
| 29 | F29 | 关闭 Defender 计划 |
| 30 | F30 | 零信任安全 |
Terraform 选项卡(加速器 - Terraform)
场景布局与 Bicep 相同(第 6–14 行)。选项位于第 17–32 行:
| 行 | 单元格 | 选项 |
|---|---|---|
| 17 | F17 | 资源命名约定 |
| 18 | F18 | 自定义管理组名称 |
| 19 | F19 | 部署 DDOS Protection Plan |
| 20 | F20 | 部署 Private DNS |
| 21 | F21 | 部署 Bastion Host |
| 22 | F22 | 部署 VPN Gateway |
| 23 | F23 | 部署 ExpressRoute Gateway |
| 24 | F24 | 部署到 2 个以上区域 |
| 25 | F25 | IP 寻址 |
| 26 | F26 | 更改策略分配的强制模式 |
| 27 | F27 | 移除策略分配 |
| 28 | F28 | 关闭 Azure Monitoring Agent |
| 29 | F29 | 部署 Azure Monitoring Baseline Alerts (AMBA) |
| 30 | F30 | 关闭 Defender 计划 |
| 31 | F31 | 零信任安全 |
| 32 | F32 | 主权着陆区 |
验证方法:写入任何值之前,先读取单元格 B{row} 并确认其与预期字段名称一致。如果不一致,则扫描工作表以找到正确的行。这样可以防止因模板版本差异而导致的数据静默损坏。
输出格式
最终交付内容为一个 .xlsx 文件,其中包含:
- 保留原始模板中的全部三个选项卡
- 在 F 列中填入所选值
- 添加附有理由和最佳实践参考的单元格批注
- 颜色编码:绿色(已确认)、黄色(需要处理)、浅黄色(默认值,需审核)
- 在对话中清晰总结所有决定和标记项
注意事项
- openpyxl 行索引从 1 开始——偏移一行的错误会静默地破坏错误的行;提交前请通过读取
cell.value进行验证。 - 订阅正则表达式匹配在非标准命名时会失效(例如
sub-xyz-platform-mgmt)——模式匹配失败时,请改用枚举方式。 - 跨区域注意事项:跨区域的 VNet 对等互连会产生出口流量费用;默认的 ALZ 模板未对此进行定价。
- Excel 复选框与单元格值:openpyxl 无法写入复选框状态——使用单元格值 "✓" + 命名范围表示已选中。
- 订阅配额传播:请求的配额增加在实际应用之前会显示为 "Approved"——请使用
az vm list-usage进行验证。