Solution Development Standards¶
Canonical reference: Solution Development Standard (full)
Applies to: All AzureLocal solution repositories
Last Updated: 2026-03-17
IaC Tool Support¶
Each tool must declare which deployment phases it supports:
| Tool | Azure Resources | Configuration | Networking | Monitoring |
|---|---|---|---|---|
| Terraform | ✅ | Delegates | ✅ | ✅ |
| Bicep | ✅ | Delegates | ✅ | ✅ |
| ARM | ✅ | Delegates | ✅ | ✅ |
| PowerShell | ✅ | ✅ | ✅ | ✅ |
| Ansible | ✅ | ✅ | ✅ | ✅ |
Delegates
"Delegates" means the tool provisions Azure resources but does not configure the guest OS. A separate tool (PowerShell or Ansible) handles guest configuration.
Parameter File Derivation¶
All tool-specific parameter files MUST be derivable from config/variables.yml:
| Tool | Parameter File | Derivation |
|---|---|---|
| Terraform | src/terraform/terraform.tfvars |
Map YAML sections to HCL variables |
| Bicep | src/bicep/main.bicepparam |
Map YAML sections to Bicep parameters |
| ARM | src/arm/azuredeploy.parameters.json |
Map YAML sections to ARM parameter schema |
| PowerShell | (reads config directly) | ConvertFrom-Yaml from config file |
| Ansible | src/ansible/inventory/hosts.yml |
Map YAML sections to group_vars |
The central config is the single source of truth. Tool-specific files are convenience copies that should be regenerable.
Conditional Resource Support¶
| Tool | Mechanism | Example |
|---|---|---|
| Terraform | count / for_each |
count = var.enable_feature ? 1 : 0 |
| Bicep | if condition |
resource res '...' = if (enableFeature) { ... } |
| ARM | condition property |
"condition": "[equals(parameters('enableFeature'), 'true')]" |
| PowerShell | switch / if |
if ($config.feature_enabled) { ... } |
| Ansible | when: clause |
when: enable_feature == true |
All tools must produce identical infrastructure when given the same configuration values.
Multi-Tool Parity¶
- Every supported tool must cover the same set of resources
- Tool-specific parameter files are derived from
config/variables.yml - CI tests validate that each tool's output matches the expected state
- New resources added to one tool must be added to all supported tools