Examples¶
Complete, ready-to-use template examples. Each shows both the Deployment Template and Resource Group Template files.
Example 1: Single VM¶
A minimal template that deploys one Windows VM with Firefox installed.
Deployment Template (singlevm.dunedpt.yaml):
---
schemaVersion: 1
name: singlevm
displayName: Single VM
version: 1.0.0
description: Single VM with Firefox
resourceGroups:
- name: singlevm
displayName: Single VM
template: singlevm
templateVersion: 1.0.0
Resource Group Template (singlevm.dunergt.yaml):
---
schemaVersion: 1
name: singlevm
displayName: Single VM
version: 1.0.0
description: Single Windows Server
resources:
- type: computeNode
computeType: virtualMachine
name: vmsingle
image: win2022
size: standard_d4s_v5
domain: yourdomain.local
config:
- name: package
variables:
name:
- firefox
Example 2: Parameterized Web Server¶
A web server with user-configurable CPU, memory, firewall rules, and an ACME certificate.
Deployment Template (webserver.dunedpt.yaml):
---
schemaVersion: 1
name: webserver
displayName: Web Server
version: 1.0.0
description: Nginx web server with HTTPS
parameters:
- name: cpu
description: Web Server vCPU count
type: number
default: 4
- name: memory
description: "Web Server memory (default: 16GB)"
type: string
default: 16GB
- name: fqdn
description: Public FQDN for the HTTPS certificate
type: string
- name: certEmail
description: Email for certificate notifications
type: string
resourceGroups:
- name: web
displayName: Web Server
template: webserver
templateVersion: 1.0.0
templateParameters:
cpu: "{{parameters.cpu}}"
memory: "{{parameters.memory}}"
fqdn: "{{parameters.fqdn}}"
certEmail: "{{parameters.certEmail}}"
Resource Group Template (webserver.dunergt.yaml):
---
schemaVersion: 1
name: webserver
displayName: Web Server (Nginx)
version: 1.0.0
description: Nginx web server with firewall and certificate
parameters:
- name: cpu
type: number
default: 4
- name: memory
type: string
default: 16GB
- name: fqdn
type: string
- name: certEmail
type: string
resources:
- type: computeNode
computeType: virtualMachine
name: vmweb
image: win2022
cpu: "{{parameters.cpu}}"
memory: "{{parameters.memory}}"
domain: yourdomain.local
config:
- name: package
variables:
name:
- nginx
- name: firewall-rule
variables:
name: allow-https
action: allow
localport: 443
protocol: tcp
direction: in
- name: request-certificate-acme
variables:
fqdn: "{{parameters.fqdn}}"
email: "{{parameters.certEmail}}"
target: iis
Example 3: Application + Database Server¶
A multi-resource-group deployment with an application server, SQL Server database, service accounts, and RBAC groups. This demonstrates cross-resource references and the full parameter flow.
Deployment Template (appdb.dunedpt.yaml):
---
schemaVersion: 1
name: appdb
displayName: App & DB Server
version: 1.0.0
description: Application server with SQL database
parameters:
- name: appCpu
description: App vCPU Count
type: number
default: 4
- name: appMemory
description: App Memory (GB)
type: number
default: 16
- name: dbAlias
type: string
description: DB Server alias
- name: dbCpu
type: number
description: Number of vCPUs
default: 4
- name: dbMemory
type: number
description: Memory (GB)
default: 32
- name: sqlVersion
type: string
description: "SQL version (e.g., sql17dev, sql19dev, sql22dev)"
- name: sqlFeatures
type: string
description: SQL features
default: SQLENGINE,FULLTEXT,IS
- name: sqlCollation
type: string
description: SQL collation
default: Latin1_General_CI_AS
- name: userDbDiskSize
type: string
description: "User DB disk size (default: 100GB)"
default: 100GB
- name: userLogDiskSize
type: string
description: "User Log disk size (default: 10GB)"
default: 10GB
- name: tempDbDiskSize
type: string
description: "Temp DB disk size (default: 20GB)"
default: 20GB
- name: tempLogDiskSize
type: string
description: "Temp Log disk size (default: 10GB)"
default: 10GB
resourceGroups:
- name: app
displayName: App Server
template: app-nginx
templateVersion: 1.0.0
templateParameters:
cpu: "{{parameters.appCpu}}"
memory: "{{parameters.appMemory}}"
- name: db
displayName: DB Server
template: genericsql
templateVersion: 1.0.0
templateParameters:
alias: "{{parameters.dbAlias}}"
cpu: "{{parameters.dbCpu}}"
memory: "{{parameters.dbMemory}}"
sqlVersion: "{{parameters.sqlVersion}}"
sqlFeatures: "{{parameters.sqlFeatures}}"
sqlCollation: "{{parameters.sqlCollation}}"
userDbDiskSize: "{{parameters.userDbDiskSize}}"
userLogDiskSize: "{{parameters.userLogDiskSize}}"
tempDbDiskSize: "{{parameters.tempDbDiskSize}}"
tempLogDiskSize: "{{parameters.tempLogDiskSize}}"
Resource Group Template — App Server (app-nginx.dunergt.yaml):
---
schemaVersion: 1
name: app-nginx
displayName: App Server (Nginx)
version: 1.0.0
description: Application server with Nginx and service account
parameters:
- name: cpu
type: number
- name: memory
type: number
resources:
- type: computeNode
computeType: virtualMachine
name: vmapp
image: win2022
cpu: "{{parameters.cpu}}"
memory: "{{parameters.memory}}"
domain: yourdomain.local
config:
- name: package
variables:
name:
- nginx
- name: invoke-psscript
variables:
script: |
sc.exe config "nginx" obj= "{{serviceaccount.svcapp.svcname}}" password= "{{serviceaccount.svcapp.svcpassword}}"
Get-Service nginx | Restart-Service
- type: serviceAccount
name: svcapp
svcName: "nginx-{{deployment.shortid}}"
memberOf:
- "yourdomain\\.serveradmins-{{computenode.vmapp}}"
Resource Group Template — SQL Server (genericsql.dunergt.yaml):
---
schemaVersion: 1
name: genericsql
displayName: Generic SQL Server
version: 1.0.0
description: Windows Server with SQL Server
parameters:
- name: alias
type: string
description: DB Server alias
- name: cpu
type: number
default: 4
- name: memory
type: number
default: 32
- name: sqlVersion
type: string
- name: sqlFeatures
type: string
default: SQLENGINE,FULLTEXT,IS
- name: sqlCollation
type: string
default: Latin1_General_CI_AS
- name: userDbDiskSize
type: string
default: 100GB
- name: userLogDiskSize
type: string
default: 10GB
- name: tempDbDiskSize
type: string
default: 20GB
- name: tempLogDiskSize
type: string
default: 10GB
resources:
- type: computeNode
computeType: virtualMachine
name: vmdb
displayName: DB Server
alias: ["{{parameters.alias}}"]
image: win2022
cpu: "{{parameters.cpu}}"
memory: "{{parameters.memory}}"
domain: yourdomain.local
disk:
- size: 100GB
volume:
- mountpoint: D
label: SQL_Bin
fileSystem: NTFS
- size: 10GB
volume:
- mountpoint: E
label: SQL_Data
fileSystem: NTFS
- size: "{{parameters.userDbDiskSize}}"
volume:
- mountpoint: E:\User_DB
label: User_DB
fileSystem: NTFS
blocksize: 65536
- size: "{{parameters.userLogDiskSize}}"
volume:
- mountpoint: E:\User_Log
label: User_Log
fileSystem: NTFS
blocksize: 65536
- size: "{{parameters.tempDbDiskSize}}"
volume:
- mountpoint: E:\Temp_DB
label: Temp_DB
fileSystem: NTFS
blocksize: 65536
- size: "{{parameters.tempLogDiskSize}}"
volume:
- mountpoint: E:\Temp_Log
label: Temp_Log
fileSystem: NTFS
blocksize: 65536
config:
- name: install-sql
variables:
mssql_version: "{{parameters.sqlVersion}}"
mssql_collation: "{{parameters.sqlCollation}}"
mssql_features: "{{parameters.sqlFeatures}}"
mssql_sysadmin_accounts: ["yourdomain\\{{rbacresourcegroup.rbacsysadmin.groupname}}"]
mssql_sqlsvc_account: "yourdomain\\{{serviceaccount.svcdb.svcname}}"
mssql_sqlsvc_account_pass: "{{serviceaccount.svcdb.svcpassword}}"
- name: package
variables:
name: sql-server-management-studio
- type: rbacResourceGroup
name: rbacsysadmin
groupName: "{{deployment.shortid}}-sysadmin"
members:
- "yourdomain\\svc-admin"
- type: serviceAccount
name: svcdb
svcName: "db-{{deployment.shortid}}"
memberOf:
- "yourdomain\\.serveradmins-{{computenode.vmdb}}"
- "yourdomain\\{{rbacresourcegroup.rbacsysadmin.groupname}}"
Example 4: High-Availability Database Cluster¶
A two-node SQL Server Always On cluster with WSFC, demonstrating dependsOn, cluster listeners, and cross-resource references.
Deployment Template (ha-database.dunedpt.yaml):
---
schemaVersion: 1
name: ha-database
displayName: HA Database Cluster
version: 1.0.0
description: Two-node SQL Server Always On cluster
parameters:
- name: sqlVersion
type: string
description: SQL Server version
default: sql22dev
- name: nodeMemory
type: number
description: Memory per node (GB)
default: 64
resourceGroups:
- name: dbcluster
displayName: Database Cluster
template: sql-always-on
templateVersion: 1.0.0
templateParameters:
sqlVersion: "{{parameters.sqlVersion}}"
nodeMemory: "{{parameters.nodeMemory}}"
Resource Group Template (sql-always-on.dunergt.yaml):
---
schemaVersion: 1
name: sql-always-on
displayName: SQL Server Always On
version: 1.0.0
description: Two-node WSFC with SQL Server Always On
parameters:
- name: sqlVersion
type: string
default: sql22dev
- name: nodeMemory
type: number
default: 64
resources:
- type: computeNode
computeType: virtualMachine
name: vmdb0
displayName: DB Node 1
image: win2022
cpu: 8
memory: "{{parameters.nodeMemory}}"
domain: yourdomain.local
disk:
- size: 200GB
volume:
- mountpoint: D
label: SQL_Data
fileSystem: NTFS
blocksize: 65536
config:
- name: install-sql
variables:
mssql_version: "{{parameters.sqlVersion}}"
mssql_features: SQLENGINE
mssql_sysadmin_accounts: ["yourdomain\\{{rbacresourcegroup.rbacsysadmin.groupname}}"]
mssql_sqlsvc_account: "yourdomain\\{{serviceaccount.svcsql.svcname}}"
mssql_sqlsvc_account_pass: "{{serviceaccount.svcsql.svcpassword}}"
- name: win-feature
variables:
name: Failover-Clustering
include_management_tools: true
- type: computeNode
computeType: virtualMachine
name: vmdb1
displayName: DB Node 2
image: win2022
cpu: 8
memory: "{{parameters.nodeMemory}}"
domain: yourdomain.local
disk:
- size: 200GB
volume:
- mountpoint: D
label: SQL_Data
fileSystem: NTFS
blocksize: 65536
config:
- name: install-sql
variables:
mssql_version: "{{parameters.sqlVersion}}"
mssql_features: SQLENGINE
mssql_sysadmin_accounts: ["yourdomain\\{{rbacresourcegroup.rbacsysadmin.groupname}}"]
mssql_sqlsvc_account: "yourdomain\\{{serviceaccount.svcsql.svcname}}"
mssql_sqlsvc_account_pass: "{{serviceaccount.svcsql.svcpassword}}"
- name: win-feature
variables:
name: Failover-Clustering
include_management_tools: true
- type: cluster
clusterType: wsfc
name: clusterdb
domain: yourdomain.local
nodes:
- "{{computenode.vmdb0.fqdn}}"
- "{{computenode.vmdb1.fqdn}}"
dependsOn:
- computenode.vmdb0
- computenode.vmdb1
listeners:
- name: lstndb
hostname: "db-{{deployment.shortid}}"
port: 1433
- type: rbacResourceGroup
name: rbacsysadmin
groupName: "{{deployment.shortid}}-db-sysadmin"
members:
- "yourdomain\\dba-team"
- type: serviceAccount
name: svcsql
svcName: "sql-{{deployment.shortid}}"
memberOf:
- "yourdomain\\.serveradmins-{{computenode.vmdb0}}"
- "yourdomain\\.serveradmins-{{computenode.vmdb1}}"
This template demonstrates:
- Two compute nodes with identical configuration for HA
- WSFC cluster with
dependsOnensuring both VMs are ready before cluster creation - Cluster listener providing a single connection endpoint for applications
- Shared service account used by both SQL Server instances
- RBAC group for centralized sysadmin access