Skip to content

Commit 1e759a0

Browse files
feat(san): add SAN disaggregated deployment path (Phase 03 + planning + structure)
- Phase 03: add Tasks 12-14 (FC HBA drivers, MPIO/MSDSM, LUN verification) - Phase 03: renumber combined script (12→15) and verification (13→16) - Phase 03: update index with SAN branch in flowchart and task table - Planning: add 07-storage-planning.mdx (S2D vs SAN decision guide, LUN layout) - Planning: add SAN/FC sections to discovery-checklist, site-assessment, hardware-requirements, and customer-workshops - Deployment methods: restructure into s2d/ and san/ topology subdirectories - Deployment methods: update index.mdx to 3-axis decision tree (storage×auth×method) - Deployment methods: fix all relative links in moved S2D runbooks (+1 dir depth) - Deployment methods: fix cross-references in phase-05 index, outer deployment-methods index, portal/ARM overview files, and deployment-monitoring Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent de0a58f commit 1e759a0

29 files changed

Lines changed: 1329 additions & 110 deletions

docs/implementation/04-cluster-deployment/deployment-methods/01-portal-deployment.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ Portal deployment provides a guided wizard experience for deploying Azure Local
3636

3737
| Authentication | Description | Link |
3838
|---------------|-------------|------|
39-
| **Active Directory** | Enterprise deployment with domain-joined nodes | [AD - Portal Deployment](../phase-05-cluster-deployment/deployment-methods/active-directory/portal-instructions.mdx) |
40-
| **Local Identity** | Edge/standalone deployment without AD | [Local Identity - Portal](../phase-05-cluster-deployment/deployment-methods/local-identity/portal-instructions.mdx) |
39+
| **Active Directory** | Enterprise deployment with domain-joined nodes | [AD - Portal Deployment](../phase-05-cluster-deployment/deployment-methods/s2d/active-directory/portal-instructions.mdx) |
40+
| **Local Identity** | Edge/standalone deployment without AD | [Local Identity - Portal](../phase-05-cluster-deployment/deployment-methods/s2d/local-identity/portal-instructions.mdx) |
4141

4242
### SAN (Disaggregated)
4343

docs/implementation/04-cluster-deployment/deployment-methods/02-arm-template-deployment.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ ARM template deployment provides infrastructure-as-code deployment for Azure Loc
3636

3737
| Authentication | Description | Link |
3838
|---------------|-------------|------|
39-
| **Active Directory** | Enterprise deployment with domain-joined nodes | [AD - ARM Template](../phase-05-cluster-deployment/deployment-methods/active-directory/arm-template-instructions.mdx) |
40-
| **Local Identity** | Edge/standalone deployment without AD | [Local Identity - ARM Template](../phase-05-cluster-deployment/deployment-methods/local-identity/arm-template-instructions.mdx) |
39+
| **Active Directory** | Enterprise deployment with domain-joined nodes | [AD - ARM Template](../phase-05-cluster-deployment/deployment-methods/s2d/active-directory/arm-template-instructions.mdx) |
40+
| **Local Identity** | Edge/standalone deployment without AD | [Local Identity - ARM Template](../phase-05-cluster-deployment/deployment-methods/s2d/local-identity/arm-template-instructions.mdx) |
4141

4242
### SAN (Disaggregated)
4343

docs/implementation/04-cluster-deployment/deployment-methods/index.mdx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ Azure Local clusters can be deployed using different methods. This section provi
3636

3737
| Method | Best For | Link |
3838
|--------|----------|------|
39-
| **Portal (AD)** | Enterprise/Learning | [AD Portal Deployment](../phase-05-cluster-deployment/deployment-methods/active-directory/portal-instructions.mdx) |
40-
| **ARM Template (AD)** | Production/Multi-site | [AD ARM Template](../phase-05-cluster-deployment/deployment-methods/active-directory/arm-template-instructions.mdx) |
41-
| **Portal (Local)** | Edge/Disconnected | [Local Portal Deployment](../phase-05-cluster-deployment/deployment-methods/local-identity/portal-instructions.mdx) |
42-
| **ARM Template (Local)** | Automated Edge | [Local ARM Template](../phase-05-cluster-deployment/deployment-methods/local-identity/arm-template-instructions.mdx) |
39+
| **Portal (AD)** | Enterprise/Learning | [AD Portal Deployment](../phase-05-cluster-deployment/deployment-methods/s2d/active-directory/portal-instructions.mdx) |
40+
| **ARM Template (AD)** | Production/Multi-site | [AD ARM Template](../phase-05-cluster-deployment/deployment-methods/s2d/active-directory/arm-template-instructions.mdx) |
41+
| **Portal (Local)** | Edge/Disconnected | [Local Portal Deployment](../phase-05-cluster-deployment/deployment-methods/s2d/local-identity/portal-instructions.mdx) |
42+
| **ARM Template (Local)** | Automated Edge | [Local ARM Template](../phase-05-cluster-deployment/deployment-methods/s2d/local-identity/arm-template-instructions.mdx) |
4343

4444
### SAN (Disaggregated)
4545

docs/implementation/04-cluster-deployment/phase-03-os-configuration/index.mdx

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,12 @@ This stage configures the Azure Stack HCI operating system on all cluster nodes
3939
8. Enable ICMP firewall rules for network diagnostics
4040
9. Disable unused network adapters
4141
10. Set node hostnames
42-
11. Clear previous storage configuration (conditional)
43-
12. Optional: Run complete combined script
42+
11. Clear previous storage configuration (conditional — S2D redeployments only)
43+
12. Install FC HBA drivers (conditional — SAN deployments only)
44+
13. Configure MPIO and vendor MSDSM (conditional — SAN deployments only)
45+
14. Verify SAN LUN presentation (conditional — SAN deployments only)
46+
15. Optional: Run complete combined script (Tasks 02–10)
47+
16. Phase 03 Verification
4448

4549
**Validation:**
4650

@@ -58,38 +62,49 @@ This stage configures the Azure Stack HCI operating system on all cluster nodes
5862

5963
```mermaid
6064
flowchart TD
61-
A[Start: OS Installed] --> B[Enable WinRM]
62-
B --> C[Enable RDP]
63-
C --> D[Static IP]
64-
D --> E[Disable DHCP]
65-
E --> F[DNS Config]
66-
F --> G[Verify DNS]
67-
G --> H[NTP Config]
68-
H --> I[Enable ICMP]
69-
I --> J[Disable Unused NICs]
70-
J --> K[Hostname]
71-
K --> L[Storage Cleanup]
72-
L --> M[Ready for Arc]
65+
A[Start: OS Installed] --> B[Enable WinRM]
66+
B --> C[Enable RDP]
67+
C --> D[Static IP]
68+
D --> E[Disable DHCP]
69+
E --> F[DNS Config]
70+
F --> G[Verify DNS]
71+
G --> H[NTP Config]
72+
H --> I[Enable ICMP]
73+
I --> J[Disable Unused NICs]
74+
J --> K[Hostname]
75+
K --> L[Storage Cleanup T11]
76+
L --> M{Storage Type?}
77+
M -->|S2D| N[Combined Script T15]
78+
M -->|SAN| O[FC HBA Drivers T12]
79+
O --> P[MPIO & MSDSM T13]
80+
P --> Q[Verify LUN Presentation T14]
81+
Q --> N
82+
N --> R[Phase 03 Verification T16]
83+
R --> S[Ready for Arc Registration]
7384
```
7485

7586
---
7687

7788
## Steps Overview
7889

79-
| Step | Description | Time |
80-
|------|-------------|------|
81-
| [Task 1](./task-01-enable-winrm-for-remote-management.mdx) | Enable WinRM for Remote Management | 5 min |
82-
| [Task 2](./task-02-enable-rdp.mdx) | Enable RDP (Remote Desktop Protocol) | 5 min |
83-
| [Task 3](./task-03-configure-static-ip-address.mdx) | Configure Static IP Address | 10 min |
84-
| [Task 4](./task-04-disable-dhcp-on-management-adapter.mdx) | Disable DHCP on Management Adapter | 5 min |
85-
| [Task 5](./task-05-configure-dns-servers.mdx) | Configure DNS Servers | 5 min |
86-
| [Task 6](./task-06-verify-dns-client-configuration.mdx) | Verify DNS Client Configuration | 5 min |
87-
| [Task 7](./task-07-configure-time-synchronization-ntp.mdx) | Configure Time Synchronization (NTP) | 5 min |
88-
| [Task 8](./task-08-enable-icmp-ping.mdx) | Enable ICMP (Ping) | 5 min |
89-
| [Task 9](./task-09-disable-unused-network-adapters.mdx) | Disable Unused Network Adapters | 5 min |
90-
| [Task 10](./task-10-configure-hostname.mdx) | Configure Hostname | 5 min |
91-
| [Task 11](./task-11-clear-previous-storage-configuration-conditional.mdx) | Clear Previous Storage Configuration | 5 min |
92-
| [Task 12](./task-12-complete-combined-script-all-steps.mdx) | Complete Combined Script | N/A |
90+
| Step | Description | Time | Applies To |
91+
|------|-------------|------|-----------|
92+
| [Task 01](./task-01-enable-winrm-for-remote-management.mdx) | Enable WinRM for Remote Management | 5 min | All |
93+
| [Task 02](./task-02-enable-rdp.mdx) | Enable RDP (Remote Desktop Protocol) | 5 min | All |
94+
| [Task 03](./task-03-configure-static-ip-address.mdx) | Configure Static IP Address | 10 min | All |
95+
| [Task 04](./task-04-disable-dhcp-on-management-adapter.mdx) | Disable DHCP on Management Adapter | 5 min | All |
96+
| [Task 05](./task-05-configure-dns-servers.mdx) | Configure DNS Servers | 5 min | All |
97+
| [Task 06](./task-06-verify-dns-client-configuration.mdx) | Verify DNS Client Configuration | 5 min | All |
98+
| [Task 07](./task-07-configure-time-synchronization-ntp.mdx) | Configure Time Synchronization (NTP) | 5 min | All |
99+
| [Task 08](./task-08-enable-icmp-ping.mdx) | Enable ICMP (Ping) | 5 min | All |
100+
| [Task 09](./task-09-disable-unused-network-adapters.mdx) | Disable Unused Network Adapters | 5 min | All |
101+
| [Task 10](./task-10-configure-hostname.mdx) | Configure Hostname | 5 min | All |
102+
| [Task 11](./task-11-clear-previous-storage-configuration-conditional.mdx) | Clear Previous Storage Configuration | 5 min | S2D redeployment |
103+
| [Task 12](./task-12-install-fc-hba-drivers-conditional.mdx) | Install FC HBA Drivers | 15 min | SAN only |
104+
| [Task 13](./task-13-configure-mpio-and-vendor-msdsm-conditional.mdx) | Configure MPIO & Vendor MSDSM | 15 min | SAN only |
105+
| [Task 14](./task-14-verify-san-lun-presentation-conditional.mdx) | Verify SAN LUN Presentation | 10 min | SAN only |
106+
| [Task 15](./task-15-complete-combined-script-all-steps.mdx) | Complete Combined Script | N/A | Optional |
107+
| [Task 16](./task-16-phase03-verification.mdx) | Phase 03 Verification | 10 min | All |
93108

94109
---
95110

@@ -138,7 +153,9 @@ The following variables are used during OS configuration:
138153

139154
**Manual**: Follow each step in sequence.
140155

141-
**Automated**: Use [Task 12: Combined Script](./task-12-complete-combined-script-all-steps.mdx) for full automation.
156+
**Automated**: Use [Task 15: Combined Script](./task-15-complete-combined-script-all-steps.mdx) for full automation of Tasks 02–10.
157+
158+
**SAN deployments**: Run Tasks 12–14 after Task 11 before running the combined script.
142159

143160
---
144161

@@ -152,6 +169,9 @@ The following variables are used during OS configuration:
152169
| DNS resolution works ||
153170
| Time synchronized ||
154171
| Hostname correct ||
172+
| FC HBA ports visible (SAN only) | ⚙️ |
173+
| MPIO configured (SAN only) | ⚙️ |
174+
| Infrastructure LUNs RAW (SAN only) | ⚙️ |
155175

156176
---
157177

@@ -161,7 +181,7 @@ After completing OS configuration:
161181

162182
| All Steps Complete? | Next Action |
163183
|---------------------|-------------|
164-
| ✅ Yes | Proceed to [Phase 14: Arc Registration](../phase-04-arc-registration/index.mdx) |
184+
| ✅ Yes | Proceed to [Phase 04: Arc Registration](../phase-04-arc-registration/index.mdx) |
165185
| ❌ No | Complete remaining configuration steps |
166186

167187
---

docs/implementation/04-cluster-deployment/phase-03-os-configuration/task-11-clear-previous-storage-configuration-conditional.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ The procedures in this task use the scripted methods shown in the tabs above. Ad
200200

201201
## Navigation
202202

203-
[← Task 10: Configure Hostname](./task-10-configure-hostname.mdx) · [↑ Phase 03](./index.mdx) · [Task 12: Combined Script →](./task-12-complete-combined-script-all-steps.mdx)
203+
[← Task 10: Configure Hostname](./task-10-configure-hostname.mdx) · [↑ Phase 03](./index.mdx) · [SAN: Task 12: FC HBA Drivers →](./task-12-install-fc-hba-drivers-conditional.mdx) · [S2D: Task 15: Combined Script →](./task-15-complete-combined-script-all-steps.mdx)
204204

205205
---
206206

Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
---
2+
title: "Task 12: Install FC HBA Drivers (Conditional)"
3+
sidebar_label: "Task 12: FC HBA Drivers"
4+
sidebar_position: 12
5+
description: "Install Fibre Channel HBA drivers on Azure Local nodes for SAN disaggregated deployments"
6+
category: "Runbook"
7+
scope: "FC HBA driver installation for SAN deployments"
8+
purpose: "Install and verify FC HBA drivers so nodes can present WWPNs to the FC fabric before zoning"
9+
author: "Azure Local Cloud"
10+
created: 2026-05-02
11+
updated: 2026-05-02
12+
version: "1.0.0"
13+
tags:
14+
- azure-local
15+
- cluster-deployment
16+
- os-configuration
17+
- san
18+
- fibre-channel
19+
keywords:
20+
- FC HBA
21+
- Fibre Channel
22+
- HBA drivers
23+
- WWPN
24+
- SAN
25+
status: "Active"
26+
---
27+
28+
import Tabs from '@theme/Tabs';
29+
import TabItem from '@theme/TabItem';
30+
31+
# Task 12: Install FC HBA Drivers (Conditional)
32+
33+
[![Runbook](https://img.shields.io/badge/Type-Runbook-blue?style=flat-square)](./index.mdx)
34+
[![Phase 03](https://img.shields.io/badge/Phase-03_OS_Configuration-orange?style=flat-square)](./index.mdx)
35+
[![Platform](https://img.shields.io/badge/Platform-Azure_Local-0078D4?style=flat-square)](https://learn.microsoft.com/en-us/azure-stack/hci/)
36+
37+
> **DOCUMENT CATEGORY**: Runbook
38+
> **SCOPE**: FC HBA driver installation
39+
> **PURPOSE**: Install and verify FC HBA drivers so nodes present WWPNs to the FC fabric
40+
> **MASTER REFERENCE**: [Microsoft Learn — Prepare hardware for Azure Local SAN deployment](https://learn.microsoft.com/en-us/azure/azure-local/plan/fiber-channel-no-backup-disaggregated-pattern?view=azloc-2604)
41+
42+
**Status**: Active
43+
44+
:::info Skip this task if deploying Storage Spaces Direct (S2D)
45+
This task applies only to **disaggregated SAN deployments**. If you are deploying with Storage Spaces Direct (hyperconverged), skip to [Task 15: Complete Combined Script](./task-15-complete-combined-script-all-steps.mdx).
46+
:::
47+
48+
## Overview
49+
50+
Azure Local disaggregated deployments require Fibre Channel Host Bus Adapters (HBAs) in each node. Before zoning can be configured in the FC fabric, the HBA drivers must be installed and WWPNs collected. This task installs vendor-provided drivers and records each node's WWPN for FC fabric zoning.
51+
52+
---
53+
54+
## When to Run
55+
56+
| Scenario | Run? |
57+
|---|---|
58+
| SAN disaggregated deployment | ✅ Yes — all nodes |
59+
| Storage Spaces Direct (S2D) deployment | ❌ Skip |
60+
| HBA drivers already installed from OEM image | ✅ Yes — verify and collect WWPNs |
61+
62+
---
63+
64+
## Prerequisites
65+
66+
| Requirement | Details |
67+
|---|---|
68+
| Tasks 01–11 complete | Nodes named, storage cleaned |
69+
| HBA hardware installed | FC HBAs seated in PCIe slots on all nodes |
70+
| HBA vendor driver package | Download from your HBA vendor (Emulex, QLogic, Broadcom, Marvell, etc.) |
71+
| FC fabric access | Fabric admin ready to configure zoning after WWPN collection |
72+
73+
---
74+
75+
## Variables from variables.yml
76+
77+
| Path | Type | Description |
78+
|------|------|-------------|
79+
| `cluster_nodes[].management_ip` | string | PSRemoting target IP (orchestrated mode) |
80+
| `cluster_nodes[].hostname` | string | Node display name for logging |
81+
| `cluster_nodes[].fc_hba[].wwpn` | string | Record here after collection — used for FC zoning |
82+
83+
---
84+
85+
## Execution Options
86+
87+
<Tabs groupId="deployment-method">
88+
<TabItem value="direct" label="Direct (On Node)" default>
89+
90+
Run on each node individually via console, RDP, or PSRemoting.
91+
92+
**Toolkit script:** `scripts/deploy/04-cluster-deployment/phase-03-os-configuration/task-12-install-fc-hba-drivers-conditional/powershell/Install-FcHbaDrivers-Direct.ps1`
93+
94+
```powershell
95+
# Task 12 - Install FC HBA Drivers (run on each node)
96+
# Consult your HBA vendor documentation for the correct .inf driver path
97+
98+
# Stage 1: Install driver via PnP
99+
# Replace <path-to-driver.inf> with the vendor-provided INF file path
100+
PNPUTIL /add-driver "<path-to-driver.inf>" /install
101+
102+
# Stage 2: Confirm HBA ports are detected
103+
Get-InitiatorPort | Select-Object NodeAddress, PortAddress, ConnectionType |
104+
Where-Object { $_.ConnectionType -eq 'Fibre Channel' } |
105+
Format-Table -AutoSize
106+
107+
# Stage 3: Record WWPNs for each node (save to variables.yml)
108+
# PortAddress field contains the WWPN in XX:XX:XX:XX:XX:XX:XX:XX format
109+
Get-InitiatorPort | Where-Object { $_.ConnectionType -eq 'Fibre Channel' } |
110+
Select-Object @{N='Node';E={$env:COMPUTERNAME}}, NodeAddress, PortAddress |
111+
Export-Csv -Path "C:\Temp\wwpn-$env:COMPUTERNAME.csv" -NoTypeInformation
112+
```
113+
114+
</TabItem>
115+
<TabItem value="orchestrated" label="Orchestrated Script">
116+
117+
Run from the management server against all nodes.
118+
119+
**Toolkit script:** `scripts/deploy/04-cluster-deployment/phase-03-os-configuration/task-12-install-fc-hba-drivers-conditional/powershell/Invoke-FcHbaDrivers-Orchestrated.ps1`
120+
121+
```powershell
122+
# Task 12 - Install FC HBA Drivers (orchestrated)
123+
# variables.yml: cluster_nodes[].management_ip -> $ServerList
124+
125+
$ConfigPath = "$env:USERPROFILE\variables.yml"
126+
$ServerList = (Get-Content $ConfigPath | Select-String 'management_ip:\s+"?([^"'' ]+)' |
127+
ForEach-Object { $_.Matches[0].Groups[1].Value.Trim() })
128+
129+
# Collect WWPNs from all nodes
130+
Invoke-Command -ComputerName $ServerList -ScriptBlock {
131+
Get-InitiatorPort | Where-Object { $_.ConnectionType -eq 'Fibre Channel' } |
132+
Select-Object @{N='Node';E={$env:COMPUTERNAME}}, NodeAddress, PortAddress
133+
} | Sort-Object Node | Format-Table -AutoSize
134+
```
135+
136+
> **Note:** Driver installation requires staging the vendor INF to each node before running. Consult your HBA vendor documentation for the driver package appropriate to the installed HBA model.
137+
138+
</TabItem>
139+
<TabItem value="standalone" label="Standalone Script">
140+
141+
> **When to use**: Use this option for a self-contained deployment without a shared configuration file.
142+
143+
**Script**: See [`azurelocal-toolkit`](https://github.com/AzureLocal/azurelocal-toolkit)`scripts/deploy/` for the standalone script for this task.
144+
145+
:::note Content Pending
146+
Standalone script content references the toolkit repository. See the Orchestrated Script tab for the primary implementation.
147+
:::
148+
149+
</TabItem>
150+
</Tabs>
151+
152+
---
153+
154+
## Validation
155+
156+
```powershell
157+
# Confirm HBA ports are online and WWPNs visible
158+
$ServerList = @("<node1-ip>", "<node2-ip>")
159+
Invoke-Command -ComputerName $ServerList -ScriptBlock {
160+
Get-InitiatorPort | Where-Object { $_.ConnectionType -eq 'Fibre Channel' } |
161+
Select-Object @{N='Node';E={$env:COMPUTERNAME}}, PortAddress, ConnectionType, OperationalStatus
162+
} | Sort-Object Node | Format-Table -AutoSize
163+
```
164+
165+
**Expected:** Each node shows 1–4 FC initiator ports depending on HBA count. `OperationalStatus` should be `Online` once fabric-connected.
166+
167+
---
168+
169+
## WWPN Collection Worksheet
170+
171+
| Node | HBA Port | WWPN | Fabric (A/B) |
172+
|------|----------|------|--------------|
173+
| NODE01 | Port 0 | ___________________________ | A |
174+
| NODE01 | Port 1 | ___________________________ | B |
175+
| NODE02 | Port 0 | ___________________________ | A |
176+
| NODE02 | Port 1 | ___________________________ | B |
177+
178+
:::note Provide WWPNs to FC Fabric Admin
179+
Once WWPNs are collected, provide them to the FC fabric administrator for zoning configuration. Zoning must be completed **after** Arc registration (Phase 04) — the storage array's port WWPNs are needed to complete the zone configuration.
180+
:::
181+
182+
---
183+
184+
## Rolling Reboot (if required)
185+
186+
Driver installation may require a node restart. In a cluster, reboot one node at a time to maintain availability:
187+
188+
```powershell
189+
# Drain and reboot one node at a time
190+
Suspend-ClusterNode -Name "<NodeName>" -Drain
191+
# Wait for roles to migrate
192+
Restart-Computer -ComputerName "<node-ip>" -Force
193+
# Wait for node to rejoin
194+
Resume-ClusterNode -Name "<NodeName>"
195+
```
196+
197+
For initial pre-cluster deployment (Phase 03), simply reboot each node and confirm the OS comes back online.
198+
199+
---
200+
201+
## Validation Checklist
202+
203+
- [ ] HBA drivers installed on all nodes
204+
- [ ] FC initiator ports visible (`Get-InitiatorPort` shows Fibre Channel ports)
205+
- [ ] WWPNs collected and recorded in `variables.yml` under `cluster_nodes[].fc_hba[].wwpn`
206+
- [ ] WWPN list provided to FC fabric administrator
207+
208+
---
209+
210+
## Navigation
211+
212+
[← Task 11: Clear Storage](./task-11-clear-previous-storage-configuration-conditional.mdx) · [↑ Phase 03](./index.mdx) · [Task 13: Configure MPIO →](./task-13-configure-mpio-and-vendor-msdsm-conditional.mdx)
213+
214+
---
215+
216+
## Version Control
217+
218+
| Version | Date | Author | Changes |
219+
|---------|------|--------|---------|
220+
| 1.0.0 | 2026-05-02 | Azure Local Cloud | Initial release |

0 commit comments

Comments
 (0)