Skip to content

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 dependsOn ensuring 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