├── 2017
├── 2017 - 05 - Grab a Stroopwafel while we watch ARM do an automated RDS deployment in Azure IaaS.pdf
├── 2017 - 09 - Virtual desktops in the cloud Experiences from the field.pdf
└── 2017 - 11 - E2EVC Barcelona 2017 - Microsoft RDS - current state and future vision.pdf
├── 2018
├── 2018 - 01 - Become an ARM hero and deploy RDS on Azure in under 30 minutes.pdf
├── 2018 - 01 - Shaping the future of Remote Desktop Services on Azure.pdf
├── 2018 - 03 - Shaping the future of Remote Desktop on Azure.pdf
├── 2018 - 07 - Shaping the future of Remote Desktop Services.pptx
├── 2018 - 07 - Top 7 facts in comparing RDS on Azure IaaS vs Azure PaaS.pdf
├── 2018 - 08 - Measuring perceived end user experience in RDS, and why you should care.pdf
└── 2018 - 10 - RDS on Azure or WVD, Here's What You Need to Know!.pdf
├── 2019
├── 2019 - 01 - Become an ARM hero and deploy RDS on Azure in under 30 minutes.pdf
├── 2019 - 01 - Windows Virtual Desktop, the Future of App and Desktop Delivery on Azure!.pdf
├── 2019 - 04 - Windows Virtual Desktop, the Future of App and Desktop Delivery on Azure!.pdf
├── 2019 - 05 - Windows Virtual Desktop, the Future of App and Desktop Delivery on Azure!.pdf
├── 2019 - 09 - Application and Desktop delivery on Azure, from cool to awesome!.pdf
└── 2019 - 12 - Jump start your Windows Virtual Desktop deployment.pdf
├── 2020
├── 2020 - 02 - Windows Virtual Desktop, Lessons Learned from the Field!.pdf
├── 2020 - 06 - Dealing with application landscapes on WVD, current and future!.pdf
├── 2020 - 09 - Windows Virtual Desktop, Advanced scenarios & lessons learned!.pdf
├── 2020 - 10 - Automating WVD using ARM,REST and PS.pdf
├── 2020 - 11 - Work hard, Play hard Powerful Desktops in Azure.pdf
└── 2021 - 02 - Project Bicep 0.2.pdf
├── 2021
├── 2021 - 09 - Understanding all security aspects of Azure Virtual Desktop.pdf
├── 2021 - 01 - Empowering ARM and JSON with Project Bicep.pdf
├── 2021 - 02 - Empowering your WVD deployments with Project Bicep, experiences from the field!.pdf
├── 2021 - 02 - Jump Start your automation skills for WVD.pdf
├── 2021 - 04 - ARM Workout with Project Bicep.pdf
├── 2021 - 04 - Empowering your WVD deployments with Project Bicep, experiences from the field.pdf
├── 2021 - 04 - Project Bicep - ARM Templates reloaded!.pdf
├── 2021 - 05 - Project Bicep - ARM Templates - ARM Templates Reloaded with a WVD focus!.pdf
├── 2021 - 05 - Project Bicep - ARM Templates Reloaded!.pdf
├── 2021 - 06 -Windows Virtual Desktop does not use port 3389, so we’re secure…. right.pdf
├── 2021 - 08 - Azure Virtual Desktop as a gaming console - present.pdf
├── 2021 - 08 - Flexing your Infrastructure as Code muscles with Bicep Templates!.pdf
├── 2021 - 08 - Understanding all security aspects of Azure Virtual Desktop.pdf
├── 2021 - 11 - AVD TechFest 2021 Winter Edition.pdf
├── 2021 - 11 - Empowering Infrastructure as Code on Azure using Bicep.pdf
├── 2021 - 12 - Empowering AVD Image deployments with Azure Pipelines and Liquit!.pdf
└── 2021 - 12 - Twelve features of Bicep – Christmas edition.pdf
├── 2022
├── 2022 - 03 - Infrastructure as Code with Bicep - on tour - MC2MC.pdf
├── 2022 - 03 - Infrastructure as Code with Bicep - on tour!.pdf
├── 2022 - 06 – Infrastructure as Code Masterclass.pdf
├── 2022 - 09 - Bicep - Infrastructure as Code Masterclass - part I.pdf
├── 2022 - 09 - Bicep - Infrastructure as Code Masterclass - part II.pdf
└── 2022 - 09 - My journey to Bicep and how you can get started!.pdf
├── 2023
├── 2023 - 01 - Azure User Group Sweden - Infrastructure as Code with Bicep on tour!.pdf
├── 2023 - 02 - Infrastructure as Code with Bicep on tour!.pdf
├── 2023 - 07 - Azure Greg Live Stream - Cool new Bicep features.pdf
├── 2023 - 11 - Bicep IaC for Azure.pdf
└── Workplace Ninja Summit 2023
│ ├── Friday
│ ├── 6. main.bicep
│ ├── 6. main.json
│ ├── 6.1 avd-backplane-module.bicep
│ ├── 6.2 avd-network-module.bicep
│ ├── 6.2.1 avd-template-vm.bicep
│ ├── 6.2.2 avd-peering-from-adds.bicep
│ ├── 6.3 avd-LogAnalytics.bicep
│ ├── 6.3 avd-monitor-diag.bicep
│ ├── 6.3.1 avd-monitor-diag-hostpool.bicep
│ ├── 6.3.2 avd-monitor-diag-workspace.bicep
│ ├── 6.4 avd-shared-image-gallery.bicep
│ ├── 6.4.1 avd-Image-definitions.bicep
│ ├── 6.4.1.1 avd-Image-Template.bicep
│ ├── 6.5 avd-fileservices-module.bicep
│ ├── 6.6 avd-KeyVault.bicep
│ ├── 6.7 avd-Scaling.bicep
│ ├── 7. avd-module.bicep
│ ├── 7. createACR.bicep
│ ├── 7. main.bicep
│ ├── 7.main-mcr.bicep
│ ├── 8. deploymentStackCreate.bicep
│ ├── 8. main.bicep
│ ├── Depl;oyCLI.mp4
│ ├── DeployADO.mp4
│ └── deployADO.yaml
│ ├── Thursday
│ ├── 1. scaffolding-snippets.bicep
│ ├── 1. scaffolding-snippets.mp4
│ ├── 2.1. modulair-add-params.bicep
│ ├── 2.2. modulair-add-decorators.bicep
│ ├── 3. bicep-param-example.bicep
│ ├── 3. bicep-param-example.bicepparam
│ ├── 4. avd-demo-to-decompile.bicep
│ ├── 4. avd-demo-to-decompile.json
│ ├── 5. Insert-resource-paste-json.bicep
│ ├── 6. avd-demo-to-visualize.bicep
│ ├── 7. VSCode deploy.bicep
│ ├── 8. main.bicep
│ ├── 8.avd-module.bicep
│ ├── 8.vm-loop-module.bicep
│ ├── 8.vnet-module.bicep
│ └── 8.x_oldschooltemplate.json
│ ├── Using Bicep for your Azure Virtual Desktop deployments - Masterclass.pdf
│ └── Using Bicep for your Azure Virtual Desktop deployments - StarterKit.pdf
├── 2024
├── 2024 - 01 - Mastering Bicep - Infrastructure as Code for Azure.pdf
├── 2024 - 04 - Mastering Bicep - Infrasstructure as Code for Azure.pdf
├── 2024 - 05 - Optimize Azure Infrastructure as Code Deployments with VS Code.pdf
├── 2024 - 06 - Navigating new Galaxies with Bicep Infrastructure as Code advanced topics.pdf
├── 2024 - 11 - Empower anywhere access to all apps in a hybrid, cloud, and AI world.pdf
├── 2024 - 11 - Flexing your muscles with Parallels RAS and Bicep.pdf
├── 2024 - 11 - Optimize Azure Infrastructure as Code Deployments with VS Code.pdf
├── 2024 - 12 - Flexing your EUC muscles with Bicep.pdf
└── Workplace Ninja Summit 2024
│ ├── 2024 - 09 - Attached to traditional golden images for AVD Get attached to something different.pdf
│ ├── 2024 - 09 - Using Bicep for Infra-as-Code deployments - The advanced AVD and W365 edition.pdf
│ └── source code
│ ├── LICENSE.md
│ ├── Tuesday
│ ├── Convert-PngToBase64String.ps1
│ ├── ConvertTo-RawIcon.ps1
│ ├── Create-AppAttachContainer.ps1
│ ├── aa-google-chrome.bicep
│ └── readme.md
│ └── Wednesday
│ ├── 1.Reusability
│ ├── acr.bicep
│ ├── main.bicep
│ ├── module-avd.bicep
│ ├── module-vm.bicep
│ ├── module-vnet.bicep
│ ├── publish_to_acr.ps1
│ └── temp.md
│ ├── 2.Deployment Stacks
│ ├── main.bicep
│ ├── module-ag.bicep
│ ├── module-hp.bicep
│ ├── module-ws.bicep
│ └── x_deploymentStack.bicep
│ ├── 3.Bicep Language innovations
│ ├── a. User-Defined_Types-1.bicep
│ ├── a. User-Defined_Types-1.bicepparam
│ ├── a. User-Defined_Types-2.bicep
│ ├── a. User-Defined_Types-2.bicepparam
│ ├── a. User-Defined_Types-3.bicep
│ ├── b. User-Defined-Functions.bicep
│ ├── b. User-Defined-Functions.main.bicep
│ └── b. User-Defined-Functions.parameters.json
│ └── 4.Graph API
│ ├── Graph-examples.bicep
│ └── temp.md
├── 2025
├── 2025 - 03 - Supercharge Azure Infrastructure as Code with VS Code and GitHub Copilot - Warsaw.pdf
├── 2025 - 03 - Supercharge Azure Infrastructure as Code with VS Code and GitHub Copilot.pdf
├── 2025 - 05 - Azure Marketplace Where Dreams (and Debugging Nightmares) Come True.pdf
├── 2025 - 05 - Optimize Your Infrastructure as Code with Bicep Modules - Build Once and Deploy Anywhere.pdf
├── 2025 - 09 - From Friction to Function What We Learned Growing AVD and Bicep.pdf
├── 2025 - 09 - Innovate, collaborate, and empower your AVD and W365 deployments with Bicep.pdf
└── 2025 - 10 - Practical Ways to Improve Your Azure Deployments with Bicep.pdf
├── LICENSE
├── README.md
├── fb-intro-photo.jpg
├── freekberson.jpg
└── header.jpg
/2017/2017 - 05 - Grab a Stroopwafel while we watch ARM do an automated RDS deployment in Azure IaaS.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2017/2017 - 05 - Grab a Stroopwafel while we watch ARM do an automated RDS deployment in Azure IaaS.pdf
--------------------------------------------------------------------------------
/2017/2017 - 09 - Virtual desktops in the cloud Experiences from the field.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2017/2017 - 09 - Virtual desktops in the cloud Experiences from the field.pdf
--------------------------------------------------------------------------------
/2017/2017 - 11 - E2EVC Barcelona 2017 - Microsoft RDS - current state and future vision.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2017/2017 - 11 - E2EVC Barcelona 2017 - Microsoft RDS - current state and future vision.pdf
--------------------------------------------------------------------------------
/2018/2018 - 01 - Become an ARM hero and deploy RDS on Azure in under 30 minutes.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2018/2018 - 01 - Become an ARM hero and deploy RDS on Azure in under 30 minutes.pdf
--------------------------------------------------------------------------------
/2018/2018 - 01 - Shaping the future of Remote Desktop Services on Azure.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2018/2018 - 01 - Shaping the future of Remote Desktop Services on Azure.pdf
--------------------------------------------------------------------------------
/2018/2018 - 03 - Shaping the future of Remote Desktop on Azure.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2018/2018 - 03 - Shaping the future of Remote Desktop on Azure.pdf
--------------------------------------------------------------------------------
/2018/2018 - 07 - Shaping the future of Remote Desktop Services.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2018/2018 - 07 - Shaping the future of Remote Desktop Services.pptx
--------------------------------------------------------------------------------
/2018/2018 - 07 - Top 7 facts in comparing RDS on Azure IaaS vs Azure PaaS.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2018/2018 - 07 - Top 7 facts in comparing RDS on Azure IaaS vs Azure PaaS.pdf
--------------------------------------------------------------------------------
/2018/2018 - 08 - Measuring perceived end user experience in RDS, and why you should care.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2018/2018 - 08 - Measuring perceived end user experience in RDS, and why you should care.pdf
--------------------------------------------------------------------------------
/2018/2018 - 10 - RDS on Azure or WVD, Here's What You Need to Know!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2018/2018 - 10 - RDS on Azure or WVD, Here's What You Need to Know!.pdf
--------------------------------------------------------------------------------
/2019/2019 - 01 - Become an ARM hero and deploy RDS on Azure in under 30 minutes.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2019/2019 - 01 - Become an ARM hero and deploy RDS on Azure in under 30 minutes.pdf
--------------------------------------------------------------------------------
/2019/2019 - 01 - Windows Virtual Desktop, the Future of App and Desktop Delivery on Azure!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2019/2019 - 01 - Windows Virtual Desktop, the Future of App and Desktop Delivery on Azure!.pdf
--------------------------------------------------------------------------------
/2019/2019 - 04 - Windows Virtual Desktop, the Future of App and Desktop Delivery on Azure!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2019/2019 - 04 - Windows Virtual Desktop, the Future of App and Desktop Delivery on Azure!.pdf
--------------------------------------------------------------------------------
/2019/2019 - 05 - Windows Virtual Desktop, the Future of App and Desktop Delivery on Azure!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2019/2019 - 05 - Windows Virtual Desktop, the Future of App and Desktop Delivery on Azure!.pdf
--------------------------------------------------------------------------------
/2019/2019 - 09 - Application and Desktop delivery on Azure, from cool to awesome!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2019/2019 - 09 - Application and Desktop delivery on Azure, from cool to awesome!.pdf
--------------------------------------------------------------------------------
/2019/2019 - 12 - Jump start your Windows Virtual Desktop deployment.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2019/2019 - 12 - Jump start your Windows Virtual Desktop deployment.pdf
--------------------------------------------------------------------------------
/2020/2020 - 02 - Windows Virtual Desktop, Lessons Learned from the Field!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2020/2020 - 02 - Windows Virtual Desktop, Lessons Learned from the Field!.pdf
--------------------------------------------------------------------------------
/2020/2020 - 06 - Dealing with application landscapes on WVD, current and future!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2020/2020 - 06 - Dealing with application landscapes on WVD, current and future!.pdf
--------------------------------------------------------------------------------
/2020/2020 - 09 - Windows Virtual Desktop, Advanced scenarios & lessons learned!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2020/2020 - 09 - Windows Virtual Desktop, Advanced scenarios & lessons learned!.pdf
--------------------------------------------------------------------------------
/2020/2020 - 10 - Automating WVD using ARM,REST and PS.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2020/2020 - 10 - Automating WVD using ARM,REST and PS.pdf
--------------------------------------------------------------------------------
/2020/2020 - 11 - Work hard, Play hard Powerful Desktops in Azure.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2020/2020 - 11 - Work hard, Play hard Powerful Desktops in Azure.pdf
--------------------------------------------------------------------------------
/2020/2021 - 02 - Project Bicep 0.2.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2020/2021 - 02 - Project Bicep 0.2.pdf
--------------------------------------------------------------------------------
/2021/2021 - 09 - Understanding all security aspects of Azure Virtual Desktop.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 09 - Understanding all security aspects of Azure Virtual Desktop.pdf
--------------------------------------------------------------------------------
/2021/2021 - 01 - Empowering ARM and JSON with Project Bicep.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 01 - Empowering ARM and JSON with Project Bicep.pdf
--------------------------------------------------------------------------------
/2021/2021 - 02 - Empowering your WVD deployments with Project Bicep, experiences from the field!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 02 - Empowering your WVD deployments with Project Bicep, experiences from the field!.pdf
--------------------------------------------------------------------------------
/2021/2021 - 02 - Jump Start your automation skills for WVD.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 02 - Jump Start your automation skills for WVD.pdf
--------------------------------------------------------------------------------
/2021/2021 - 04 - ARM Workout with Project Bicep.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 04 - ARM Workout with Project Bicep.pdf
--------------------------------------------------------------------------------
/2021/2021 - 04 - Empowering your WVD deployments with Project Bicep, experiences from the field.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 04 - Empowering your WVD deployments with Project Bicep, experiences from the field.pdf
--------------------------------------------------------------------------------
/2021/2021 - 04 - Project Bicep - ARM Templates reloaded!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 04 - Project Bicep - ARM Templates reloaded!.pdf
--------------------------------------------------------------------------------
/2021/2021 - 05 - Project Bicep - ARM Templates - ARM Templates Reloaded with a WVD focus!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 05 - Project Bicep - ARM Templates - ARM Templates Reloaded with a WVD focus!.pdf
--------------------------------------------------------------------------------
/2021/2021 - 05 - Project Bicep - ARM Templates Reloaded!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 05 - Project Bicep - ARM Templates Reloaded!.pdf
--------------------------------------------------------------------------------
/2021/2021 - 06 -Windows Virtual Desktop does not use port 3389, so we’re secure…. right.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 06 -Windows Virtual Desktop does not use port 3389, so we’re secure…. right.pdf
--------------------------------------------------------------------------------
/2021/2021 - 08 - Azure Virtual Desktop as a gaming console - present.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 08 - Azure Virtual Desktop as a gaming console - present.pdf
--------------------------------------------------------------------------------
/2021/2021 - 08 - Flexing your Infrastructure as Code muscles with Bicep Templates!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 08 - Flexing your Infrastructure as Code muscles with Bicep Templates!.pdf
--------------------------------------------------------------------------------
/2021/2021 - 08 - Understanding all security aspects of Azure Virtual Desktop.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 08 - Understanding all security aspects of Azure Virtual Desktop.pdf
--------------------------------------------------------------------------------
/2021/2021 - 11 - AVD TechFest 2021 Winter Edition.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 11 - AVD TechFest 2021 Winter Edition.pdf
--------------------------------------------------------------------------------
/2021/2021 - 11 - Empowering Infrastructure as Code on Azure using Bicep.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 11 - Empowering Infrastructure as Code on Azure using Bicep.pdf
--------------------------------------------------------------------------------
/2021/2021 - 12 - Empowering AVD Image deployments with Azure Pipelines and Liquit!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 12 - Empowering AVD Image deployments with Azure Pipelines and Liquit!.pdf
--------------------------------------------------------------------------------
/2021/2021 - 12 - Twelve features of Bicep – Christmas edition.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2021/2021 - 12 - Twelve features of Bicep – Christmas edition.pdf
--------------------------------------------------------------------------------
/2022/2022 - 03 - Infrastructure as Code with Bicep - on tour - MC2MC.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2022/2022 - 03 - Infrastructure as Code with Bicep - on tour - MC2MC.pdf
--------------------------------------------------------------------------------
/2022/2022 - 03 - Infrastructure as Code with Bicep - on tour!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2022/2022 - 03 - Infrastructure as Code with Bicep - on tour!.pdf
--------------------------------------------------------------------------------
/2022/2022 - 06 – Infrastructure as Code Masterclass.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2022/2022 - 06 – Infrastructure as Code Masterclass.pdf
--------------------------------------------------------------------------------
/2022/2022 - 09 - Bicep - Infrastructure as Code Masterclass - part I.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2022/2022 - 09 - Bicep - Infrastructure as Code Masterclass - part I.pdf
--------------------------------------------------------------------------------
/2022/2022 - 09 - Bicep - Infrastructure as Code Masterclass - part II.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2022/2022 - 09 - Bicep - Infrastructure as Code Masterclass - part II.pdf
--------------------------------------------------------------------------------
/2022/2022 - 09 - My journey to Bicep and how you can get started!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2022/2022 - 09 - My journey to Bicep and how you can get started!.pdf
--------------------------------------------------------------------------------
/2023/2023 - 01 - Azure User Group Sweden - Infrastructure as Code with Bicep on tour!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2023/2023 - 01 - Azure User Group Sweden - Infrastructure as Code with Bicep on tour!.pdf
--------------------------------------------------------------------------------
/2023/2023 - 02 - Infrastructure as Code with Bicep on tour!.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2023/2023 - 02 - Infrastructure as Code with Bicep on tour!.pdf
--------------------------------------------------------------------------------
/2023/2023 - 07 - Azure Greg Live Stream - Cool new Bicep features.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2023/2023 - 07 - Azure Greg Live Stream - Cool new Bicep features.pdf
--------------------------------------------------------------------------------
/2023/2023 - 11 - Bicep IaC for Azure.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2023/2023 - 11 - Bicep IaC for Azure.pdf
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6. main.bicep:
--------------------------------------------------------------------------------
1 | targetScope = 'subscription'
2 |
3 | @secure()
4 | param azureSubscriptionID string
5 |
6 | @secure()
7 | param azureADTenantID string
8 |
9 | @secure()
10 | param adminObjectID string
11 |
12 | @secure()
13 | param principalID string
14 |
15 | //Define AVD deployment parameters
16 | param resourceGroupProdPrefix string = 'BICEP-AVD-DEMO-P-'
17 | param resourceGroupAccPrefix string = 'BICEP-AVD-DEMO-A-'
18 | param resourceGroupPostfix string = '-RG'
19 | param AVDbackplanelocation string = 'westeurope'
20 | param hostPoolType string = 'pooled'
21 | param loadBalancerType string = 'BreadthFirst'
22 | param logAnalyticsWorkspaceName string = 'BICEP-AVD-DEMO-3'
23 | param logAnalyticsWorkspaceSku string = 'pergb2018'
24 | param hostpoolFriendlyName string = 'Hostpool with AVD Bicep Applications'
25 | param appgroupDesktopFriendlyName string = 'AppGroup with AVD Bicep Desktop'
26 | param appgroupRemoteAppFriendlyName string = 'AppGroup with AVD Bicep Applications'
27 | param workspaceProdFriendlyName string = 'AVD Bicep Production'
28 | param workspaceAccFriendlyName string = 'AVD Bicep Acceptance'
29 |
30 | //Define Production parameters
31 | param hostpoolNameProd string = 'BICEP-P-AVD-HP'
32 | param appgroupNameProd string = 'BICEP-P-AVD-HP-AG'
33 | param workspaceNameProd string = 'BICEP-P-AVD-HP-WS'
34 | param preferredAppGroupTypeProd string = 'Desktop'
35 |
36 | //Define Acceptance parameters
37 | param hostpoolNameAcc string = 'BICEP-A-AVD-HP'
38 | param appgroupNameAcc string = 'BICEP-A-AVD-HP-AG'
39 | param workspaceNameAcc string = 'BICEP-A-AVD-HP-WS'
40 | param preferredAppGroupTypeAcc string = 'Desktop'
41 |
42 | //Define Networking deployment parameters
43 | param vnetName string = 'BICEP-AVD-VNET'
44 | param vnetaddressPrefix string = '10.80.0.0/16'
45 | param subnet1Prefix string = '10.80.10.0/24'
46 | param subnet1Name string = 'BICEP-AVD-SUBNET-PROD'
47 | param subnet2Prefix string = '10.80.20.0/24'
48 | param subnet2Name string = 'BICEP-AVD-SUBNET-ACC'
49 | param dnsServer string = '10.50.1.4'
50 |
51 | //define optional peering parameters
52 | param createPeering bool = true
53 | param remoteVnetName string = 'WE-P-VNET-01'
54 | param remoteVnetRg string = 'WE-P-RG-NETWORK'
55 |
56 | //Define Template VM & Packaging deployment parameters
57 | param vmProdPrefix string = 'BICEP-AVD-VM-TEMPLATE-'
58 | param adminUserName string = 'localadmin'
59 |
60 | @secure()
61 | param adminPassword string
62 |
63 | param vmHostname1 string = 'AVD-T-1'
64 | var vnName1 = '${vmProdPrefix}${vmHostname1}'
65 | param vmSize1 string = 'Standard_D4s_v3'
66 |
67 | //Define SIG parameters
68 | param sigName string = 'BICEP_AVD_AIB'
69 |
70 | //Define Image Definition Parameteres
71 | param imagePublisher string = 'AVDBicep'
72 | param imageDefinitionName string = 'BICEP-AVD-ID'
73 | param imageOffer string = 'Windows10-AVD'
74 | param imageSKU string = '20h2-evd'
75 |
76 | //Define Template Image parameters
77 | param vmOffer string = 'windows-11'
78 | param vmOSDiskSize int = 127
79 | param vmSku string = 'win11-22h2-avd'
80 | param vmVersion string = 'latest'
81 | param vmPublisher string = 'MicrosoftWindowsDesktop'
82 | param userAssignedIdentity string = 'BICEP-AVD-DEMO-IDENTITY'
83 | var userAssignedIdentityID = '/subscriptions/${azureSubscriptionID}/resourcegroups/BICEP-AVD-DEMO-P-TEMPLATE-IMAGE-RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/${userAssignedIdentity}'
84 | param roleNameNetwork string = 'VvetReader'
85 | param roleNameGalleryImage string = 'GalleryReadWrite'
86 | param vmSizeAIB string = 'Standard_D16s_v3'
87 |
88 | //Define Storage Account parameters AIB
89 | param storageaccountlocation1 string = 'westeurope'
90 | param storageaccountName1 string = 'bicepavdsaaib'
91 | param storageaccountkind1 string = 'StorageV2'
92 | param storgeaccountglobalRedundancy1 string = 'Standard_LRS'
93 | param storageaccountlocation2 string = 'westeurope'
94 | param storageaccountName2 string = 'bicepavdsaprof'
95 | param storageaccountkind2 string = 'FileStorage'
96 | param storgeaccountglobalRedundancy2 string = 'Premium_LRS'
97 | param fileshareFolderName1 string = 'aibsoftware'
98 | param fileshareFolderName2 string = 'aibscripts'
99 | param fileshareFolderName3 string = 'profilecontainers'
100 | //var subnetID = '/subscriptions/${azureSubscriptionID}/resourcegroups/${resourceGroupProdPrefix}NETWORK${resourceGroupPostfix}/providers/Microsoft.Network/virtualNetworks/${vnetName}/subnets/${subnet2Name}'
101 |
102 | //Define Keyvault Parameters
103 | param keyVaultName string = 'kv-${utcNow()}'
104 | param keyVaultLocation string = 'westeurope'
105 | param secretNameDomainJoin string = 'AVD-domain-join'
106 |
107 | @secure()
108 | param secretValueDomainJoin string
109 | param secretNameLocalAdminPassword string = 'AVD-local-admin'
110 |
111 | @secure()
112 | param secretValueLocalAdminPassword string
113 |
114 | param scalehostPoolType string = 'Pooled'
115 | param scalelocation string = 'westeurope'
116 | param scalescalingPlanName string = 'bicep-avd-scale-demo'
117 | param scaleschedules array = [
118 | {
119 | name: 'weekdays_schedule'
120 | daysOfWeek: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
121 | rampUpStartTime: {
122 | hour: 8
123 | minute: 0
124 | }
125 | rampUpLoadBalancingAlgorithm: 'BreadthFirst'
126 | rampUpMinimumHostsPct: 20
127 | rampUpCapacityThresholdPct: 60
128 | peakStartTime: {
129 | hour: 9
130 | minute: 0
131 | }
132 | peakLoadBalancingAlgorithm: 'DepthFirst'
133 | rampDownStartTime: {
134 | hour: 18
135 | minute: 0
136 | }
137 | rampDownLoadBalancingAlgorithm: 'DepthFirst'
138 | rampDownMinimumHostsPct: 10
139 | rampDownCapacityThresholdPct: 90
140 | rampDownWaitTimeMinutes: 30
141 | rampDownStopHostsWhen: 'ZeroSessions'
142 | rampDownNotificationMessage: 'You will be logged off in 30 min. Make sure to save your work.'
143 | offPeakStartTime: {
144 | hour: 20
145 | minute: 0
146 | }
147 | offPeakLoadBalancingAlgorithm: 'DepthFirst'
148 | rampDownForceLogoffUsers: true
149 | }
150 | ]
151 | param scaletimeZone string = 'W. Europe Standard Time'
152 |
153 | param defaultLocation string = 'westeurope'
154 |
155 | //Create Resource Groups
156 | resource rgnw 'Microsoft.Resources/resourceGroups@2022-09-01' = {
157 | name: '${resourceGroupProdPrefix}NETWORK${resourceGroupPostfix}'
158 | location: defaultLocation
159 | }
160 | resource rgtvm 'Microsoft.Resources/resourceGroups@2022-09-01' = {
161 | name: '${resourceGroupProdPrefix}TEMPLATE-VM${resourceGroupPostfix}'
162 | location: defaultLocation
163 | }
164 | resource rgAVDp 'Microsoft.Resources/resourceGroups@2022-09-01' = {
165 | name: '${resourceGroupProdPrefix}BACKPLANE${resourceGroupPostfix}'
166 | location: defaultLocation
167 | }
168 | resource rgAVDa 'Microsoft.Resources/resourceGroups@2022-09-01' = {
169 | name: '${resourceGroupAccPrefix}BACKPLANE${resourceGroupPostfix}'
170 | location: defaultLocation
171 | }
172 | resource rgAVDphost 'Microsoft.Resources/resourceGroups@2022-09-01' = {
173 | name: '${resourceGroupProdPrefix}AVD-HOSTS${resourceGroupPostfix}'
174 | location: defaultLocation
175 | }
176 | resource rgAVDahost 'Microsoft.Resources/resourceGroups@2022-09-01' = {
177 | name: '${resourceGroupAccPrefix}AVD-HOSTS${resourceGroupPostfix}'
178 | location: defaultLocation
179 | }
180 | resource rgmon 'Microsoft.Resources/resourceGroups@2022-09-01' = {
181 | name: '${resourceGroupProdPrefix}MONITORING${resourceGroupPostfix}'
182 | location: defaultLocation
183 | }
184 | resource rgfs 'Microsoft.Resources/resourceGroups@2022-09-01' = {
185 | name: '${resourceGroupProdPrefix}FILESERVICES${resourceGroupPostfix}'
186 | location: defaultLocation
187 | }
188 | resource rgkv 'Microsoft.Resources/resourceGroups@2022-09-01' = {
189 | name: '${resourceGroupProdPrefix}KEYVAULT${resourceGroupPostfix}'
190 | location: defaultLocation
191 | }
192 | resource rgts 'Microsoft.Resources/resourceGroups@2022-09-01' = {
193 | name: '${resourceGroupProdPrefix}TEMPLATESPECS${resourceGroupPostfix}'
194 | location: defaultLocation
195 | }
196 | resource rgti 'Microsoft.Resources/resourceGroups@2022-09-01' = {
197 | name: '${resourceGroupProdPrefix}TEMPLATE-IMAGE${resourceGroupPostfix}'
198 | location: defaultLocation
199 | }
200 | resource rgsp 'Microsoft.Resources/resourceGroups@2022-09-01' = {
201 | name: '${resourceGroupProdPrefix}SCALE-PLANS${resourceGroupPostfix}'
202 | location: defaultLocation
203 | }
204 |
205 | //Create Role Definition for Network Resource Group access
206 | resource vnetdef 'Microsoft.Authorization/roleDefinitions@2022-05-01-preview' = {
207 | name: guid(roleNameNetwork)
208 | properties: {
209 | roleName: roleNameNetwork
210 | description: 'Custom role for network read'
211 | permissions: [
212 | {
213 | actions: [
214 | 'Microsoft.Network/virtualNetworks/read'
215 | 'Microsoft.Network/virtualNetworks/subnets/join/action'
216 | ]
217 | }
218 | ]
219 | assignableScopes: [subscription().id]
220 | }
221 | }
222 |
223 | resource vnetass 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
224 | name: guid(rgnw.id)
225 | properties: {
226 | roleDefinitionId: vnetdef.id
227 | principalId: principalID
228 | }
229 | }
230 |
231 | var AVDbackplanes = [
232 | {
233 | hostpoolName: hostpoolNameProd
234 | hostpoolFriendlyName: hostpoolFriendlyName
235 | appgroupName: appgroupNameProd
236 | appgroupDesktopFriendlyName: appgroupDesktopFriendlyName
237 | appgroupRemoteAppFriendlyName: appgroupRemoteAppFriendlyName
238 | workspaceName: workspaceNameProd
239 | workspaceNameFriendlyName: workspaceProdFriendlyName
240 | preferredAppGroupType: preferredAppGroupTypeProd
241 | AVDbackplanelocation: AVDbackplanelocation
242 | hostPoolType: hostPoolType
243 | enableValiatioMode: false
244 | loadBalancerType: loadBalancerType
245 | createRemoteAppHostpool: true
246 | maxSessionLimit: 10
247 | }
248 | {
249 | hostpoolName: hostpoolNameAcc
250 | hostpoolFriendlyName: hostpoolFriendlyName
251 | appgroupName: appgroupNameAcc
252 | appgroupDesktopFriendlyName: appgroupDesktopFriendlyName
253 | appgroupRemoteAppFriendlyName: appgroupRemoteAppFriendlyName
254 | workspaceName: workspaceNameAcc
255 | workspaceNameFriendlyName: workspaceAccFriendlyName
256 | preferredAppGroupType: preferredAppGroupTypeAcc
257 | AVDbackplanelocation: AVDbackplanelocation
258 | hostPoolType: hostPoolType
259 | enableValiatioMode: true
260 | loadBalancerType: loadBalancerType
261 | createRemoteAppHostpool: true
262 | maxSessionLimit: 10
263 | }
264 | ]
265 |
266 | //Create AVD Prod backplane objects and configure Log Analytics Diagnostics Settings
267 | module AVDbackplanedeploy './6.1 AVD-backplane-module.bicep' = [
268 | for AVDbackplane in AVDbackplanes: {
269 | name: '${AVDbackplane.hostpoolName}-deploy'
270 | scope: rgAVDp
271 | params: {
272 | hostpoolName: AVDbackplane.hostpoolName
273 | hostpoolFriendlyName: AVDbackplane.hostpoolFriendlyName
274 | appgroupName: AVDbackplane.appgroupName
275 | appgroupDesktopFriendlyName: AVDbackplane.appgroupDesktopFriendlyName
276 | appgroupRemoteAppFriendlyName: AVDbackplane.appgroupRemoteAppFriendlyName
277 | workspaceName: AVDbackplane.workspaceName
278 | workspaceNameFriendlyName: AVDbackplane.workspaceNameFriendlyName
279 | preferredAppGroupType: AVDbackplane.preferredAppGroupType
280 | AVDbackplanelocation: AVDbackplane.AVDbackplanelocation
281 | hostPoolType: AVDbackplane.HostPoolType
282 | enableValiatioMode: AVDbackplane.enableValiatioMode
283 | loadBalancerType: AVDbackplane.loadBalancerType
284 | createRemoteAppHostpool: AVDbackplane.createRemoteAppHostpool
285 | maxSessionLimit: AVDbackplane.maxSessionLimit
286 | }
287 | }
288 | ]
289 |
290 | //Create AVD Netwerk Subnet and template image VM
291 | module AVDnetwork './6.2 AVD-network-module.bicep' = {
292 | name: 'AVDnetwork'
293 | scope: rgnw
294 | params: {
295 | templateVMResourceGroup: rgtvm.name
296 | vnetLocation: rgnw.location
297 | vnetName: vnetName
298 | vnetaddressPrefix: vnetaddressPrefix
299 | dnsServer: dnsServer
300 | subnet1Prefix: subnet1Prefix
301 | subnet1Name: subnet1Name
302 | subnet2Prefix: subnet2Prefix
303 | subnet2Name: subnet2Name
304 | vmname: vnName1
305 | vmHostname: vmHostname1
306 | vmSize: vmSize1
307 | adminUserName: adminUserName
308 | adminPassword: adminPassword
309 | vmLocation: rgtvm.location
310 | createPeering: createPeering
311 | remoteVnetName: remoteVnetName
312 | remoteVnetRg: remoteVnetRg
313 | vNetVMResourceGroup: rgnw.name
314 | }
315 | }
316 |
317 | //Create Azure Log Analytics Workspace
318 | module AVDmonitor './6.3 AVD-LogAnalytics.bicep' = {
319 | name: 'LAWorkspace'
320 | scope: rgmon
321 | params: {
322 | logAnalyticsWorkspaceName: logAnalyticsWorkspaceName
323 | logAnalyticslocation: rgmon.location
324 | logAnalyticsWorkspaceSku: logAnalyticsWorkspaceSku
325 | }
326 | }
327 |
328 | //Create Shared Image Gallery & Image Offers
329 | module AVDsig './6.4 AVD-shared-image-gallery.bicep' = {
330 | name: 'AVDsig'
331 | scope: rgti
332 | params: {
333 | sigLocation: rgti.location
334 | sigName: sigName
335 | sigReourceGroup: rgti.name
336 | imageDefinitionName: imageDefinitionName
337 | imageOffer: imageOffer
338 | imagePublisher: imagePublisher
339 | imageSKU: imageSKU
340 | userIdentity: userAssignedIdentityID
341 | vmOffer: vmOffer
342 | vmOSDiskSize: vmOSDiskSize
343 | vmPublisher: vmPublisher
344 | vmSizeAIB: vmSizeAIB
345 | vmSku: vmSku
346 | vmVersion: vmVersion
347 | azureSubscriptionID: azureSubscriptionID
348 | principalID: principalID
349 | roleNameGalleryImage: roleNameGalleryImage
350 | templateImageResourceGroup: rgti.name
351 | }
352 | }
353 |
354 | module AVDsa '6.5 AVD-fileservices-module.bicep' = {
355 | name: 'AVDsa'
356 | scope: rgfs
357 | params: {
358 | storageaccountlocation1: storageaccountlocation1
359 | storageaccountName1: storageaccountName1
360 | storageaccountkind1: storageaccountkind1
361 | storgeaccountglobalRedundancy1: storgeaccountglobalRedundancy1
362 | storageaccountlocation2: storageaccountlocation2
363 | storageaccountName2: storageaccountName2
364 | storageaccountkind2: storageaccountkind2
365 | storgeaccountglobalRedundancy2: storgeaccountglobalRedundancy2
366 | fileshareFolderName1: fileshareFolderName1
367 | fileshareFolderName2: fileshareFolderName2
368 | fileshareFolderName3: fileshareFolderName3
369 | }
370 | }
371 |
372 | //Create Azure KeyVault
373 | module AVDkeyvault './6.6 AVD-KeyVault.bicep' = {
374 | name: 'AVDkeyvault'
375 | scope: rgkv
376 | params: {
377 | keyVaultName: keyVaultName
378 | keyVaultLocation: keyVaultLocation
379 | azureADTenantID: azureADTenantID
380 | adminObjectID: adminObjectID
381 | secretNameDomainJoin: secretNameDomainJoin
382 | secretValueDomainJoin: secretValueDomainJoin
383 | secretNameLocalAdminPassword: secretNameLocalAdminPassword
384 | secretValueLocalAdminPassword: secretValueLocalAdminPassword
385 | }
386 | }
387 |
388 |
389 | module AVDScale '6.7 avd-Scaling.bicep' = {
390 | scope: rgsp
391 | name: 'AVDScale'
392 | params: {
393 | hostPoolType: scalehostPoolType
394 | location: scalelocation
395 | scalingPlanName: scalescalingPlanName
396 | schedules: scaleschedules
397 | timeZone: scaletimeZone
398 | hostpoolReferences: [
399 | {
400 | hostpoolArmPath: AVDbackplanedeploy[0].outputs.hpid
401 | scalingPlanEnabled: true
402 | }
403 | {
404 | hostpoolArmPath: AVDbackplanedeploy[0].outputs.hpraid
405 | scalingPlanEnabled: true
406 | }
407 | {
408 | hostpoolArmPath: AVDbackplanedeploy[1].outputs.hpid
409 | scalingPlanEnabled: true
410 | }
411 | {
412 | hostpoolArmPath: AVDbackplanedeploy[1].outputs.hpraid
413 | scalingPlanEnabled: true
414 | }
415 | ]
416 | }
417 | }
418 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.1 avd-backplane-module.bicep:
--------------------------------------------------------------------------------
1 | //Define AVD deployment parameters
2 | param hostpoolName string
3 | param hostpoolFriendlyName string
4 | param appgroupName string
5 | param appgroupDesktopFriendlyName string
6 | param appgroupRemoteAppFriendlyName string
7 | param workspaceName string
8 | param workspaceNameFriendlyName string
9 | param preferredAppGroupType string = 'Desktop'
10 | param AVDbackplanelocation string = 'eastus'
11 | param hostPoolType string = 'pooled'
12 | param loadBalancerType string = 'BreadthFirst'
13 | param enableValiatioMode bool
14 | param createRemoteAppHostpool bool
15 | param maxSessionLimit int
16 |
17 | //Create AVD Hostpool
18 | resource hp 'Microsoft.DesktopVirtualization/hostpools@2022-10-14-preview' = {
19 | name: hostpoolName
20 | location: AVDbackplanelocation
21 | properties: {
22 | friendlyName: hostpoolFriendlyName
23 | hostPoolType: hostPoolType
24 | loadBalancerType: loadBalancerType
25 | preferredAppGroupType: preferredAppGroupType
26 | validationEnvironment: enableValiatioMode
27 | maxSessionLimit: maxSessionLimit
28 | }
29 | }
30 |
31 | //Create AVD Desktop AppGroup
32 | resource agd 'Microsoft.DesktopVirtualization/applicationGroups@2022-10-14-preview' = {
33 | name: appgroupName
34 | location: AVDbackplanelocation
35 | properties: {
36 | friendlyName: appgroupDesktopFriendlyName
37 | applicationGroupType: 'Desktop'
38 | hostPoolArmPath: hp.id
39 | }
40 | }
41 |
42 | //Create AVD RemoteApp Hostpool
43 | resource hpra 'Microsoft.DesktopVirtualization/hostpools@2022-10-14-preview' = if (createRemoteAppHostpool){
44 | name: '${hostpoolName}-REMOTEAPP'
45 | location: AVDbackplanelocation
46 | properties: {
47 | friendlyName: hostpoolFriendlyName
48 | hostPoolType: hostPoolType
49 | loadBalancerType: loadBalancerType
50 | preferredAppGroupType: 'RailApplications'
51 | validationEnvironment: enableValiatioMode
52 | maxSessionLimit: maxSessionLimit
53 | }
54 | }
55 |
56 |
57 | //Create AVD RemoteApp AppGroup
58 | resource agra 'Microsoft.DesktopVirtualization/applicationgroups@2022-10-14-preview' = if (createRemoteAppHostpool){
59 | name: '${appgroupName}-REMOTEAPP'
60 | location: AVDbackplanelocation
61 | properties: {
62 | friendlyName: appgroupRemoteAppFriendlyName
63 | applicationGroupType: 'RemoteApp'
64 | hostPoolArmPath: hpra.id
65 | }
66 | }
67 |
68 | //Create AVD Workspace in case createRemoteAppHostpool = false
69 | resource ws 'Microsoft.DesktopVirtualization/workspaces@2022-10-14-preview' = {
70 | name: workspaceName
71 | location: AVDbackplanelocation
72 | properties: {
73 | friendlyName: workspaceNameFriendlyName
74 | applicationGroupReferences: [
75 | agd.id
76 | createRemoteAppHostpool ? agra.id : ''
77 | ]
78 | }
79 | }
80 |
81 | output hpid string = hp.id
82 | output hpraid string = hpra.id
83 |
84 |
85 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.2 avd-network-module.bicep:
--------------------------------------------------------------------------------
1 | // Define Networking parameters
2 | param vnetLocation string
3 | param vnetName string
4 | param vnetaddressPrefix string
5 | param subnet1Prefix string
6 | param subnet1Name string
7 | param subnet2Prefix string
8 | param subnet2Name string
9 | param dnsServer string
10 |
11 | //Define AVD Template Image deployment parameters
12 | param vmname string
13 | param vmHostname string
14 | param vmSize string
15 | param vmLocation string
16 | param templateVMResourceGroup string
17 | param adminUserName string
18 | @secure()
19 | param adminPassword string
20 |
21 | //define peering parameters
22 | param createPeering bool
23 | param remoteVnetRg string
24 | param remoteVnetName string
25 |
26 | //define user identity
27 | param vNetVMResourceGroup string
28 |
29 | //Create Vnet and Subnet
30 | resource vnet 'Microsoft.Network/virtualnetworks@2023-04-01' = {
31 | name: vnetName
32 | location: vnetLocation
33 | properties: {
34 | addressSpace: {
35 | addressPrefixes: [
36 | vnetaddressPrefix
37 | ]
38 | }
39 | dhcpOptions: {
40 | dnsServers: [
41 | dnsServer
42 | ]
43 | }
44 | subnets: [
45 | {
46 | name: subnet1Name
47 | properties: {
48 | addressPrefix: subnet1Prefix
49 | }
50 | }
51 | {
52 | name: subnet2Name
53 | properties: {
54 | addressPrefix: subnet2Prefix
55 | privateLinkServiceNetworkPolicies: 'Disabled'
56 | }
57 | }
58 | ]
59 | }
60 | }
61 |
62 |
63 |
64 | //Optionally create vnet peering to an ADDS vnet
65 | resource peertoadds 'microsoft.network/virtualNetworks/virtualNetworkPeerings@2023-04-01' = if (createPeering) {
66 | parent: vnet
67 | name: 'peering-to-adds-vnet'
68 | properties: {
69 | allowVirtualNetworkAccess: true
70 | allowForwardedTraffic: false
71 | allowGatewayTransit: false
72 | useRemoteGateways: false
73 | remoteVirtualNetwork: {
74 | id: resourceId(remoteVnetRg, 'Microsoft.Network/virtualNetworks', remoteVnetName)
75 | }
76 | }
77 | }
78 |
79 | //Optionally create vnet peering from an ADDS vnet
80 | module peerfromadds './6.2.2 AVD-peering-from-adds.bicep' = if (createPeering){
81 | name: 'peering'
82 | scope: resourceGroup(remoteVnetRg)
83 | params: {
84 | remoteVnetName: remoteVnetName
85 | vnetName: vnet.name
86 | vnetNameResourceGroup: vNetVMResourceGroup
87 | }
88 | }
89 |
90 | //Create AVD Template VM
91 | module tvm './6.2.1 AVD-template-vm.bicep' = {
92 | name: 'tvmbim'
93 | scope: resourceGroup(templateVMResourceGroup)
94 | params: {
95 | vmname: vmname
96 | vmHostname: vmHostname
97 | adminUserName: adminUserName
98 | adminPassword: adminPassword
99 | vmLocation: vmLocation
100 | vmSize: vmSize
101 | subnetName: subnet2Name
102 | vnetid: vnet.id
103 | }
104 | }
105 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.2.1 avd-template-vm.bicep:
--------------------------------------------------------------------------------
1 | //Define AVD Template Image deployment parameters
2 | param vmname string
3 | param vmHostname string
4 | param vmLocation string = 'westeurope'
5 | param vmSize string
6 | param adminUserName string
7 | @secure()
8 | param adminPassword string
9 | param vnetid string
10 | param subnetName string
11 | var nicName = '${vmname}-nic'
12 | var subnetRef = '${vnetid}/subnets/${subnetName}'
13 |
14 | resource nic 'Microsoft.Network/networkInterfaces@2023-04-01' = {
15 | name: nicName
16 | location: vmLocation
17 |
18 | properties: {
19 | ipConfigurations: [
20 | {
21 | name: 'ipconfig1'
22 | properties: {
23 | privateIPAllocationMethod: 'Dynamic'
24 | subnet: {
25 | id: subnetRef
26 | }
27 | }
28 | }
29 | ]
30 | }
31 | }
32 |
33 | //Create AVD Template Image VM
34 | resource vm 'Microsoft.Compute/virtualMachines@2023-03-01' = {
35 | name: vmname
36 | location: vmLocation
37 | properties: {
38 | hardwareProfile: {
39 | vmSize: vmSize
40 | }
41 | osProfile: {
42 | computerName: vmHostname
43 | adminUsername: adminUserName
44 | adminPassword: adminPassword
45 | }
46 | storageProfile: {
47 | imageReference: {
48 | publisher: 'microsoftwindowsdesktop'
49 | offer: 'windows-11'
50 | sku: 'win11-22h2-avd'
51 | version: 'latest'
52 | }
53 | osDisk: {
54 | createOption: 'FromImage'
55 | name: '${vmname}-osdisk'
56 | }
57 | }
58 | networkProfile: {
59 | networkInterfaces: [
60 | {
61 | id: nic.id
62 | }
63 | ]
64 | }
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.2.2 avd-peering-from-adds.bicep:
--------------------------------------------------------------------------------
1 | param vnetName string
2 | param remoteVnetName string
3 | param vnetNameResourceGroup string
4 |
5 | //Create peering from adds to Bicep vnet
6 | resource peertfromadds 'microsoft.network/virtualNetworks/virtualNetworkPeerings@2023-04-01' = {
7 | name: '${remoteVnetName}/peering-from-adds-vnet'
8 | properties: {
9 | allowVirtualNetworkAccess: true
10 | allowForwardedTraffic: false
11 | allowGatewayTransit: false
12 | useRemoteGateways: false
13 | remoteVirtualNetwork: {
14 | id: resourceId(vnetNameResourceGroup, 'Microsoft.Network/virtualNetworks', vnetName)
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.3 avd-LogAnalytics.bicep:
--------------------------------------------------------------------------------
1 | //Define Log Analytics parameters
2 | param logAnalyticsWorkspaceName string
3 | param logAnalyticslocation string = 'westeurope'
4 | param logAnalyticsWorkspaceSku string
5 |
6 | //Create Log Analytics Workspace
7 | resource AVDla 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
8 | name: logAnalyticsWorkspaceName
9 | location: logAnalyticslocation
10 | properties: {
11 | sku: {
12 | name: logAnalyticsWorkspaceSku
13 | }
14 | }
15 | }
16 |
17 | output logAnalyticsWorkspaceID string = AVDla.id
18 |
19 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.3 avd-monitor-diag.bicep:
--------------------------------------------------------------------------------
1 | targetScope = 'subscription'
2 |
3 | //Define diagnostic setting parameters
4 | param resourceGroupProdPrefix string
5 | param resourceGroupAccPrefix string
6 | param resourceGroupPostfix string = '-001'
7 | param logAnalyticsWorkspaceID string
8 | param logAnalyticslocation string = 'westeurope'
9 | param AVDBackplaneProdResourceGroup string = '${resourceGroupProdPrefix}BACKPLANE${resourceGroupPostfix}'
10 | param AVDBackplaneAccResourceGroup string = '${resourceGroupAccPrefix}BACKPLANE${resourceGroupPostfix}'
11 | param hostpoolName1 string
12 | param workspaceName1 string
13 | param hostpoolName2 string
14 | param workspaceName2 string
15 |
16 | module AVDhostpooldiag1 './6.3.1 AVD-monitor-diag-hostpool.bicep' = {
17 | name: 'AVDhostpooldiag1'
18 | scope: resourceGroup(AVDBackplaneProdResourceGroup)
19 | params: {
20 | hostpoolName : hostpoolName1
21 | logAnalyticsWorkspaceID : logAnalyticsWorkspaceID
22 | }
23 | }
24 |
25 | module AVDWorkspacediag1 './6.3.2 AVD-monitor-diag-workspace.bicep' = {
26 | name: 'AVDWorkspacediag1'
27 | scope: resourceGroup(AVDBackplaneProdResourceGroup)
28 | params: {
29 | workspaceName : workspaceName1
30 | logAnalyticslocation : logAnalyticslocation
31 | logAnalyticsWorkspaceID : logAnalyticsWorkspaceID
32 | }
33 | }
34 |
35 | module AVDhostpooldiag2 './6.3.1 AVD-monitor-diag-hostpool.bicep' = {
36 | name: 'AVDhostpooldiag2'
37 | scope: resourceGroup(AVDBackplaneAccResourceGroup)
38 | params: {
39 | hostpoolName : hostpoolName2
40 | logAnalyticsWorkspaceID : logAnalyticsWorkspaceID
41 | }
42 | }
43 |
44 | module AVDWorkspacediag2 './6.3.2 AVD-monitor-diag-workspace.bicep' = {
45 | name: 'AVDWorkspacediag2'
46 | scope: resourceGroup(AVDBackplaneAccResourceGroup)
47 | params: {
48 | workspaceName : workspaceName2
49 | logAnalyticslocation : logAnalyticslocation
50 | logAnalyticsWorkspaceID : logAnalyticsWorkspaceID
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.3.1 avd-monitor-diag-hostpool.bicep:
--------------------------------------------------------------------------------
1 | //Define diagnostic setting parameters
2 | param hostpoolName string
3 | param logAnalyticsWorkspaceID string
4 |
5 | resource hostPool 'Microsoft.DesktopVirtualization/hostPools@2020-11-02-preview' existing = {
6 | name: hostpoolName
7 | }
8 |
9 | //Create diagnostic settings for AVD Objects
10 | resource AVDwsds 'Microsoft.Insights/diagnosticSettings@2017-05-01-preview' = {
11 | name: '${hostPool}-diag'
12 | scope: hostPool
13 | properties: {
14 | workspaceId: logAnalyticsWorkspaceID
15 | logs: [
16 | {
17 | category: 'Checkpoint'
18 | enabled: true
19 | }
20 | {
21 | category: 'Error'
22 | enabled: true
23 | }
24 | {
25 | category: 'Management'
26 | enabled: true
27 | }
28 | {
29 | category: 'Connection'
30 | enabled: true
31 | }
32 | {
33 | category: 'HostRegistration'
34 | enabled: true
35 | }
36 | ]
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.3.2 avd-monitor-diag-workspace.bicep:
--------------------------------------------------------------------------------
1 | //Define diagnostic setting parameters
2 | param workspaceName string
3 | param logAnalyticslocation string = 'westeurope'
4 | param logAnalyticsWorkspaceID string
5 |
6 | //Concat diagnostic setting names
7 | var workspaceDiagName = '${workspaceName}/Microsoft.Insights/hostpool-diag'
8 |
9 | //Create diagnostic settings for AVD Objects
10 | resource AVDwsds 'Microsoft.DesktopVirtualization/workspaces/providers/diagnosticSettings@2017-05-01-preview' = {
11 | name: workspaceDiagName
12 | location: logAnalyticslocation
13 | properties: {
14 | workspaceId: logAnalyticsWorkspaceID
15 | logs: [
16 | {
17 | category: 'Checkpoint'
18 | enabled: true
19 | }
20 | {
21 | category: 'Error'
22 | enabled: true
23 | }
24 | {
25 | category: 'Management'
26 | enabled: true
27 | }
28 | {
29 | category: 'Feed'
30 | enabled: true
31 | }
32 | ]
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.4 avd-shared-image-gallery.bicep:
--------------------------------------------------------------------------------
1 | param azureSubscriptionID string
2 |
3 | //Define SIG parameters
4 | param sigName string
5 | param sigLocation string
6 | param sigReourceGroup string
7 |
8 | //Define Image Definition parameters
9 | param imagePublisher string
10 | param imageDefinitionName string
11 | param imageOffer string
12 | param imageSKU string
13 |
14 | //Define Template Image parameters
15 | param userIdentity string
16 | param vmOffer string
17 | param vmOSDiskSize int
18 | param vmSku string
19 | param vmVersion string
20 | param vmPublisher string
21 | param vmSizeAIB string
22 |
23 | //define user identity
24 | param roleNameGalleryImage string
25 | param principalID string
26 | param templateImageResourceGroup string
27 |
28 | //Define Azure Subscriptin ID params
29 | var assignableScopes = '/subscriptions/${azureSubscriptionID}/resourcegroups/${templateImageResourceGroup}'
30 |
31 | //Create Image Gallery
32 | resource AVDsig 'Microsoft.Compute/galleries@2022-03-03' = {
33 | name: sigName
34 | location: sigLocation
35 | }
36 |
37 | //create role definition
38 | resource gallerydef 'Microsoft.Authorization/roleDefinitions@2022-05-01-preview' = {
39 | name: guid(roleNameGalleryImage)
40 | properties: {
41 | roleName: roleNameGalleryImage
42 | description: 'Custom role for network read'
43 | permissions: [
44 | {
45 | actions: [
46 | 'Microsoft.Compute/galleries/read'
47 | 'Microsoft.Compute/galleries/images/read'
48 | 'Microsoft.Compute/galleries/images/versions/read'
49 | 'Microsoft.Compute/galleries/images/versions/write'
50 | 'Microsoft.Compute/images/write'
51 | 'Microsoft.Compute/images/read'
52 | 'Microsoft.Compute/images/delete'
53 | ]
54 | }
55 | ]
56 | assignableScopes: [
57 | assignableScopes
58 | ]
59 | }
60 | dependsOn:[
61 | AVDsig
62 | ]
63 | }
64 |
65 | //create role assignment
66 | resource galleryass 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
67 | name: guid(resourceGroup().id)
68 | properties: {
69 | roleDefinitionId: gallerydef.id
70 | principalId: principalID
71 | }
72 | dependsOn:[
73 | AVDsig
74 | ]
75 | }
76 |
77 | //Create Image Definition
78 | module AVDid './6.4.1 AVD-Image-definitions.bicep' = {
79 | name: 'AVDid'
80 | scope: resourceGroup(sigReourceGroup)
81 | params: {
82 | imageGalleryName: sigName
83 | imageLocation: sigLocation
84 | imageDefinitionName: imageDefinitionName
85 | imageOffer: imageOffer
86 | imagePublisher: imagePublisher
87 | imageSKU: imageSKU
88 | templateImageResourceGroup: sigReourceGroup
89 | imageTemplateName: imageDefinitionName
90 | userIdentity: userIdentity
91 | vmOffer: vmOffer
92 | vmOSDiskSize: vmOSDiskSize
93 | vmPublisher: vmPublisher
94 | vmSize: vmSizeAIB
95 | vmSku: vmSku
96 | vmVersion: vmVersion
97 | azureSubscriptionID: azureSubscriptionID
98 | }
99 | dependsOn:[
100 | AVDsig
101 | ]
102 | }
103 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.4.1 avd-Image-definitions.bicep:
--------------------------------------------------------------------------------
1 | //Define Image Definition parameters
2 | param azureSubscriptionID string
3 | param imageGalleryName string
4 | param imageDefinitionName string
5 | param imageLocation string
6 | param imagePublisher string
7 | param imageOffer string
8 | param imageSKU string
9 | param templateImageResourceGroup string
10 | param imageTemplateName string
11 | param userIdentity string
12 | param vmOffer string
13 | param vmSize string
14 | param vmOSDiskSize int
15 | param vmPublisher string
16 | param vmSku string
17 | param vmVersion string
18 |
19 | var imageDefinitionFullName = '${imageGalleryName}/${imageDefinitionName}'
20 |
21 | //Create Image definitation
22 | resource AVDid 'Microsoft.Compute/galleries/images@2022-03-03' = {
23 | name: imageDefinitionFullName
24 | location: imageLocation
25 | properties: {
26 | osState: 'Generalized'
27 | osType: 'Windows'
28 | hyperVGeneration: 'V2'
29 | identifier: {
30 | publisher: imagePublisher
31 | offer: imageOffer
32 | sku: imageSKU
33 | }
34 | }
35 | }
36 |
37 | module AVDti './6.4.1.1 AVD-image-template.bicep' = {
38 | name: imageTemplateName
39 | scope: resourceGroup(templateImageResourceGroup)
40 | params: {
41 | azureSubscriptinID: azureSubscriptionID
42 | imageGalleryName: imageGalleryName
43 | imageGalleryRecourceGroupName: templateImageResourceGroup
44 | imageTemplateLocation: imageLocation
45 | imageTemplateName: imageTemplateName
46 | userIdentity: userIdentity
47 | vmOffer: vmOffer
48 | vmOSDiskSize: vmOSDiskSize
49 | vmPublisher: vmPublisher
50 | vmSize: vmSize
51 | vmSku: vmSku
52 | vmVersion: vmVersion
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.4.1.1 avd-Image-Template.bicep:
--------------------------------------------------------------------------------
1 | //Define Log Analytics parameters
2 | param azureSubscriptinID string
3 | param imageGalleryName string
4 | param imageGalleryRecourceGroupName string
5 | param imageTemplateName string
6 | param imageTemplateLocation string
7 | param vmSize string
8 | param vmOSDiskSize int
9 | param vmPublisher string
10 | param vmOffer string
11 | param vmSku string
12 | param vmVersion string
13 | param userIdentity string
14 |
15 | var galleryImageId = '/subscriptions/${azureSubscriptinID}/resourceGroups/${imageGalleryRecourceGroupName}/providers/Microsoft.Compute/galleries/${imageGalleryName}/images/${imageTemplateName}'
16 |
17 | //Create template image
18 | resource AVDit 'Microsoft.VirtualMachineImages/imageTemplates@2022-07-01' = {
19 | name: imageTemplateName
20 | identity: {
21 | type: 'UserAssigned'
22 | userAssignedIdentities :{
23 | '${userIdentity}': {}
24 | }
25 | }
26 | location: imageTemplateLocation
27 | properties: {
28 | buildTimeoutInMinutes: 100
29 | vmProfile: {
30 | vmSize: vmSize
31 | osDiskSizeGB: vmOSDiskSize
32 | }
33 | source : {
34 | type: 'PlatformImage'
35 | publisher: vmPublisher
36 | offer: vmOffer
37 | sku: vmSku
38 | version: vmVersion
39 | }
40 | customize: [
41 | {
42 | type: 'PowerShell'
43 | name: 'GetAzCopy'
44 | inline:[
45 | 'New-Item -type Directory -Path C:\\ -Name temp'
46 | 'Invoke-WebRequest -Uri https://aka.ms/downloadazcopy-v10-windows -OutFile c:\\temp\\azcopy.zip'
47 | 'Expand-Archive C:\\temp\\azcopy.zip c:\\temp'
48 | 'Copy-Item C:\\temp\\azcopy_windows_amd64_*\\azcopy.exe\\ -Destination C:\\temp'
49 | ]
50 | }
51 | {
52 | type: 'PowerShell'
53 | name: 'GetCustomizeScriptAndApps'
54 | inline:[
55 | 'C:\\temp\\azcopy.exe copy "https://ninjawvdprofiles.blob.core.windows.net/liquit/avd-liquit-aib-demo.msi?sp=r&st=2021-09-13T12:15:54Z&se=2022-10-06T20:15:54Z&spr=https&sv=2020-08-04&sr=b&sig=1esX6FXbDM9reIHS8%2BEaywhVFLl342qMrhooi%2BKAOlY%3D" C:\\temp\\avd-liquit-aib-demo.msi'
56 | 'C:\\temp\\azcopy.exe copy "https://ninjawvdprofiles.blob.core.windows.net/liquit/avd-ninja-aib-deploy.ps1?sp=r&st=2021-09-13T12:16:13Z&se=2022-11-17T21:16:13Z&spr=https&sv=2020-08-04&sr=b&sig=DlNnL54AlrApHJvZxVaKLvbH3odr9S8oH8TfVd8wjEc%3D" C:\\temp\\avd-ninja-aib-deploy.ps1'
57 | 'C:\\temp\\azcopy.exe copy "https://ninjawvdprofiles.blob.core.windows.net/liquit/run-ShellAPI.ps1?sp=r&st=2021-09-19T08:24:10Z&se=2023-01-19T17:24:10Z&spr=https&sv=2020-08-04&sr=b&sig=d%2Fz1wjFHGKBEvZHCMg4NQssJ4wp8qsuwL2hvQwiX%2FyM%3D" C:\\temp\\run-ShellAPI.ps1'
58 |
59 |
60 |
61 | 'Set-ExecutionPolicy Bypass -Force'
62 | 'C:\\temp\\avd-ninja-aib-deploy.ps1'
63 | ]
64 | runElevated : true
65 | }
66 | ]
67 | distribute: [
68 | {
69 | type: 'SharedImage'
70 | galleryImageId: galleryImageId
71 | runOutputName: imageTemplateName
72 | replicationRegions: [
73 | 'North Europe'
74 | ]
75 | }
76 | ]
77 | }
78 | }
79 |
80 |
81 |
82 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.5 avd-fileservices-module.bicep:
--------------------------------------------------------------------------------
1 | //Define Azure Files parmeters
2 | param storageaccountlocation1 string
3 | param storageaccountName1 string
4 | param storageaccountkind1 string
5 | param storgeaccountglobalRedundancy1 string
6 | param storageaccountlocation2 string
7 | param storageaccountName2 string
8 | param storageaccountkind2 string
9 | param storgeaccountglobalRedundancy2 string
10 | param fileshareFolderName1 string
11 | param fileshareFolderName2 string
12 | param fileshareFolderName3 string
13 |
14 | //Concat FileShare
15 | var filesharelocation1 = '${saaib.name}/default/${fileshareFolderName1}'
16 | var filesharelocation2 = '${saaib.name}/default/${fileshareFolderName2}'
17 | var filesharelocation3 = '${saprof.name}/default/${fileshareFolderName3}'
18 |
19 |
20 | //Create Storage account 1
21 | resource saaib 'Microsoft.Storage/storageAccounts@2023-01-01' = {
22 | name: storageaccountName1
23 | location: storageaccountlocation1
24 | kind: storageaccountkind1
25 | sku: {
26 | name: storgeaccountglobalRedundancy1
27 | }
28 | }
29 | //Create blob services
30 | resource fssofwtare 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-01-01' = {
31 | name: filesharelocation1
32 | }
33 | resource fsscripts 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-01-01' = {
34 | name: filesharelocation2
35 | }
36 |
37 | //Create Storage account 2
38 | resource saprof 'Microsoft.Storage/storageAccounts@2023-01-01' = {
39 | name: storageaccountName2
40 | location: storageaccountlocation2
41 | kind: storageaccountkind2
42 | sku: {
43 | name: storgeaccountglobalRedundancy2
44 | }
45 | }
46 | //Create file services
47 | resource fsprofiles 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-01-01' ={
48 | name: filesharelocation3
49 | properties: {
50 | shareQuota: 1000
51 | }
52 | }
53 |
54 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.6 avd-KeyVault.bicep:
--------------------------------------------------------------------------------
1 | //Define Log Analytics parameters
2 | param keyVaultName string
3 | param keyVaultLocation string
4 | param azureADTenantID string
5 | param adminObjectID string
6 | param sku string = 'Standard'
7 | param enabledForDeployment bool = true
8 | param enabledForTemplateDeployment bool = true
9 | param enabledForDiskEncryption bool = true
10 | param enableRbacAuthorization bool = false
11 | param softDeleteRetentionInDays int = 90
12 | param secretNameDomainJoin string
13 | @secure()
14 | param secretValueDomainJoin string
15 | param secretNameLocalAdminPassword string
16 | @secure()
17 | param secretValueLocalAdminPassword string
18 | param accessPolicies array = [
19 | {
20 | tenantId: azureADTenantID
21 | objectId: adminObjectID
22 | permissions: {
23 | keys: [
24 | 'Get'
25 | 'List'
26 | 'Update'
27 | 'Create'
28 | 'Import'
29 | 'Delete'
30 | 'Recover'
31 | 'Backup'
32 | 'Restore'
33 | ]
34 | secrets: [
35 | 'Get'
36 | 'List'
37 | 'Set'
38 | 'Delete'
39 | 'Recover'
40 | 'Backup'
41 | 'Restore'
42 | ]
43 | certificates: [
44 | 'Get'
45 | 'List'
46 | 'Update'
47 | 'Create'
48 | 'Import'
49 | 'Delete'
50 | 'Recover'
51 | 'Backup'
52 | 'Restore'
53 | 'ManageContacts'
54 | 'ManageIssuers'
55 | 'GetIssuers'
56 | 'ListIssuers'
57 | 'SetIssuers'
58 | 'DeleteIssuers'
59 | ]
60 | }
61 | }
62 | ]
63 | param networkAcls object = {
64 | ipRules: []
65 | virtualNetworkRules: []
66 | }
67 |
68 | //Create Keyvault
69 | resource keyvault 'Microsoft.KeyVault/vaults@2023-02-01' = {
70 | name: keyVaultName
71 | location: keyVaultLocation
72 | properties: {
73 | tenantId: azureADTenantID
74 | sku: {
75 | family: 'A'
76 | name: sku
77 | }
78 | accessPolicies: accessPolicies
79 | enabledForDeployment: enabledForDeployment
80 | enabledForDiskEncryption: enabledForDiskEncryption
81 | enabledForTemplateDeployment: enabledForTemplateDeployment
82 | softDeleteRetentionInDays: softDeleteRetentionInDays
83 | enableRbacAuthorization: enableRbacAuthorization
84 | networkAcls: networkAcls
85 | }
86 | }
87 |
88 | // create secrets
89 | resource secretdj 'Microsoft.KeyVault/vaults/secrets@2023-02-01' = {
90 | parent: keyvault
91 | name: secretNameDomainJoin
92 | properties: {
93 | value: secretValueDomainJoin
94 | }
95 | }
96 | resource secretla 'Microsoft.KeyVault/vaults/secrets@2023-02-01' = {
97 | parent: keyvault
98 | name: secretNameLocalAdminPassword
99 | properties: {
100 | value: secretValueLocalAdminPassword
101 | }
102 | }
103 |
104 |
105 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/6.7 avd-Scaling.bicep:
--------------------------------------------------------------------------------
1 | param scalingPlanName string
2 | param scalingPlanDescription string = ''
3 | param location string
4 | param friendlyName string = ''
5 | @allowed(['Pooled', 'Personal'])
6 | param hostPoolType string
7 | param timeZone string
8 | param schedules array
9 | param hostpoolReferences array = []
10 | param exclusionTag string = ''
11 | param tags object = {}
12 |
13 | resource sp 'Microsoft.DesktopVirtualization/scalingPlans@2022-10-14-preview' = {
14 | name: scalingPlanName
15 | location: location
16 | tags: tags
17 | properties: {
18 | friendlyName: friendlyName
19 | description: scalingPlanDescription
20 | hostPoolType: hostPoolType
21 | timeZone: timeZone
22 | exclusionTag: exclusionTag
23 | schedules: null
24 | hostPoolReferences: hostpoolReferences
25 | }
26 | }
27 |
28 | resource sps1 'Microsoft.DesktopVirtualization/scalingPlans/pooledSchedules@2022-10-14-preview' = [
29 | for item in schedules: if ((hostPoolType == 'Pooled')) {
30 | parent: sp
31 | name: '${item.name}'
32 | properties: item
33 | }
34 | ]
35 |
36 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/7. avd-module.bicep:
--------------------------------------------------------------------------------
1 | param prefix string
2 | param location string
3 | param expirationtime string = utcNow('u')
4 | param preferredAppGroupType string
5 | param applicationGroupType string
6 |
7 | resource hp 'Microsoft.DesktopVirtualization/hostPools@2022-10-14-preview' = {
8 | name: '${prefix}-hostpool'
9 | location: location
10 | properties: {
11 | hostPoolType: 'Pooled'
12 | preferredAppGroupType: preferredAppGroupType
13 | loadBalancerType: 'BreadthFirst'
14 | registrationInfo: {
15 | registrationTokenOperation: 'Update'
16 | expirationTime: dateTimeAdd(expirationtime, 'PT2H')
17 | }
18 | }
19 | }
20 |
21 | resource ag 'Microsoft.DesktopVirtualization/applicationGroups@2022-10-14-preview' = {
22 | name: '${prefix}-applicationgroup'
23 | location: location
24 | properties: {
25 | hostPoolArmPath: hp.id
26 | applicationGroupType: applicationGroupType
27 | }
28 | }
29 |
30 | resource ws 'Microsoft.DesktopVirtualization/workspaces@2022-10-14-preview' = {
31 | name: '${prefix}-workspace'
32 | location: location
33 | properties: {
34 | applicationGroupReferences: [
35 | ag.id
36 | ]
37 | }
38 | }
39 |
40 | output hostPoolRegistrationtoken string = hp.properties.registrationInfo.token
41 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/7. createACR.bicep:
--------------------------------------------------------------------------------
1 | @minLength(5)
2 | @maxLength(50)
3 | @description('Provide a globally unique name of your Azure Container Registry')
4 | param acrName string = 'acrdemofreek'
5 |
6 | @description('Provide a location for the registry.')
7 | param location string = 'west europe'
8 |
9 | @description('Provide a tier of your Azure Container Registry.')
10 | param acrSku string = 'Basic'
11 |
12 | @description('Creates the Azure Container Registry')
13 | resource acrResource 'Microsoft.ContainerRegistry/registries@2023-08-01-preview' = {
14 | name: acrName
15 | location: location
16 | sku: {
17 | name: acrSku
18 | }
19 | properties: {
20 | adminUserEnabled: false
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/7. main.bicep:
--------------------------------------------------------------------------------
1 | targetScope = 'subscription'
2 | param location string = 'westeurope'
3 | param deployResourceGroup bool = true
4 |
5 | param avdControlPlanes array = [
6 | {
7 | postfix: 'FD'
8 | preferredAppGroupType: 'Desktop'
9 | applicationGroupType: 'Desktop'
10 | }
11 | {
12 | postfix: 'RA'
13 | preferredAppGroupType: 'RailApplications'
14 | applicationGroupType: 'RemoteApp'
15 | }
16 | ]
17 |
18 | @description('The ResourceGroup where AVD control plane will be deployed')
19 | resource rg 'Microsoft.Resources/resourceGroups@2022-09-01' = if (deployResourceGroup) {
20 | name: 'BICEP-LOOP-DEMO'
21 | location: location
22 | }
23 |
24 | @description('Private Registry Module that deploys an Azure Virtual Desktop Control plane')
25 | module controlplaneDeploy 'br:acrdemofreek.azurecr.io/bicep/modules/storage:v1' = [for avdControlPlane in avdControlPlanes: {
26 | name: '${avdControlPlane.applicationGroupType}-deploy'
27 | scope: rg
28 | params: {
29 | location: rg.location
30 | namePrefix: 'Test'
31 | }
32 | }]
33 |
34 | @description('Private Registry Module that deploys an Azure Virtual Desktop Control plane')
35 | module controlplaneDeployv2 'br/CoreModules:storage:v1' = [for avdControlPlane in avdControlPlanes: {
36 | name: '${avdControlPlane.applicationGroupType}-deploy'
37 | scope: rg
38 | params: {
39 | location: rg.location
40 | namePrefix: 'Test'
41 | }
42 | }]
43 |
44 | //@description('Contains the generated host pool registration token')
45 | //output hp1out string = controlplaneDeploy[1].outputs.hostPoolRegistrationtoken
46 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/7.main-mcr.bicep:
--------------------------------------------------------------------------------
1 | //https://azure.github.io/bicep-registry-modules/
2 |
3 | module helloWorld 'br/public:samples/hello-world:1.0.1' = {
4 | name: 'helloWorld'
5 | params: {
6 | name: 'Freek'
7 | }
8 | }
9 |
10 | output greeting string = helloWorld.outputs.greeting
11 |
12 | module avset 'br/public:compute/availability-set:1.0.1' = {
13 | name: 'freek-acr-demo-avset'
14 | params: {
15 | name: 'avset-01'
16 | availabilitySetSku: 'aligned'
17 | availabilitySetUpdateDomain: 2
18 | availabilitySetFaultDomain: 2
19 | tags: {
20 | tag1: 'MCR demo'
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/8. deploymentStackCreate.bicep:
--------------------------------------------------------------------------------
1 | resource ds 'Microsoft.Resources/deploymentStacks@2022-08-01-preview' = {
2 | name: 'myAVDStackDemo'
3 | properties: {
4 | denySettings: {
5 | mode: 'denyDelete'
6 | }
7 | actionOnUnmanage: {
8 | resources: 'detach'
9 | managementGroups: 'detach'
10 | resourceGroups: 'detach'
11 | }
12 | deploymentScope: 'BICEP-AVD-DEMO-STACK'
13 | templateLink: null
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/8. main.bicep:
--------------------------------------------------------------------------------
1 | //Define AVD deployment parameters
2 | param AVDbackplanelocation string = 'westeurope'
3 | param hostPoolType string = 'pooled'
4 | param loadBalancerType string = 'DepthFirst' // 'DepthFirst'
5 | param hostpoolName string = 'BICEP-P-AVD-HP'
6 | param appgroupName string = 'BICEP-P-AVD-HP-AG'
7 | param workspaceName string = 'BICEP-P-AVD-HP-WS'
8 | param preferredAppGroupType string = 'Desktop'
9 | param AVDHostPoolfriendlyname string = 'updated friendlyname' // updated
10 | param enableValiatioMode bool = true // 'true'
11 | param createRemoteAppHostpool bool = true
12 |
13 | //Create AVD RemoteApp Hostpool
14 | resource hpra 'Microsoft.DesktopVirtualization/hostpools@2022-10-14-preview' = if (createRemoteAppHostpool){
15 | name: '${hostpoolName}-REMOTEAPP'
16 | location: AVDbackplanelocation
17 | properties: {
18 | hostPoolType: hostPoolType
19 | loadBalancerType: loadBalancerType
20 | preferredAppGroupType: preferredAppGroupType
21 | validationEnvironment: enableValiatioMode
22 | friendlyName: AVDHostPoolfriendlyname
23 | }
24 | }
25 |
26 |
27 | //Create AVD RemoteApp AppGroup
28 | resource agra 'Microsoft.DesktopVirtualization/applicationgroups@2022-10-14-preview' = if (createRemoteAppHostpool){
29 | name: '${appgroupName}-REMOTEAPP'
30 | location: AVDbackplanelocation
31 | properties: {
32 | applicationGroupType: 'RemoteApp'
33 | hostPoolArmPath: hpra.id
34 | }
35 | }
36 |
37 | //Create AVD Workspace in case createRemoteAppHostpool = false
38 | resource ws 'Microsoft.DesktopVirtualization/workspaces@2022-10-14-preview' = {
39 | name: workspaceName
40 | location: AVDbackplanelocation
41 | properties: {
42 | applicationGroupReferences: [
43 | createRemoteAppHostpool ? agra.id : ''
44 | ]
45 | }
46 | }
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/Depl;oyCLI.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2023/Workplace Ninja Summit 2023/Friday/Depl;oyCLI.mp4
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/DeployADO.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2023/Workplace Ninja Summit 2023/Friday/DeployADO.mp4
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Friday/deployADO.yaml:
--------------------------------------------------------------------------------
1 | name: Manually run by $(Build.RequestedFor) on $(Date:dd-MM-yyyy)$(Rev:.r) -
2 | trigger: none
3 |
4 | parameters:
5 | - name: resourcegroupName
6 | type: string
7 | default: "_rg-WPNS-demo"
8 | - name: hostpoolName
9 | type: string
10 | default: "hp-demo-wpns-ado"
11 |
12 | stages:
13 | - stage: "AzureResourceDeployment"
14 | displayName: "Azure resource deployment"
15 | jobs:
16 | - job: "BicepTemplateDeployment"
17 | timeoutInMinutes: 15
18 | displayName: "Bicep template deployment"
19 | pool:
20 | vmImage: "windows-latest"
21 | workspace:
22 | clean: all
23 | steps:
24 | - checkout: self
25 | # ARM template deployment v3 | Deploy a resource, using a Bicep template.
26 | - task: AzureResourceManagerTemplateDeployment@3
27 | inputs:
28 | # Azure Details
29 | deploymentScope: 'Resource Group'
30 | azureResourceManagerConnection: 'VisualStudioEnterprise'
31 | action: 'Create Or Update Resource Group'
32 | resourceGroupName: '${{parameters.resourcegroupName}}'
33 | location: 'westeurope'
34 | # Template
35 | templateLocation: 'Linked artifact'
36 | csmFile: '$(System.DefaultWorkingDirectory)\deployADO.bicep'
37 | overrideParameters: '-hostpoolName ${{parameters.hostpoolName}}'
38 | deploymentMode: "Incremental"
39 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/1. scaffolding-snippets.bicep:
--------------------------------------------------------------------------------
1 | // demo: scaffolding (AVD hostpool)
2 |
3 |
4 | // demo: snippets (AVD hostpool)
5 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/1. scaffolding-snippets.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2023/Workplace Ninja Summit 2023/Thursday/1. scaffolding-snippets.mp4
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/2.1. modulair-add-params.bicep:
--------------------------------------------------------------------------------
1 | // params: string
2 | param hostpoolName string = 'hp-demo-wpns'
3 | param hostpoolType string = 'Pooled'
4 | param loadBalancerType string = 'BreadthFirst'
5 | param preferredAppGroupType string = 'Desktop'
6 |
7 | // params: boolean
8 | param enableValidationMode bool = false
9 |
10 | // params: integer
11 | param maxSessionLimit int = 10
12 |
13 | // resource: AVD hostpool
14 | resource hp 'Microsoft.DesktopVirtualization/hostPools@2023-07-07-preview' = {
15 | name: hostpoolName
16 | properties: {
17 | hostPoolType: hostpoolType
18 | loadBalancerType: loadBalancerType
19 | preferredAppGroupType: preferredAppGroupType
20 | validationEnvironment: enableValidationMode
21 | maxSessionLimit: maxSessionLimit
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/2.2. modulair-add-decorators.bicep:
--------------------------------------------------------------------------------
1 | param hostpoolName string = 'hp-demo-wpns'
2 |
3 | // decorator: select (allowed values) list
4 | @allowed(['BYODesktop','Pooled','Personal'])
5 | param hostpoolType string = 'Pooled'
6 | @allowed(['BreadthFirst','DepthFirst','Persistant'])
7 | param loadBalancerType string = 'BreadthFirst'
8 | @allowed(['Desktop','None','RailApplications'])
9 | param preferredAppGroupType string = 'Desktop'
10 |
11 | param enableValidationMode bool = false
12 |
13 | // decorator: value (min-max) range
14 | @minValue(1)
15 | @maxValue(100)
16 | param maxSessionLimit int = 10
17 |
18 | // decorator: secure string (and linter rules)
19 | @secure()
20 | param secretPassword string = 'supersecret'
21 |
22 | // resource: AVD hostpool
23 | resource hp 'Microsoft.DesktopVirtualization/hostPools@2023-07-07-preview' = {
24 | name: hostpoolName
25 | properties: {
26 | hostPoolType: hostpoolType
27 | loadBalancerType: loadBalancerType
28 | preferredAppGroupType: preferredAppGroupType
29 | validationEnvironment: enableValidationMode
30 | maxSessionLimit: maxSessionLimit
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/3. bicep-param-example.bicep:
--------------------------------------------------------------------------------
1 | //Define AVD deployment parameters
2 | param hostpoolName string
3 | param hostpoolFriendlyName string = 'A demo host pool'
4 | param preferredAppGroupType string = 'Desktop'
5 | param AVDbackplanelocation string = 'eastus'
6 | param hostPoolType string = 'pooled'
7 | @allowed(['BreadthFirst', 'DepthFirst'])
8 | param loadBalancerType string = 'BreadthFirst'
9 | param enableValiationMode bool = false
10 | @minValue(1)
11 | @maxValue(100)
12 | param maxSessionLimit int = 10
13 | @secure()
14 | param secretDescription string
15 | param secretValue string
16 |
17 | //Create the AVD hostpool
18 | resource hp 'Microsoft.DesktopVirtualization/hostPools@2022-10-14-preview' = {
19 | name: hostpoolName
20 | location: AVDbackplanelocation
21 | properties: {
22 | friendlyName: hostpoolFriendlyName
23 | hostPoolType: hostPoolType
24 | loadBalancerType: loadBalancerType
25 | preferredAppGroupType: preferredAppGroupType
26 | validationEnvironment: enableValiationMode
27 | maxSessionLimit: maxSessionLimit
28 | description: secretDescription
29 | }
30 | }
31 |
32 | //Output the hostpool name
33 | output hpname string = hp.id
34 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/3. bicep-param-example.bicepparam:
--------------------------------------------------------------------------------
1 | using './3. bicep-param-example.bicep'
2 |
3 | param hostpoolName = ''
4 | param hostpoolFriendlyName = 'A demo host pool'
5 | param preferredAppGroupType = 'Desktop'
6 | param AVDbackplanelocation = 'eastus'
7 | param hostPoolType = 'pooled'
8 | param loadBalancerType = 'BreadthFirst'
9 | param enableValiationMode = false
10 | param maxSessionLimit = 10
11 | param secretDescription = ''
12 | param secretValue = ''
13 |
14 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/4. avd-demo-to-decompile.bicep:
--------------------------------------------------------------------------------
1 | param hostpoolName string
2 | param hostpoolFriendlyName string
3 | param appgroupName string
4 | param appgroupDesktopFriendlyName string
5 | param appgroupRemoteAppFriendlyName string
6 | param workspaceName string
7 | param workspaceNameFriendlyName string
8 | param preferredAppGroupType string = 'Desktop'
9 | param AVDbackplanelocation string = 'eastus'
10 | param hostPoolType string = 'pooled'
11 | param loadBalancerType string = 'BreadthFirst'
12 | param enableValiatioMode bool
13 | param createRemoteAppHostpool bool
14 |
15 | resource hostpool 'Microsoft.DesktopVirtualization/hostPools@2019-12-10-preview' = {
16 | name: hostpoolName
17 | location: AVDbackplanelocation
18 | properties: {
19 | friendlyName: hostpoolFriendlyName
20 | hostPoolType: hostPoolType
21 | loadBalancerType: loadBalancerType
22 | preferredAppGroupType: preferredAppGroupType
23 | validationEnvironment: enableValiatioMode
24 | }
25 | }
26 |
27 | resource appgroup 'Microsoft.DesktopVirtualization/applicationGroups@2022-10-14-preview' = {
28 | name: appgroupName
29 | location: AVDbackplanelocation
30 | properties: {
31 | friendlyName: appgroupDesktopFriendlyName
32 | applicationGroupType: 'Desktop'
33 | hostPoolArmPath: hostpool.id
34 | }
35 | }
36 |
37 | resource hostpoolName_REMOTEAPP 'Microsoft.DesktopVirtualization/hostPools@2022-10-14-preview' = if (createRemoteAppHostpool) {
38 | name: '${hostpoolName}-REMOTEAPP'
39 | location: AVDbackplanelocation
40 | properties: {
41 | friendlyName: hostpoolFriendlyName
42 | hostPoolType: hostPoolType
43 | loadBalancerType: loadBalancerType
44 | preferredAppGroupType: 'RailApplications'
45 | validationEnvironment: enableValiatioMode
46 | }
47 | }
48 |
49 | resource appgroupName_REMOTEAPP 'Microsoft.DesktopVirtualization/applicationGroups@2022-10-14-preview' = if (createRemoteAppHostpool) {
50 | name: '${appgroupName}-REMOTEAPP'
51 | location: AVDbackplanelocation
52 | properties: {
53 | friendlyName: appgroupRemoteAppFriendlyName
54 | applicationGroupType: 'RemoteApp'
55 | hostPoolArmPath: hostpoolName_REMOTEAPP.id
56 | }
57 | }
58 |
59 | resource workspace 'Microsoft.DesktopVirtualization/workspaces@2022-10-14-preview' = {
60 | name: workspaceName
61 | location: AVDbackplanelocation
62 | properties: {
63 | friendlyName: workspaceNameFriendlyName
64 | applicationGroupReferences: [
65 | appgroup.id
66 | (createRemoteAppHostpool ? appgroupName_REMOTEAPP.id : '')
67 | ]
68 | }
69 | }
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/4. avd-demo-to-decompile.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
3 | "contentVersion": "1.0.0.0",
4 | "metadata": {
5 | "_generator": {
6 | "name": "bicep",
7 | "version": "0.20.4.51522",
8 | "templateHash": "5196565399776869185"
9 | }
10 | },
11 | "parameters": {
12 | "hostpoolName": {
13 | "type": "string"
14 | },
15 | "hostpoolFriendlyName": {
16 | "type": "string"
17 | },
18 | "appgroupName": {
19 | "type": "string"
20 | },
21 | "appgroupDesktopFriendlyName": {
22 | "type": "string"
23 | },
24 | "appgroupRemoteAppFriendlyName": {
25 | "type": "string"
26 | },
27 | "workspaceName": {
28 | "type": "string"
29 | },
30 | "workspaceNameFriendlyName": {
31 | "type": "string"
32 | },
33 | "preferredAppGroupType": {
34 | "type": "string",
35 | "defaultValue": "Desktop"
36 | },
37 | "AVDbackplanelocation": {
38 | "type": "string",
39 | "defaultValue": "eastus"
40 | },
41 | "hostPoolType": {
42 | "type": "string",
43 | "defaultValue": "pooled"
44 | },
45 | "loadBalancerType": {
46 | "type": "string",
47 | "defaultValue": "BreadthFirst"
48 | },
49 | "enableValiatioMode": {
50 | "type": "bool"
51 | },
52 | "createRemoteAppHostpool": {
53 | "type": "bool"
54 | }
55 | },
56 | "resources": [
57 | {
58 | "type": "Microsoft.DesktopVirtualization/hostPools",
59 | "apiVersion": "2019-12-10-preview",
60 | "name": "[parameters('hostpoolName')]",
61 | "location": "[parameters('AVDbackplanelocation')]",
62 | "properties": {
63 | "friendlyName": "[parameters('hostpoolFriendlyName')]",
64 | "hostPoolType": "[parameters('hostPoolType')]",
65 | "loadBalancerType": "[parameters('loadBalancerType')]",
66 | "preferredAppGroupType": "[parameters('preferredAppGroupType')]",
67 | "validationEnvironment": "[parameters('enableValiatioMode')]"
68 | }
69 | },
70 | {
71 | "type": "Microsoft.DesktopVirtualization/applicationGroups",
72 | "apiVersion": "2022-10-14-preview",
73 | "name": "[parameters('appgroupName')]",
74 | "location": "[parameters('AVDbackplanelocation')]",
75 | "properties": {
76 | "friendlyName": "[parameters('appgroupDesktopFriendlyName')]",
77 | "applicationGroupType": "Desktop",
78 | "hostPoolArmPath": "[resourceId('Microsoft.DesktopVirtualization/hostPools', parameters('hostpoolName'))]"
79 | },
80 | "dependsOn": [
81 | "[resourceId('Microsoft.DesktopVirtualization/hostPools', parameters('hostpoolName'))]"
82 | ]
83 | },
84 | {
85 | "condition": "[parameters('createRemoteAppHostpool')]",
86 | "type": "Microsoft.DesktopVirtualization/hostPools",
87 | "apiVersion": "2022-10-14-preview",
88 | "name": "[format('{0}-REMOTEAPP', parameters('hostpoolName'))]",
89 | "location": "[parameters('AVDbackplanelocation')]",
90 | "properties": {
91 | "friendlyName": "[parameters('hostpoolFriendlyName')]",
92 | "hostPoolType": "[parameters('hostPoolType')]",
93 | "loadBalancerType": "[parameters('loadBalancerType')]",
94 | "preferredAppGroupType": "RailApplications",
95 | "validationEnvironment": "[parameters('enableValiatioMode')]"
96 | }
97 | },
98 | {
99 | "condition": "[parameters('createRemoteAppHostpool')]",
100 | "type": "Microsoft.DesktopVirtualization/applicationGroups",
101 | "apiVersion": "2022-10-14-preview",
102 | "name": "[format('{0}-REMOTEAPP', parameters('appgroupName'))]",
103 | "location": "[parameters('AVDbackplanelocation')]",
104 | "properties": {
105 | "friendlyName": "[parameters('appgroupRemoteAppFriendlyName')]",
106 | "applicationGroupType": "RemoteApp",
107 | "hostPoolArmPath": "[resourceId('Microsoft.DesktopVirtualization/hostPools', format('{0}-REMOTEAPP', parameters('hostpoolName')))]"
108 | },
109 | "dependsOn": [
110 | "[resourceId('Microsoft.DesktopVirtualization/hostPools', format('{0}-REMOTEAPP', parameters('hostpoolName')))]"
111 | ]
112 | },
113 | {
114 | "type": "Microsoft.DesktopVirtualization/workspaces",
115 | "apiVersion": "2022-10-14-preview",
116 | "name": "[parameters('workspaceName')]",
117 | "location": "[parameters('AVDbackplanelocation')]",
118 | "properties": {
119 | "friendlyName": "[parameters('workspaceNameFriendlyName')]",
120 | "applicationGroupReferences": [
121 | "[resourceId('Microsoft.DesktopVirtualization/applicationGroups', parameters('appgroupName'))]",
122 | "[if(parameters('createRemoteAppHostpool'), resourceId('Microsoft.DesktopVirtualization/applicationGroups', format('{0}-REMOTEAPP', parameters('appgroupName'))), '')]"
123 | ]
124 | },
125 | "dependsOn": [
126 | "[resourceId('Microsoft.DesktopVirtualization/applicationGroups', parameters('appgroupName'))]",
127 | "[resourceId('Microsoft.DesktopVirtualization/applicationGroups', format('{0}-REMOTEAPP', parameters('appgroupName')))]"
128 | ]
129 | }
130 | ]
131 | }
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/5. Insert-resource-paste-json.bicep:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/6. avd-demo-to-visualize.bicep:
--------------------------------------------------------------------------------
1 | param location string = 'westeurope'
2 | param workspaceName string = 'bicep-avd-workspace'
3 | param hostpoolName string = 'bicep-avd-hostpool'
4 | param appgroupName string = 'bicep-avd-appgroup'
5 | param preferredAppGroupType string = 'Desktop'
6 | param hostPoolType string = 'pooled'
7 | param loadbalancertype string = 'BreadthFirst'
8 | param appgroupType string = 'Desktop'
9 |
10 | resource hostpool 'Microsoft.DesktopVirtualization/hostPools@2022-10-14-preview' = {
11 | name: hostpoolName
12 | location: location
13 | properties: {
14 | friendlyName: 'My Bicep generated Host pool'
15 | hostPoolType: hostPoolType
16 | loadBalancerType: loadbalancertype
17 | preferredAppGroupType: preferredAppGroupType
18 | }
19 | }
20 |
21 | resource appgroup 'Microsoft.DesktopVirtualization/applicationGroups@2022-10-14-preview' = {
22 | name: appgroupName
23 | location: location
24 | properties: {
25 | friendlyName: 'My Bicep generated application Group'
26 | applicationGroupType: appgroupType
27 | hostPoolArmPath: hostpool.id
28 | }
29 | }
30 |
31 | resource workspace 'Microsoft.DesktopVirtualization/workspaces@2022-10-14-preview' = {
32 | name: workspaceName
33 | location: location
34 | properties: {
35 | friendlyName: 'My Bicep generated Workspace'
36 | applicationGroupReferences: [appgroup.id]
37 | }
38 | }
39 |
40 | output workspaceid string = workspace.id
41 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/7. VSCode deploy.bicep:
--------------------------------------------------------------------------------
1 | param location string = 'westeurope' //westeurope
2 | param workspaceName string = 'bicep-avd-workspace'
3 | param hostpoolName string = 'bicep-avd-hostpool'
4 | param appgroupName string = 'bicep-avd-appgroup'
5 | param preferredAppGroupType string = 'Desktop'
6 | param hostPoolType string = 'pooled'
7 | param loadbalancertype string = 'BreadthFirst'
8 | param appgroupType string = 'Desktop'
9 |
10 | resource hostpool 'Microsoft.DesktopVirtualization/hostPools@2022-10-14-preview' = {
11 | name: hostpoolName
12 | location: location
13 | properties: {
14 | friendlyName: 'My Bicep generated Host pool'
15 | hostPoolType: hostPoolType
16 | loadBalancerType: loadbalancertype
17 | preferredAppGroupType: preferredAppGroupType
18 | }
19 | }
20 |
21 | resource appgroup 'Microsoft.DesktopVirtualization/applicationGroups@2022-10-14-preview' = {
22 | name: appgroupName
23 | location: location
24 | properties: {
25 | friendlyName: 'My Bicep generated application Group'
26 | applicationGroupType: appgroupType
27 | hostPoolArmPath: hostpool.id
28 | }
29 | }
30 |
31 | resource workspace 'Microsoft.DesktopVirtualization/workspaces@2022-10-14-preview' = {
32 | name: workspaceName
33 | location: location
34 | properties: {
35 | friendlyName: 'My Bicep generated Workspace'
36 | applicationGroupReferences: [appgroup.id]
37 | }
38 | }
39 |
40 | output workspaceid string = workspace.id
41 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/8. main.bicep:
--------------------------------------------------------------------------------
1 | // CTRL - i
2 | targetScope = 'subscription'
3 | param location string = 'westeurope'
4 | param vnetname string = 'myvnet'
5 | param subNetName string = 'bicep-demo-subnet'
6 | param localAdminName string
7 | param deployResourceGroup bool = true
8 |
9 | @secure()
10 | param localAdminPassword string
11 |
12 | param avdbackplanes array = [
13 | {
14 | postfix: 'FD'
15 | preferredAppGroupType: 'Desktop'
16 | applicationGroupType: 'Desktop'
17 | }
18 | {
19 | postfix: 'RA'
20 | preferredAppGroupType: 'RailApplications'
21 | applicationGroupType: 'RemoteApp'
22 | }
23 | ]
24 |
25 | resource rg 'Microsoft.Resources/resourceGroups@2022-09-01' = if (deployResourceGroup) {
26 | name: 'BICEP-LOOP-DEMO'
27 | location: location
28 | }
29 |
30 | module vnet '8.vnet-module.bicep' = {
31 | scope: rg
32 | name: 'vnet'
33 | params: {
34 | vnetLocation: location
35 | vnetName: vnetname
36 | subNetName: subNetName
37 | }
38 | }
39 |
40 | module vm '8.vm-loop-module.bicep' = {
41 | name: 'VM'
42 | scope: rg
43 | params: {
44 | localAdminName: localAdminName
45 | localAdminPassword: localAdminPassword
46 | vnetName: vnetname
47 | subNetName: subNetName
48 | }
49 | }
50 |
51 | module backplanedeploy '8.avd-module.bicep' = [for avdbackplane in avdbackplanes: {
52 | name: '${avdbackplane.applicationGroupType}-deploy'
53 | scope: rg
54 | params: {
55 | location: rg.location
56 | prefix: avdbackplane.postfix
57 | applicationGroupType: avdbackplane.applicationGroupType
58 | preferredAppGroupType: avdbackplane.preferredAppGroupType
59 | }
60 | }]
61 |
62 | output hp1out string = backplanedeploy[1].outputs.hostPoolRegistrationtoken
63 |
64 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/8.avd-module.bicep:
--------------------------------------------------------------------------------
1 | param prefix string
2 | param location string
3 | param expirationtime string = utcNow('u')
4 | param preferredAppGroupType string
5 | param applicationGroupType string
6 |
7 | resource hp 'Microsoft.DesktopVirtualization/hostPools@2022-10-14-preview' = {
8 | name: '${prefix}-hostpool'
9 | location: location
10 | properties: {
11 | hostPoolType: 'Pooled'
12 | preferredAppGroupType: preferredAppGroupType
13 | loadBalancerType: 'BreadthFirst'
14 | registrationInfo: {
15 | registrationTokenOperation: 'Update'
16 | expirationTime: dateTimeAdd(expirationtime, 'PT2H')
17 | }
18 | }
19 | }
20 |
21 | resource ag 'Microsoft.DesktopVirtualization/applicationGroups@2022-10-14-preview' = {
22 | name: '${prefix}-applicationgroup'
23 | location: location
24 | properties: {
25 | hostPoolArmPath: hp.id
26 | applicationGroupType: applicationGroupType
27 | }
28 | }
29 |
30 | resource ws 'Microsoft.DesktopVirtualization/workspaces@2022-10-14-preview' = {
31 | name: '${prefix}-workspace'
32 | location: location
33 | properties: {
34 | applicationGroupReferences: [
35 | ag.id
36 | ]
37 | }
38 | }
39 |
40 | output hostPoolRegistrationtoken string = hp.properties.registrationInfo.token
41 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/8.vm-loop-module.bicep:
--------------------------------------------------------------------------------
1 | param localAdminName string
2 | @secure()
3 | param localAdminPassword string
4 | param vnetName string
5 | param subNetName string
6 | param vmSku string = 'Standard_D4s_v4'
7 | param vmOS string = '2019-Datacenter'
8 | param numberofVMs int = 5
9 |
10 | var defaultLocation = resourceGroup().location
11 | var vmName = 'bicep-demo-vm'
12 | var defaultVmNicName = '${vmName}-nic'
13 | var privateIPAllocationMethod = 'Dynamic'
14 |
15 | resource vnet 'Microsoft.Network/virtualNetworks@2023-04-01' existing = {
16 | name: vnetName
17 | }
18 |
19 | resource vmNic 'Microsoft.Network/networkInterfaces@2023-04-01' = [for i in range(1, numberofVMs):{
20 | name: '${defaultVmNicName}-${i}'
21 | location: defaultLocation
22 | properties: {
23 | ipConfigurations: [
24 | {
25 | name: 'ipconfig1'
26 | properties: {
27 | subnet: {
28 | id: '${vnet.id}/subnets/${subNetName}'
29 | }
30 | privateIPAllocationMethod: privateIPAllocationMethod
31 | }
32 | }
33 | ]
34 | }
35 | dependsOn: [
36 | vnet
37 | ]
38 | }]
39 |
40 | resource vm 'Microsoft.Compute/virtualMachines@2023-03-01' = [for i in range(1, numberofVMs):{
41 | name: '${vmName}-${i}'
42 | location: defaultLocation
43 | properties: {
44 | osProfile: {
45 | computerName: vmName
46 | adminUsername: localAdminName
47 | adminPassword: localAdminPassword
48 | }
49 | hardwareProfile: {
50 | vmSize: vmSku
51 | }
52 | storageProfile: {
53 | imageReference: {
54 | publisher: 'MicrosoftWindowsServer'
55 | offer: 'WindowsServer'
56 | sku: vmOS
57 | version: 'latest'
58 | }
59 | osDisk: {
60 | createOption: 'FromImage'
61 | }
62 | }
63 | networkProfile: {
64 | networkInterfaces: [
65 | {
66 | properties: {
67 | primary: true
68 | }
69 | id: vmNic[i-1].id
70 | }
71 | ]
72 | }
73 | }
74 | }]
75 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/8.vnet-module.bicep:
--------------------------------------------------------------------------------
1 | param vnetName string = 'bicep-demo-vnet'
2 | param vnetLocation string = 'west europe'
3 | param subNetName string = 'bicep-demo-subnet'
4 |
5 | var vnetConfig = {
6 | vnetprefix: '10.0.0.0/16'
7 | subnet: {
8 | name: subNetName
9 | subnetPrefix: '10.0.66.0/24'
10 | }
11 | }
12 |
13 | resource vnet 'Microsoft.Network/virtualNetworks@2023-04-01' = {
14 | name: vnetName
15 | location: vnetLocation
16 | properties: {
17 | addressSpace: {
18 | addressPrefixes: [
19 | vnetConfig.vnetprefix
20 | ]
21 | }
22 | subnets: [
23 | {
24 | name: vnetConfig.subnet.name
25 | properties: {
26 | addressPrefix: vnetConfig.subnet.subnetPrefix
27 | }
28 | }
29 | ]
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Thursday/8.x_oldschooltemplate.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
3 | "contentVersion": "1.0.0.0",
4 | "metadata": {
5 | "_generator": {
6 | "name": "bicep",
7 | "version": "0.4.577.32449",
8 | "templateHash": "16145579273185764566"
9 | }
10 | },
11 | "parameters": {
12 | "storageAccountName": {
13 | "type": "string",
14 | "defaultValue": "AVD"
15 | },
16 | "storageAccountLocation": {
17 | "type": "string",
18 | "defaultValue": "westeurope",
19 | "allowedValues": [
20 | "westeurope",
21 | "northeurope"
22 | ]
23 | },
24 | "securePassword": {
25 | "type": "secureString"
26 | }
27 | },
28 | "functions": [],
29 | "resources": [
30 | {
31 | "type": "Microsoft.Storage/storageAccounts",
32 | "apiVersion": "2021-04-01",
33 | "name": "[parameters('storageAccountName')]",
34 | "location": "[parameters('storageAccountLocation')]",
35 | "kind": "StorageV2",
36 | "sku": {
37 | "name": "Standard_LRS"
38 | },
39 | "properties": {
40 | "accessTier": "Cool"
41 | }
42 | }
43 | ],
44 | "outputs": {
45 | "stgout": {
46 | "type": "string",
47 | "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))).primaryEndpoints.blob]"
48 | }
49 | }
50 | }
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Using Bicep for your Azure Virtual Desktop deployments - Masterclass.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2023/Workplace Ninja Summit 2023/Using Bicep for your Azure Virtual Desktop deployments - Masterclass.pdf
--------------------------------------------------------------------------------
/2023/Workplace Ninja Summit 2023/Using Bicep for your Azure Virtual Desktop deployments - StarterKit.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2023/Workplace Ninja Summit 2023/Using Bicep for your Azure Virtual Desktop deployments - StarterKit.pdf
--------------------------------------------------------------------------------
/2024/2024 - 01 - Mastering Bicep - Infrastructure as Code for Azure.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2024/2024 - 01 - Mastering Bicep - Infrastructure as Code for Azure.pdf
--------------------------------------------------------------------------------
/2024/2024 - 04 - Mastering Bicep - Infrasstructure as Code for Azure.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2024/2024 - 04 - Mastering Bicep - Infrasstructure as Code for Azure.pdf
--------------------------------------------------------------------------------
/2024/2024 - 05 - Optimize Azure Infrastructure as Code Deployments with VS Code.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2024/2024 - 05 - Optimize Azure Infrastructure as Code Deployments with VS Code.pdf
--------------------------------------------------------------------------------
/2024/2024 - 06 - Navigating new Galaxies with Bicep Infrastructure as Code advanced topics.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2024/2024 - 06 - Navigating new Galaxies with Bicep Infrastructure as Code advanced topics.pdf
--------------------------------------------------------------------------------
/2024/2024 - 11 - Empower anywhere access to all apps in a hybrid, cloud, and AI world.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2024/2024 - 11 - Empower anywhere access to all apps in a hybrid, cloud, and AI world.pdf
--------------------------------------------------------------------------------
/2024/2024 - 11 - Flexing your muscles with Parallels RAS and Bicep.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2024/2024 - 11 - Flexing your muscles with Parallels RAS and Bicep.pdf
--------------------------------------------------------------------------------
/2024/2024 - 11 - Optimize Azure Infrastructure as Code Deployments with VS Code.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2024/2024 - 11 - Optimize Azure Infrastructure as Code Deployments with VS Code.pdf
--------------------------------------------------------------------------------
/2024/2024 - 12 - Flexing your EUC muscles with Bicep.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2024/2024 - 12 - Flexing your EUC muscles with Bicep.pdf
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/2024 - 09 - Attached to traditional golden images for AVD Get attached to something different.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2024/Workplace Ninja Summit 2024/2024 - 09 - Attached to traditional golden images for AVD Get attached to something different.pdf
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/2024 - 09 - Using Bicep for Infra-as-Code deployments - The advanced AVD and W365 edition.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2024/Workplace Ninja Summit 2024/2024 - 09 - Using Bicep for Infra-as-Code deployments - The advanced AVD and W365 edition.pdf
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/LICENSE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Freek Berson
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Tuesday/Convert-PngToBase64String.ps1:
--------------------------------------------------------------------------------
1 | function Convert-PngToBase64String {
2 | param (
3 | [Parameter(Mandatory = $true)]
4 | [string]$PngFilePath
5 | )
6 |
7 | # Ensure the file exists
8 | if (-Not (Test-Path -Path $PngFilePath)) {
9 | throw "File '$PngFilePath' not found."
10 | }
11 |
12 | # Read the file content as bytes
13 | $byteArray = [System.IO.File]::ReadAllBytes($PngFilePath)
14 |
15 | # Convert the byte array to a Base64 string
16 | $base64String = [Convert]::ToBase64String($byteArray)
17 |
18 | return $base64String
19 | }
20 |
21 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Tuesday/ConvertTo-RawIcon.ps1:
--------------------------------------------------------------------------------
1 | function ConvertTo-RawIcon {
2 | [CmdletBinding()]
3 |
4 | Param (
5 | [Parameter(
6 | Position = 0,
7 | ValuefromPipelineByPropertyName = $true,
8 | ValuefromPipeline = $true,
9 | Mandatory = $true
10 | )]
11 | [Alias('FullName')]
12 | [System.String]$Path
13 | )
14 |
15 | begin {
16 | Set-StrictMode -Version Latest
17 | } # begin
18 | process {
19 |
20 | if (Test-Path $Path){
21 | $fileInfo = Get-ChildItem $Path
22 | }
23 | else{
24 | Write-Error "$Path not found"
25 | }
26 |
27 | if ($fileInfo.Extension -ne '.png') {
28 | Write-Error "Only support png"
29 | return
30 | }
31 |
32 |
33 | $Bytes = get-content $Path -AsByteStream -Raw
34 | $inputFromBase64conv = [convert]::ToBase64String($Bytes)
35 | $out = [System.Convert]::FromBase64String($inputFromBase64conv)
36 |
37 | Write-Output $out
38 |
39 | } # process
40 | end {} # end
41 | } #function ConvertTo-RawIcon
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Tuesday/Create-AppAttachContainer.ps1:
--------------------------------------------------------------------------------
1 | <#
2 | .SYNOPSIS
3 | Creates an MSIX app attach (vhd) container for a given MSIX application
4 | .DESCRIPTION
5 | This scripts creates an MSIX app attach (vhd) container for a given MSIX files by:
6 | - Creating a new VHD disk
7 | - Initializing the disk
8 | - Creating a partition on the disk
9 | - Formatting the partition, including a customized label
10 | - Creating the MSIX parent folder
11 | - Extracting the MSIX into the parent folder on the mounted disk
12 | - Output the Volume ID and Package name needed for the Staging step of MSIX app attach
13 | - Dismount the disk
14 |
15 | .NOTES
16 | File Name : create-MSIXAppAttachContainer.ps1
17 | Author : Freek Berson
18 | Version : v1.0.3
19 | .EXAMPLE
20 | .\create-MSIXAppAttachContainer.ps1
21 | .DISCLAIMER
22 | Use at your own risk. This scripts are provided AS IS without warranty of any kind. The author further disclaims all implied
23 | warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. The entire risk
24 | arising out of the use or performance of the scripts and documentation remains with you. In no event shall the author, or anyone else involved
25 | in the creation, production, or delivery of the scripts be liable for any damages whatsoever (including, without limitation, damages for loss
26 | of business profits, business interruption, loss of business information, or other pecuniary loss) arising out of the use of or inability
27 | to use the this script.
28 | #>
29 |
30 | #Variables (below are sample values, change them accordingly before running the script)
31 | $MSIXSourceLocation = "C:\MSIX\2.MSIX\"
32 | $MSIXAppAttachDestinationPath = "C:\MSIX\3.AppAttach\"
33 | $MSIXSourceFiles = @("SpeedtestbyOokla_1.13.194.0_x64__g33wvrk220n28.msix")
34 | $MSIXappattachContainerSizeMb = 250MB
35 | $MSIXappattachContainerLabel = "speedtest"
36 | $MSIXappattachContainerRootFolder = "speedtest"
37 | $MSIXMGRLocation = "C:\Program Files\msixmgr\x64\"
38 | $MSIXappattachContainerExtension = ".vhd"
39 |
40 | Clear-Host
41 | $Starttime = get-date
42 |
43 | #Create new VHD
44 | if (Test-Path -path ($MSIXAppAttachDestinationPath+$MSIXappattachContainerLabel+$MSIXappattachContainerExtension) -PathType Leaf){Write-Host "VHD Already exists, exiting" -ForegroundColor Red;return}
45 | New-VHD -SizeBytes $MSIXappattachContainerSizeMb -Path ($MSIXAppAttachDestinationPath+$MSIXappattachContainerLabel+$MSIXappattachContainerExtension) -Dynamic -Confirm:$false
46 |
47 | #Mount the VHD
48 | $vhdObject = Mount-VHD ($MSIXAppAttachDestinationPath+$MSIXappattachContainerLabel+$MSIXappattachContainerExtension) -Passthru
49 |
50 | #Initialize disk
51 | $disk = Initialize-Disk -Passthru -Number $vhdObject.Number
52 |
53 | #Create parition
54 | $partition = New-Partition -AssignDriveLetter -UseMaximumSize -DiskNumber $disk.Number
55 |
56 | #Format Partition
57 | Format-Volume -FileSystem NTFS -Confirm:$false -DriveLetter $partition.DriveLetter -NewFileSystemLabel $MSIXappattachContainerLabel -Force
58 |
59 | #Create MSIX Root Folder
60 | New-Item -Path ($partition.DriveLetter+":\"+$MSIXappattachContainerRootFolder) -ItemType Directory
61 |
62 | #Extract the MSIX into the app attach container (vhd)
63 | foreach ($MSIXSourceFile in $MSIXSourceFiles)
64 | {
65 | $msixmgRresult = Start-Process -FilePath ("`"" + $MSIXMGRLocation + "msixmgr.exe" +"`"") -ArgumentList ("-Unpack -packagePath `"" + ($MSIXSourceLocation+$MSIXSourceFile) + "`" -destination `"" + ($partition.DriveLetter+":\"+$MSIXappattachContainerRootFolder) +"`" -applyacls") -Wait | Wait-process
66 | #Grab the Volume info needed for the Staging part of MSIX app attach
67 | Write-Host "Completed transforming:"$MSIXSourceFile -ForegroundColor green
68 | }
69 | Write-Host "Disk Volume ID:" ((Get-Volume -DriveLetter $partition.DriveLetter | Select-Object UniqueId).UniqueId | out-string).Substring(11,((Get-Volume -DriveLetter $partition.DriveLetter | select UniqueId).UniqueId.Length-13)) -ForegroundColor Cyan
70 | Write-Host "Package Names:" -ForegroundColor green
71 | (Get-ChildItem -Path ($partition.DriveLetter+":\"+$MSIXappattachContainerRootFolder) | Select-Object Name).name
72 |
73 | #Dismount the VHD
74 | Dismount-VHD ($MSIXAppAttachDestinationPath+$MSIXappattachContainerLabel+$MSIXappattachContainerExtension)
75 | Write-Host "Disk is dismounted and ready"
76 |
77 | Write-Host "Finished! Total transformation time:"((get-date) - $Starttime).Minutes "Minute(s) and" ((get-date) - $Starttime).seconds "Seconds."
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Tuesday/aa-google-chrome.bicep:
--------------------------------------------------------------------------------
1 | param hostpoolName string = 'lab-avd-hp-01'
2 | param packageName string = 'GoogleChrome-2'
3 | param displayName string = 'Google Chrome'
4 | param packageFullName string = 'GoogleChrome_70.83.32895.0_x64__g33wvrk220n28-2'
5 | param Imagepath string = '\\\\labcloudsa01.file.core.windows.net\\appattach\\GoogleChrome_70.83.32895.0_x64__g33wvrk220n28.vhd'
6 | param packageRelativePath string = '\\googlechrome\\GoogleChrome_70.83.32895.0_x64__g33wvrk220n28'
7 | param packageFamilyName string = 'GoogleChrome_g33wvrk220n28'
8 | param version string = '70.83.32895.0'
9 | param lastUpdated string = '2024-08-21T12:06:28.7714289'
10 | param appId string = 'CHROME'
11 | param friendlyName string = 'Google Chrome'
12 | param appUserModelID string = 'GoogleChrome_g33wvrk220n28!CHROME'
13 | param description string = 'Google Chrome'
14 | param iconImageName string = 'CHROME-Square44x44Logo.scale-100.png'
15 |
16 | resource hp 'Microsoft.DesktopVirtualization/hostPools@2024-04-03' existing = {
17 | name: hostpoolName
18 | }
19 |
20 | resource GoogleChrome 'Microsoft.DesktopVirtualization/appAttachPackages@2024-03-06-preview' = {
21 | name: 'Google Chrome-2'
22 | location: 'west europe'
23 | properties: {
24 | hostPoolReferences: [
25 | hp.id
26 | ]
27 | image: {
28 | isRegularRegistration: true
29 | isActive: true
30 | packageName: packageName
31 | displayName: displayName
32 | packageFullName: packageFullName
33 | imagePath: Imagepath
34 | packageRelativePath: packageRelativePath
35 | packageFamilyName: packageFamilyName
36 | version: version
37 | lastUpdated:lastUpdated
38 | packageApplications: [
39 | {
40 | appId:appId
41 | friendlyName:friendlyName
42 | appUserModelID: appUserModelID
43 | description:description
44 | iconImageName:iconImageName
45 | rawIcon: rawIcon
46 | rawPng: rawPng
47 | }
48 | ]
49 | }
50 | failHealthCheckOnStagingFailure: 'NeedsAssistance'
51 | }
52 | }
53 |
54 | param rawIcon string = 'AAABAAEAICAAAAAAIADHBQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAAAFzUkdCAK7OHOkAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAFXElEQVRYR+2Wa1BUZRjHdyatvNsVagSXiyCXvcCCEMJeQAJMAcsZp/pQln3IxibHappEVLJsTCRUwhTFkIG8zFijaaPAIrhAWqN5+aCiBwHZBXZZQGGBc9h/z7t7WMCUS/WlGZ+Z3/zfs8N5fs/7vuzMSh7V/6awXuJu1Sikxr8RMezZ9pablP52gvjaf1NcVKCy481ZnDlOheZYRpiLljhKnQomolmrQluqP5oT5Fniq/++WqOiOJMutNVEMiYx6QaSICFLI6VRG+rKJk0IGtUy7qbGc6nYZvzFaRQzqeHJQYFT6BQRGiYaTCchaFIPcidGiYYIhVZsOb5qUKtODjYWmw8R3HGhHEwSMhoHiFagIUqOeo1shdh2bHU9PJwzig2Z1CVjAofQCRMMiIbSMMB85wA3IhQ4r1KN7STC8xcqK5fMa2WN79+NA/Z5UgxaP1wBS9oamNethvnjVJhXhaP1AyXMxNBsXalAC9FVGLRZVDy8NHqNe+RPSdzb3yThWmzI8J3Ml6NRG4a2LRnovXwRnc1tqGvqRoulC3xHHfobiyH8kQreEOpAMIS44Fmek8NulxSLqgeXojhBqixeDFVhKgqWz8dtktazOyQaNCq0783F3bu9OFjTi1ezOxH7dQcStnTgkx+7cKtFQH93A4TLyyBUKyDUOOGr5Q6EKhqgxpcTVQ8uRXGKNKQwBSE0wGtZSTAsDMXtl2SOQcyb0hzytYe7ELGxHar1TsJElmzvxOkrPbBbSmi3kSQMBk8I1QTLqiDGKAPkp0gVBclQFKQgbH8ytq6MBhcZhPqEaPRcuogDhh7M22BFaPqDWbStA/XmXjqFN0gWSAS44BkGv9EHkO9fDPkPThbsSMLvOjmMK5ej3WRBUmYHlOusDyUyw4pjF3rRbzpMd+/vgHfhB/7snNEHkOUvQjDBkvFemg516WtQZ7Qh5ksr5Gltw1CIsLVqfRv2VdggWH+DcNbXBe9IH/Sd9Rl5AP/8BGnQvlcQLMLWsryFOLp9De40dUL9lRUyEsnWEkMyeK2FoAHoeopqetBvqSShN4m9HClUetFair5K6egDBJIwaK+TwLwkB8v3vQNjcz0+PXQXQSR7GJFftKG6tg/91z8j6WzCE/xQKjxGGSA3QRqwJxH3o8xbhINXj6O2WUBiZjsCPrcQZjGdBKdZkPHzPXRbr4KvCSfZrGEILM+8OPoA/rsTMHd3IuZ+z3JwnXjwXdS1N+HEJRvittC9p1vo+J1EZFiwkeSdti5039hAu/Ug2QsuhAqW7rBXPDfyAG4XZks9joXDn4T+u152Qms/SkbqkffxS205rplsOHK+B3lnulFgsOHcrT5caanD/nPZaKmgr9sZNxcCy/LnHWmvnTLyABJIJrgVxmX55sZjzgDfLSBYxsOPnpV7kvH60dUounIc1Y1/4tTNKqwr/xa6gmUwnPBFX/mzJLyfZ2A3EHbJLNE0cnnnxHO+OQvAYAMMrIcT52IOsepAKGx6kumfJqGI/ilKonQm+JMzxv67wDc7calXdjy8d8TBZ2cs5chE7YpG1XH6J9OTSD8DfBnB0rGejv7S6ZU4JHEX24+tfHLjtD47dfDK1sJrO+UIbCoKgK10OsmmQdBPcyRfNpUGmApcdIPYcvzltS12xdycaEi/1TqhYRwMPBPzcqJw9QQdfdkUYrKT0kngT09C/6nJlWKrf16qXJXWK1u9WZqlwWwRz21qSjW8iaLDHuhlwtInwZcQlPZfH6M7f0I77mMfsdIlxQE71JxnpprzyIzhPLbGcMm7Qrh7JRO5vpIJHF82kRMqHudMeslH4huP6lGNoSSSvwBTax5ew94xkgAAAABJRU5ErkJggg=='
55 | param rawPng string = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAABVxJREFUWEftlmtQVGUYx3cmrbzbFWoEl4sgl73AghDCXkACTAHLGaf6UJZ9yMYmx2qaRFSybEwkVMIUxZCBvMxYo2mjwCK4QFqjefmgogcB2QV2WUBhgXPYf8+7e1jAlEv1pRmfmd/837PDeX7P+77szEoe1f+msF7ibtUopMa/ETHs2faWm5T+doL42n9TXFSgsuPNWZw5ToXmWEaYi5Y4Sp0KJqJZq0Jbqj+aE+RZ4qv/vlqjojiTLrTVRDImMekGkiAhSyOlURvqyiZNCBrVMu6mxnOp2Gb8xWkUM6nhyUGBU+gUERomGkwnIWhSD3InRomGCIVWbDm+alCrTg42FpsPEdxxoRxMEjIaB4hWoCFKjnqNbIXYdmx1PTycM4oNmdQlYwKH0AkTDIiG0jDAfOcANyIUOK9Sje0kwvMXKiuXzGtlje/fjQP2eVIMWj9cAUvaGpjXrYb541SYV4Wj9QMlzMTQbF2pQAvRVRi0WVQ8vDR6jXvkT0nc298k4VpsyPCdzJejURuGti0Z6L18EZ3Nbahr6kaLpQt8Rx36G4sh/JEK3hDqQDCEuOBZnpPDbpcUi6oHl6I4QaosXgxVYSoKls/HbZLWszskGjQqtO/Nxd27vThY04tXszsR+3UHErZ04JMfu3CrRUB/dwOEy8sgVCsg1Djhq+UOhCoaoMaXE1UPLkVxijSkMAUhNMBrWUkwLAzF7ZdkjkHMm9Ic8rWHuxCxsR2q9U7CRJZs78TpKz2wW0pot5EkDAZPCNUEy6ogxigD5KdIFQXJUBSkIGx/MraujAYXGYT6hGj0XLqIA4YezNtgRWj6g1m0rQP15l46hTdIFkgEuOAZBr/RB5DvXwz5D04W7EjC7zo5jCuXo91kQVJmB5TrrA8lMsOKYxd60W86THfv74B34Qf+7JzRB5DlL0IwwZLxXpoOdelrUGe0IeZLK+RpbcNQiLC1an0b9lXYIFh/g3DW1wXvSB/0nfUZeQD//ARp0L5XECzC1rK8hTi6fQ3uNHVC/ZUVMhLJ1hJDMnithaAB6HqKanrQb6kkoTeJvRwpVHrRWoq+SunoAwSSMGivk8C8JAfL970DY3M9Pj10F0EkexiRX7ShurYP/dc/I+lswhP8UCo8RhkgN0EasCcR96PMW4SDV4+jtllAYmY7Aj63EGYxnQSnWZDx8z10W6+Crwkn2axhCCzPvDj6AP67EzB3dyLmfs9ycJ148F3UtTfhxCUb4rbQvadb6PidRGRYsJHknbYudN/YQLv1INkLLoQKlu6wVzw38gBuF2ZLPY6Fw5+E/rtedkJrP0pG6pH38UttOa6ZbDhyvgd5Z7pRYLDh3K0+XGmpw/5z2WipoK/bGTcXAsvy5x1pr50y8gASSCa4FcZl+ebGY84A3y0gWMbDj56Ve5Lx+tHVKLpyHNWNf+LUzSqsK/8WuoJlMJzwRV/5syS8n2dgNxB2ySzRNHJ558RzvjkLwGADDKyHE+diDrHqQChsepLpnyahiP4pSqJ0JviTM8b+u8A3O3GpV3Y8vHfEwWdnLOXIRO2KRtVx+ifTk0g/A3wZwdKxno7+0umVOCRxF9uPrXxy47Q+O3XwytbCazvlCGwqCoCtdDrJpkHQT3MkXzaVBpgKXHSD2HL85bUtdsXcnGhIv9U6oWEcDDwT83KicPUEHX3ZFGKyk9JJ4E9PQv+pyZViq39eqlyV1itbvVmapcFsEc9tako1vImiwx7oZcLSJ8GXEJT2Xx+jO39CO+5jH7HSJcUBO9ScZ6aa88iM4Ty2xnDJu0K4eyUTub6SCRxfNpETKh7nTHrJR+Ibj+pRjaEkkr8AU2seXsPeMZIAAAAASUVORK5CYII='
56 |
57 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Tuesday/readme.md:
--------------------------------------------------------------------------------
1 |
2 | # Workplace Ninja Summit Source Code
3 | This folder contains all demo source code used during our Workplace Ninja Summit 2024 sessions in Luzwern.
4 | Use at your own risk 😊
5 |
6 | Feel free to reach out if you have questions in regards to these topics. Happy to connect!
7 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/1.Reusability/acr.bicep:
--------------------------------------------------------------------------------
1 | @minLength(5)
2 | @maxLength(50)
3 | @description('Provide a globally unique name of your Azure Container Registry')
4 | param acrName string = 'acrdemofreek'
5 |
6 | @description('Provide a location for the registry.')
7 | param location string = resourceGroup().location
8 |
9 | @description('Provide a tier of your Azure Container Registry.')
10 | param acrSku string = 'Basic'
11 |
12 | @description('Creates the Azure Container Registry')
13 | resource acrResource 'Microsoft.ContainerRegistry/registries@2021-06-01-preview' = {
14 | name: acrName
15 | location: location
16 | sku: {
17 | name: acrSku
18 | }
19 | properties: {
20 | adminUserEnabled: false
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/1.Reusability/main.bicep:
--------------------------------------------------------------------------------
1 | targetScope = 'subscription'
2 | param location string
3 | param vnetname string
4 | param subNetName string
5 | param localAdminName string
6 | param deployResourceGroup bool
7 | param expirationtime string = utcNow('u')
8 |
9 | @secure()
10 | param localAdminPassword string
11 | param avdbackplanes array = [
12 | {
13 | postfix: 'FD'
14 | preferredAppGroupType: 'Desktop'
15 | applicationGroupType: 'Desktop'
16 | }
17 | {
18 | postfix: 'RA'
19 | preferredAppGroupType: 'RailApplications'
20 | applicationGroupType: 'RemoteApp'
21 | }
22 | ]
23 |
24 | resource rg 'Microsoft.Resources/resourceGroups@2022-09-01' = if (deployResourceGroup) {
25 | name: 'BICEP-LOOP-DEMO'
26 | location: location
27 | }
28 |
29 | //Local Bicep module
30 | module vnet './module-vnet.bicep' = {
31 | name: 'vnet'
32 | scope: rg
33 | params: {
34 | vnetLocation: location
35 | vnetName: vnetname
36 | subNetName: subNetName
37 | }
38 | }
39 |
40 | //Modules in Azure Container Registry (ACR)
41 | @description('Private Registry Module that deploys a storage account')
42 | module sa2 'br/CoreModules:avdhostpool:v1' = {
43 | name: 'sa2'
44 | scope: rg
45 | params: {
46 | applicationGroupType: 'Desktop'
47 | location: location
48 | preferredAppGroupType: 'Desktop'
49 | }
50 | }
51 |
52 | //Modules in Azure Verified Modules (AVM)
53 | //aka.ms/AVM - Owned, developed & supported by Microsoft
54 | module myAVMTest 'br/public:avm/res/desktop-virtualization/host-pool:0.3.0' = {
55 | scope: rg
56 | params: {
57 | name: 'AVM-hostpool'
58 | description: 'My Azure Verified Module Host Pool'
59 | hostPoolType: 'Personal'
60 | location: location
61 | }
62 | }
63 |
64 |
65 | //Code completion example
66 |
67 |
68 |
69 | //Module with loops
70 | module backplanedeploy 'module-avd.bicep' = [
71 | for avdbackplane in avdbackplanes: {
72 | name: '${avdbackplane.applicationGroupType}-deploy'
73 | scope: rg
74 | params: {
75 | location: rg.location
76 | applicationGroupType: avdbackplane.applicationGroupType
77 | preferredAppGroupType: avdbackplane.preferredAppGroupType
78 | expirationtime: expirationtime
79 | }
80 | }
81 | ]
82 |
83 | module vm 'module-vm.bicep' = {
84 | name: 'VM'
85 | scope: rg
86 | params: {
87 | localAdminName: localAdminName
88 | localAdminPassword: localAdminPassword
89 | vnetName: vnetname
90 | subNetName: subNetName
91 | defaultLocation: location
92 | }
93 | }
94 |
95 |
96 | output hp1out string = backplanedeploy[1].outputs.hostPoolRegistrationtoken
97 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/1.Reusability/module-avd.bicep:
--------------------------------------------------------------------------------
1 | param location string
2 | param expirationtime string = utcNow('u')
3 | param preferredAppGroupType string
4 | param applicationGroupType string
5 |
6 | @export()
7 | var prefix = 'my-prefix'
8 |
9 | resource hp 'Microsoft.DesktopVirtualization/hostPools@2023-11-01-preview' = {
10 | name: '${prefix}-hostpool'
11 | location: location
12 | properties: {
13 | hostPoolType: 'Pooled'
14 | preferredAppGroupType: preferredAppGroupType
15 | loadBalancerType: 'BreadthFirst'
16 | registrationInfo: {
17 | registrationTokenOperation: 'Update'
18 | expirationTime: dateTimeAdd(expirationtime, 'PT2H')
19 | }
20 | }
21 | }
22 |
23 | resource ag 'Microsoft.DesktopVirtualization/applicationGroups@2023-11-01-preview' = {
24 | name: '${prefix}-applicationgroup'
25 | location: location
26 | properties: {
27 | hostPoolArmPath: hp.id
28 | applicationGroupType: applicationGroupType
29 | }
30 | }
31 |
32 | resource ws 'Microsoft.DesktopVirtualization/workspaces@2023-11-01-preview' = {
33 | name: '${prefix}-workspace'
34 | location: location
35 | properties: {
36 | applicationGroupReferences: [
37 | ag.id
38 | ]
39 | }
40 | }
41 |
42 | output hostPoolRegistrationtoken string = hp.properties.registrationInfo.token
43 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/1.Reusability/module-vm.bicep:
--------------------------------------------------------------------------------
1 | param defaultLocation string
2 | param localAdminName string
3 | @secure()
4 | param localAdminPassword string
5 | param vnetName string
6 | param subNetName string
7 | param vmSku string = 'Standard_D4s_v4'
8 | param vmOS string = '2019-Datacenter'
9 | param numberofVMs int = 5
10 |
11 | var vmName = 'bicep-demo-vm'
12 | var defaultVmNicName = '${vmName}-nic'
13 | var privateIPAllocationMethod = 'Dynamic'
14 |
15 | resource vnet 'Microsoft.Network/virtualNetworks@2023-04-01' existing = {
16 | name: vnetName
17 | }
18 |
19 | resource vmNic 'Microsoft.Network/networkInterfaces@2023-04-01' = [
20 | for i in range(1, numberofVMs): {
21 | name: '${defaultVmNicName}-${i}'
22 | location: defaultLocation
23 | properties: {
24 | ipConfigurations: [
25 | {
26 | name: 'ipconfig1'
27 | properties: {
28 | subnet: {
29 | id: '${vnet.id}/subnets/${subNetName}'
30 | }
31 | privateIPAllocationMethod: privateIPAllocationMethod
32 | }
33 | }
34 | ]
35 | }
36 | dependsOn: [vnet]
37 | }
38 | ]
39 |
40 | resource vm 'Microsoft.Compute/virtualMachines@2023-03-01' = [
41 | for i in range(1, numberofVMs): {
42 | name: '${vmName}-${i}'
43 | location: defaultLocation
44 | properties: {
45 | osProfile: {
46 | computerName: vmName
47 | adminUsername: localAdminName
48 | adminPassword: localAdminPassword
49 | }
50 | hardwareProfile: {
51 | vmSize: vmSku
52 | }
53 | storageProfile: {
54 | imageReference: {
55 | publisher: 'MicrosoftWindowsServer'
56 | offer: 'WindowsServer'
57 | sku: vmOS
58 | version: 'latest'
59 | }
60 | osDisk: {
61 | createOption: 'FromImage'
62 | }
63 | }
64 | networkProfile: {
65 | networkInterfaces: [
66 | {
67 | properties: {
68 | primary: true
69 | }
70 | id: vmNic[i - 1].id
71 | }
72 | ]
73 | }
74 | }
75 | }
76 | ]
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/1.Reusability/module-vnet.bicep:
--------------------------------------------------------------------------------
1 | param vnetName string = 'bicep-demo-vnet'
2 | param vnetLocation string = 'west europe'
3 | param subNetName string = 'bicep-demo-subnet'
4 |
5 | var vnetConfig = {
6 | vnetprefix: '10.0.0.0/16'
7 | subnet: {
8 | name: subNetName
9 | subnetPrefix: '10.0.66.0/24'
10 | }
11 | }
12 |
13 | resource vnet 'Microsoft.Network/virtualNetworks@2023-04-01' = {
14 | name: vnetName
15 | location: vnetLocation
16 | properties: {
17 | addressSpace: {
18 | addressPrefixes: [
19 | vnetConfig.vnetprefix
20 | ]
21 | }
22 | subnets: [
23 | {
24 | name: vnetConfig.subnet.name
25 | properties: {
26 | addressPrefix: vnetConfig.subnet.subnetPrefix
27 | }
28 | }
29 | ]
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/1.Reusability/publish_to_acr.ps1:
--------------------------------------------------------------------------------
1 |
2 | #Publish files to registry
3 | az bicep publish -f .\2.Reusability\module-avd.bicep --target br:acrdemofreek.azurecr.io/bicep/modules/avdhostpool:v1
4 |
5 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/1.Reusability/temp.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/2.Deployment Stacks/main.bicep:
--------------------------------------------------------------------------------
1 | targetScope = 'subscription'
2 |
3 | param numberofEnvironments int = 3
4 |
5 | param hostpoolResourceGroup string = 'WPN-2024-BICEP-STACK-HP'
6 | param applicationGroupResourceGroup string = 'WPN-2024-BICEP-STACK-AG'
7 | param workspaceResourceGroup string = 'WPN-2024-BICEP-STACK-WS'
8 |
9 | param AVDlocation string = 'westeurope'
10 | param hostPoolType string = 'pooled'
11 | param loadBalancerType string = 'DepthFirst'
12 | param hostpoolName string = 'BICEP-P-AVD-HP'
13 | param appgroupName string = 'BICEP-P-AVD-HP-AG'
14 | param workspaceName string = 'BICEP-P-AVD-HP-WS'
15 | param preferredAppGroupType string = 'Desktop'
16 | param AVDHostPoolfriendlyname string = 'updated friendlyname'
17 | param enableValiatioMode bool = true
18 |
19 | resource hprg 'Microsoft.Resources/resourceGroups@2024-03-01' existing = {
20 | name: hostpoolResourceGroup
21 | }
22 |
23 | resource wsrg 'Microsoft.Resources/resourceGroups@2024-03-01' existing = {
24 | name: workspaceResourceGroup
25 | }
26 |
27 | resource agrg 'Microsoft.Resources/resourceGroups@2024-03-01' existing = {
28 | name: applicationGroupResourceGroup
29 | }
30 |
31 | module hp 'module-hp.bicep' = [
32 | for i in range(1, numberofEnvironments): {
33 | scope: hprg
34 | name: 'hp${i}'
35 | params: {
36 | AVDbackplanelocation: AVDlocation
37 | AVDHostPoolfriendlyname: AVDHostPoolfriendlyname
38 | enableValiatioMode: enableValiatioMode
39 | hostpoolName: '${hostpoolName}${i}'
40 | hostPoolType: hostPoolType
41 | loadBalancerType: loadBalancerType
42 | preferredAppGroupType: preferredAppGroupType
43 | }
44 | }
45 | ]
46 |
47 | module ws 'module-ws.bicep' = [
48 | for i in range(0, numberofEnvironments): {
49 | scope: wsrg
50 | name: 'ws${i+1}'
51 | params: {
52 | AVDbackplanelocation: AVDlocation
53 | workspaceName:'${workspaceName}${i+1}'
54 | applicationGroupID: ag[i].outputs.agID
55 | }
56 | }
57 | ]
58 |
59 | module ag 'module-ag.bicep' = [
60 | for i in range(0, numberofEnvironments): {
61 | scope: agrg
62 | name: 'ag${i+1}'
63 | params: {
64 | hostPoolArmPath: hp[i].outputs.hpid
65 | preferredAppGroupType: preferredAppGroupType
66 | appgroupName: '${appgroupName}${i+1}'
67 | AVDbackplanelocation: AVDlocation
68 | }
69 | }
70 | ]
71 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/2.Deployment Stacks/module-ag.bicep:
--------------------------------------------------------------------------------
1 | param AVDbackplanelocation string = 'westeurope'
2 | param appgroupName string = 'BICEP-P-AVD-HP-AG'
3 | param preferredAppGroupType string = 'Desktop'
4 | param hostPoolArmPath string
5 |
6 | resource ag 'Microsoft.DesktopVirtualization/applicationGroups@2024-04-03' = {
7 | name: appgroupName
8 | location: AVDbackplanelocation
9 | properties: {
10 | hostPoolArmPath: hostPoolArmPath
11 | applicationGroupType: preferredAppGroupType
12 | }
13 | }
14 |
15 | output agID string = ag.id
16 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/2.Deployment Stacks/module-hp.bicep:
--------------------------------------------------------------------------------
1 | param AVDbackplanelocation string = 'westeurope'
2 | param hostPoolType string = 'pooled'
3 | param loadBalancerType string = 'DepthFirst'
4 | param hostpoolName string = 'BICEP-P-AVD-HP'
5 | param preferredAppGroupType string = 'Desktop'
6 | param AVDHostPoolfriendlyname string = 'updated friendlyname'
7 | param enableValiatioMode bool = true
8 |
9 | //Create AVD Hostpool
10 | resource hpra 'Microsoft.DesktopVirtualization/hostpools@2024-04-03' = {
11 | name: hostpoolName
12 | location: AVDbackplanelocation
13 | properties: {
14 | hostPoolType: hostPoolType
15 | loadBalancerType: loadBalancerType
16 | preferredAppGroupType: preferredAppGroupType
17 | validationEnvironment: enableValiatioMode
18 | friendlyName: AVDHostPoolfriendlyname
19 | }
20 | }
21 |
22 | output hpid string = hpra.id
23 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/2.Deployment Stacks/module-ws.bicep:
--------------------------------------------------------------------------------
1 | param AVDbackplanelocation string = 'westeurope'
2 | param workspaceName string = 'BICEP-P-AVD-HP-WS'
3 | param applicationGroupID string
4 |
5 | resource ws 'Microsoft.DesktopVirtualization/workspaces@2024-04-03' = {
6 | name: workspaceName
7 | location: AVDbackplanelocation
8 | properties: {
9 | applicationGroupReferences: [
10 | applicationGroupID
11 | ]
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/2.Deployment Stacks/x_deploymentStack.bicep:
--------------------------------------------------------------------------------
1 | resource ds 'Microsoft.Resources/deploymentStacks@2024-03-01' = {
2 | name: 'myAVDStackDemo'
3 | properties: {
4 | denySettings: {
5 | mode: 'denyDelete'
6 | }
7 | actionOnUnmanage: {
8 | resources: 'detach'
9 | managementGroups: 'detach'
10 | resourceGroups: 'detach'
11 | }
12 | deploymentScope: 'WPN-2024-BICEP-STACK'
13 | templateLink: {
14 | relativePath: './1.Deployment Stacks/main.bicep'
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/3.Bicep Language innovations/a. User-Defined_Types-1.bicep:
--------------------------------------------------------------------------------
1 | @description('Array of AVD Host Pools')
2 | @minLength(1)
3 | param hostPoolsConfigEurope array = [
4 | {
5 | name: 'AVDHostPool1' // Name of the host pool
6 | location: 'westeurope' //For location use westeurope or northeurope only
7 | managementType: 'Standard' //For managementType use Standard or automated
8 | friendlyName: 'AVDHostPool1' //Friendly name of the host pool
9 | description: 'AVDHostPool1' //Description of the host pool
10 | hostPoolType: 'Pooled' //For hostPoolType use Pooled or Personal
11 | maxSessionLimit: 10 //Maximum session limit
12 | loadBalancerType: 'DepthFirst' //For loadBalancerType use DepthFirst or BreadthFirst
13 | validationEnvironment: false //Validation environment
14 | preferredAppGroupType: 'Desktop' //Use Desktop or RailApplications
15 | startVMOnConnect: true
16 | }
17 | ]
18 |
19 | resource demoHostPool 'Microsoft.DesktopVirtualization/hostPools@2024-04-08-preview' = [
20 | for hostPoolConfigEurope in hostPoolsConfigEurope: {
21 | name: hostPoolConfigEurope.name
22 | location: hostPoolConfigEurope.location
23 | properties: {
24 | managementType: hostPoolConfigEurope.managementType
25 | friendlyName: hostPoolConfigEurope.friendlyName
26 | description: hostPoolConfigEurope.description
27 | hostPoolType: hostPoolConfigEurope.hostPoolType
28 | maxSessionLimit: hostPoolConfigEurope.maxSessionLimit
29 | loadBalancerType: hostPoolConfigEurope.loadBalancerType
30 | validationEnvironment: hostPoolConfigEurope
31 | preferredAppGroupType: hostPoolConfigEurope.preferredAppGroupType
32 | startVMOnConnect: hostPoolConfigEurope.startVMOnConnect
33 | }
34 | }
35 | ]
36 |
37 |
38 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/3.Bicep Language innovations/a. User-Defined_Types-1.bicepparam:
--------------------------------------------------------------------------------
1 | using './a. User-Defined_Types-1.bicep'
2 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/3.Bicep Language innovations/a. User-Defined_Types-2.bicep:
--------------------------------------------------------------------------------
1 | param hostpoolconfigs hostPoolConfigEurope
2 |
3 | @export()
4 | @description('Configuration of AVD Host Pools in Europe')
5 | @metadata({
6 | name: 'Name of the host pool'
7 | location: 'For location use westeurope or northeurope'
8 | managementType: 'For managementType use Standard or automated'
9 | friendlyName: 'Friendly name of the host pool'
10 | descriptionHP: 'Description of the host pool'
11 | hostPoolType: 'For hostPoolType use Pooled or Personal'
12 | maxSessionLimit: 'Maximum session limit'
13 | loadBalancerType: 'For loadBalancerType use DepthFirst or BreadthFirst'
14 | validationEnvironment: 'Validation environment'
15 | preferredAppGroupType: 'Use Desktop or RailApplications'
16 | startVMOnConnect: 'Start VM on connect'
17 | }
18 | )
19 | type hostPoolConfigEurope = [
20 | {
21 | name: string
22 | location: 'westeurope' | 'northeurope'
23 | managementType: 'Standard' | 'automated'
24 | friendlyName: string
25 | descriptionHP: string
26 | hostPoolType: 'Pooled' | 'Personal'
27 | maxSessionLimit: int
28 | loadBalancerType: 'DepthFirst' | 'BreadthFirst'
29 | validationEnvironment: false
30 | preferredAppGroupType: 'Desktop' | 'RailApplications'
31 | startVMOnConnect: true
32 | }
33 | ]
34 |
35 | resource demoHostPool 'Microsoft.DesktopVirtualization/hostPools@2024-04-08-preview' = [
36 | for hostpoolconfig in hostpoolconfigs: {
37 | name: hostpoolconfig.name
38 | location: hostpoolconfig.location
39 | properties: {
40 | managementType: hostpoolconfig.managementType
41 | friendlyName: hostpoolconfig.friendlyName
42 | description: hostpoolconfig.descriptionHP
43 | hostPoolType: hostpoolconfig.hostPoolType
44 | maxSessionLimit: hostpoolconfig.maxSessionLimit
45 | loadBalancerType: hostpoolconfig.loadBalancerType
46 | validationEnvironment: hostpoolconfig.validationEnvironment
47 | preferredAppGroupType: hostpoolconfig.preferredAppGroupType
48 | startVMOnConnect: hostpoolconfig.startVMOnConnect
49 | }
50 | }
51 | ]
52 |
53 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/3.Bicep Language innovations/a. User-Defined_Types-2.bicepparam:
--------------------------------------------------------------------------------
1 | using 'a. User-Defined_Types-2.bicep'
2 | param hostpoolconfigs = [
3 | {
4 | name: 'AVDHostPool1'
5 | location: 'westeurope'
6 | descriptionHP: 'My first host pool'
7 | friendlyName: 'My first host pool'
8 | hostPoolType: 'Personal'
9 | loadBalancerType: 'BreadthFirst'
10 | managementType: 'automated'
11 | maxSessionLimit: 666
12 | preferredAppGroupType: 'RailApplications'
13 | startVMOnConnect: true
14 | validationEnvironment:false
15 | }
16 | ]
17 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/3.Bicep Language innovations/a. User-Defined_Types-3.bicep:
--------------------------------------------------------------------------------
1 | import * as myImports from 'a. User-Defined_Types-2.bicep'
2 |
3 | param hostpoolconfigs myImports.hostPoolConfigEurope = [
4 | {
5 | name: 'AVDHostPool1'
6 | location: 'westeurope'
7 | descriptionHP: 'My first host pool'
8 | friendlyName: 'My first host pool'
9 | hostPoolType: 'Pooled'
10 | loadBalancerType: 'DepthFirst'
11 | managementType: 'automated'
12 | maxSessionLimit: 666
13 | preferredAppGroupType: 'RailApplications'
14 | startVMOnConnect: true
15 | validationEnvironment: false
16 | }
17 | ]
18 |
19 | resource demoHostPool 'Microsoft.DesktopVirtualization/hostPools@2024-04-08-preview' = [
20 | for hostpoolconfig in hostpoolconfigs: {
21 | name: hostpoolconfig.name
22 | location: hostpoolconfig.location
23 | properties: {
24 | managementType: hostpoolconfig.managementType
25 | friendlyName: hostpoolconfig.friendlyName
26 | description: hostpoolconfig.descriptionHP
27 | hostPoolType: hostpoolconfig.hostPoolType
28 | maxSessionLimit: hostpoolconfig.maxSessionLimit
29 | loadBalancerType: hostpoolconfig.loadBalancerType
30 | validationEnvironment: hostpoolconfig.validationEnvironment
31 | preferredAppGroupType: hostpoolconfig.preferredAppGroupType
32 | startVMOnConnect: hostpoolconfig.startVMOnConnect
33 | }
34 | }
35 | ]
36 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/3.Bicep Language innovations/b. User-Defined-Functions.bicep:
--------------------------------------------------------------------------------
1 | param personName string
2 | param FavoriteConference string
3 |
4 | //example of Bicep (ARM) Functions
5 | var dummy1 = length('test')
6 | var dummy2 = first('value')
7 | param dummy3 string = utcNow('d')
8 |
9 | //Example of User Defined Function
10 | @description('This super advanced functions outputs a persons favorite conference')
11 | @export()
12 | func personNameAndFavoriteConference(names string, conference string) string => 'We are ${names} and our favorite conference is ${conference}!'
13 |
14 | output result string = personNameAndFavoriteConference(personName, FavoriteConference)
15 |
16 | // limitations:
17 | // The function can't access variables.
18 | // The function can only use parameters that are defined in the function.
19 | // The function can't use the reference function or any of the list functions.
20 | // Parameters for the function can't have default values.
21 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/3.Bicep Language innovations/b. User-Defined-Functions.main.bicep:
--------------------------------------------------------------------------------
1 | param personName string
2 | param FavoriteConference string
3 |
4 | //Reusing a UDF by placing it in a module
5 | module udf 'b. User-Defined-Functions.bicep' = {
6 | name: 'udf'
7 | params: {
8 | FavoriteConference: FavoriteConference
9 | personName: personName
10 | }
11 | }
12 | output result1 string = udf.outputs.result
13 |
14 | //Reusing a UDF by importing
15 | import * as myImports from 'b. User-Defined-Functions.bicep'
16 | output result2 string = myImports.personNameAndFavoriteConference(personName,FavoriteConference)
17 |
18 |
19 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/3.Bicep Language innovations/b. User-Defined-Functions.parameters.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
3 | "contentVersion": "1.0.0.0",
4 | "parameters": {
5 | "personName": {
6 | "value": "Freek and Esther"
7 | },
8 | "FavoriteConference": {
9 | "value": "Workplace Ninja Summit"
10 | }
11 | }
12 | }
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/4.Graph API/Graph-examples.bicep:
--------------------------------------------------------------------------------
1 | targetScope = 'subscription'
2 |
3 | //provider microsoftGraph
4 | extension microsoftGraph
5 |
6 | //Dynamic types
7 | //extension microsoftGraphV10
8 |
9 | param appRegistrationName string = 'WPN24'
10 | param members array = [
11 | '0a7895e3-bc3b-47d9-a120-7ef4222cba6c'
12 | '56237416-4c32-49ef-9811-4ada3c6c2e94'
13 | ]
14 | param resourceGroupNameInfra string
15 | param location string = 'west europe'
16 |
17 | var contributorRoleDefinitionID = 'b24988ac-6180-42a0-ab88-20f7382dd24c'
18 |
19 |
20 | //Graph API to create Group and assign members
21 | @description('Example using Microsoft Graph API to create a group and asisgn members to it')
22 | resource group 'Microsoft.Graph/groups@v1.0' = {
23 | uniqueName: 'WPN-Members'
24 | displayName: 'contributor Group WPN'
25 | mailEnabled: false
26 | mailNickname: 'WPNMembers'
27 | securityEnabled: true
28 | members: members
29 | }
30 | resource existingGroup 'Microsoft.Graph/groups@v1.0' existing = {uniqueName:'WPN-Members'}
31 | output group string = existingGroup.displayName
32 |
33 |
34 | //graph API to create app registration
35 | @description('Create a new app registration')
36 | resource appRegistration 'Microsoft.Graph/applications@v1.0' = {
37 | displayName: appRegistrationName
38 | uniqueName: appRegistrationName
39 | passwordCredentials: [
40 | {
41 | displayName: 'password'
42 | endDateTime: '2099-01-01T00:00:00Z'
43 | }
44 | ]
45 | }
46 |
47 | //graph API to create service principal
48 | @description('Create a new service principal')
49 | resource resourceSp 'Microsoft.Graph/servicePrincipals@v1.0' = {
50 | appId: appRegistration.appId
51 | }
52 |
53 | //Create a new resource group
54 | @description('Create a new resource group')
55 | resource rginfra 'Microsoft.Resources/resourceGroups@2023-07-01' = {
56 | name: resourceGroupNameInfra
57 | location: location
58 | }
59 |
60 | //Assign the service principal contributor permisions to the resource group
61 | @description('Assign the service principal contributor permisions to the resource group')
62 | module resourceGroupNameInfraPermission './Modules/module-resourceGroupPermissions.bicep' = {
63 | scope: rginfra
64 | name: 'resourceGroupNameInfraPermission'
65 | params: {
66 | principalId: resourceSp.id
67 | contributorRoleDefinitionID: contributorRoleDefinitionID
68 | appRegistrationName: appRegistrationName
69 | }
70 | dependsOn: [
71 | sleep
72 | ]
73 | }
74 |
75 | @description('Ensure the sevice principal is created before proceeding')
76 | module sleep './Modules/module-sleep.bicep' = {
77 | scope: rginfra
78 | name: 'sleep'
79 | params: {
80 | sleepTime: 30
81 | }
82 | dependsOn: [
83 | appRegistration
84 | resourceSp
85 | ]
86 | }
87 |
--------------------------------------------------------------------------------
/2024/Workplace Ninja Summit 2024/source code/Wednesday/4.Graph API/temp.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/2025/2025 - 03 - Supercharge Azure Infrastructure as Code with VS Code and GitHub Copilot - Warsaw.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2025/2025 - 03 - Supercharge Azure Infrastructure as Code with VS Code and GitHub Copilot - Warsaw.pdf
--------------------------------------------------------------------------------
/2025/2025 - 03 - Supercharge Azure Infrastructure as Code with VS Code and GitHub Copilot.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2025/2025 - 03 - Supercharge Azure Infrastructure as Code with VS Code and GitHub Copilot.pdf
--------------------------------------------------------------------------------
/2025/2025 - 05 - Azure Marketplace Where Dreams (and Debugging Nightmares) Come True.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2025/2025 - 05 - Azure Marketplace Where Dreams (and Debugging Nightmares) Come True.pdf
--------------------------------------------------------------------------------
/2025/2025 - 05 - Optimize Your Infrastructure as Code with Bicep Modules - Build Once and Deploy Anywhere.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2025/2025 - 05 - Optimize Your Infrastructure as Code with Bicep Modules - Build Once and Deploy Anywhere.pdf
--------------------------------------------------------------------------------
/2025/2025 - 09 - From Friction to Function What We Learned Growing AVD and Bicep.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2025/2025 - 09 - From Friction to Function What We Learned Growing AVD and Bicep.pdf
--------------------------------------------------------------------------------
/2025/2025 - 09 - Innovate, collaborate, and empower your AVD and W365 deployments with Bicep.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2025/2025 - 09 - Innovate, collaborate, and empower your AVD and W365 deployments with Bicep.pdf
--------------------------------------------------------------------------------
/2025/2025 - 10 - Practical Ways to Improve Your Azure Deployments with Bicep.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/2025/2025 - 10 - Practical Ways to Improve Your Azure Deployments with Bicep.pdf
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Freek Berson
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Slide decks and video recordings of my speaking engagements
2 |
3 | This repository contains a subset of the slide decks I used while presenting 🎥 (and co-presenting with community friends) at various in-person around the world 🌎, online conferences, user groups and webinars. Topics discussed in these sessions are Azure Virtual Desktop (AVD), Remote Desktop Services (RDS), Bicep and ARM Templates and much more!
4 | Feel free to reach out if you have questions in regards to these topics. Happy to connect!
5 |
6 |
7 |
8 |
9 |
10 |
11 | ## List of speaking engagements
12 |
13 | 📅 2025
14 | - Azure User Group Iceland, Online (coming soon!)
15 | - Global Azure & AI Community Day, Dublin [💾 Slides Session]
16 | - Workplace Ninja Summit, Switzerland [💾 Slides Session 1]
17 | - Workplace Ninja Summit, Switzerland [💾 Slides Session 2]
18 | - Microsoft Build, Seattle [🎥 On Demand] [💾 Slides Session]
19 | - Experts 2 Experts Virtualization Conference, Amsterdam [💾 Slides Session]
20 | - Warsaw IT Days, online [💾 Slides Session]
22 | - Azure User Group Iceland, online (coming up!)
23 | - Experts Live 2024, Copenhagen [💾 Slides Session]
24 |
25 |
26 | 📅 2024
27 | - End User Computing User Group, Sweden [💾 Slides Session]
28 | - Microsoft Ignite, Chicago [💾 Slides Session]
29 | - NIC Empower conference, Oslo [💾 Slides Session]
30 | - Experts 2 Experts Virtualization Conference, Barcelona [💾 Slides Session]
31 | - Workplace Ninja Summit, Switzerland [💾 Slides Session 1]
32 | - Workplace Ninja Summit, Switzerland [💾 Slides Session 2]
33 | - MC2MC, Antwerp [💾 Slides]
34 | - Microsoft Build, Seattle [💾 Slides]
35 | - Warsaw IT Days, online [💾 Slides] [🎥 On Demand]
36 | - Cloud 8 Virtual Summit, online [💾 Slides] [🎥 On Demand]
37 |
38 | 📅 2023
39 | - International Association of Microsoft Channel Partners. (IAMCP) [💾 Slides]
40 | - Workplace Ninja Summit, Switzerland [💾 Slides Session 1]
41 | - Workplace Ninja Summit, Switzerland [💾 Slides Session 2]
42 | - Azure Greg live stream, Online [🎥 On Demand] [💾 Slides]
43 | - Cloud Community Nights event, Netherlands [💾 Slides]
44 | - Azure User Group Sweden, Online [🎥 On Demand] [💾 Slides]
45 |
46 | 📅 2022
47 | - Experts Live 2022 [💾 Slides Part I]
48 | - Experts Live 2022 [💾 Slides Part II]
49 | - Streaming Clouds, Online [🎥 On Demand] [💾 Slides]
50 | - Scottish Summit 2022, Glasgow [💾 Slides]
51 | - MC2MC Community event, Online [🎥 On Demand] [💾 Slides]
52 | - Azure User Group Iceland, Online [💾 Slides]
53 |
54 | 📅 2021
55 | - Tech Festive Calendar 2021, Online [🎥 On Demand] [💾 Slides]
56 | - Liquit & AVD webinar, online [🎥 On Demand] [💾 Slides]
58 | - AVD TechFest Winter edition 2021, online [💾 Slides]
59 | - Cloud Camp 2021, Online [💾 Slides]
60 | - Cloud Summit 2021, Online [💾 Slides]
61 | - Workplace Ninja Virtual Edition 2021, Online [💾 Slides session 1] 💾 Slides session 2]
62 | - Azure User Group Norway, Online [🎥 On Demand]
63 | - US Azure Virtual Desktop User Group, Online [🎥 On Demand] [💾 Slides]
64 | - Azure meetup Oslo, Online [🎥 On Demand]
65 | - Cloud Eight Virtual Summit, Online [💾 Slides]
66 | - Belgium WVD User Group
67 | - TechNine event, Online [💾 Slides]
68 | - Detron kennisavond, Online [💾 Slides]
69 | - Microsoft meets Community: WVD 4th!, Online [🎥 On Demand] [💾 Slides]
70 | - Dutch DevOps & Github community, Online [💾 Slides]
71 | - WVD Tech Fest, Online [🎥 On Demand] [💾 Slides]
72 | - Wortell LiveStream, Online [🎥 On Demand]
73 | - Nordic Virtual Summit on WVD, Online [💾 Slides]
74 | - Azure Thursday february, Online [🎥 On Demand] [💾 Slides]
75 | - Azure LowLands, Online [🎥 On Demand] [💾 Slides]
76 |
77 | 📅 2020
78 | - Azure Immersion Workshop WVD, Online [🎥 Promo video]
79 | - Cloud 8 Virtual Summit, Online [💾 Slides]
80 | - BEEMUG event, Online [💾 Slides]
81 | - Wortell WVD Live, Online [🎥 On Demand]
82 | - Iceland Azure Community, Online [🎥 On Demand] [💾 Slides]
83 | - Desktop in the Cloud, Online [🎥 On Demand]
84 | - Workplace Ninja Summit 2020, Online [💾 Slides]
85 | - Microsoft Azure Webinar week, Online
86 | - Microsoft meets community : Windows Virtual Desktop, Online [🎥 On Demand] [💾 Slides]
87 | - Microsoft Ignite The Tour, Prague [💾 Slides]
88 |
89 | 📅 2019
90 | - Azure User Group, Reykjavik [💾 Slides]
91 | - Azure Thursdays, Amsterdam [💾 Slides]
92 | - Azure Saturday, Munich [💾 Slides]
93 | - Microsoft Ignite | The Tour, Stockholm [💾 Slides]
94 | - Microsoft Ignite | The Tour, Johannesburg [💾 Slides]
95 |
96 | 📅 2018
97 | - Microsoft Ignite | The Tour, Berlin [💾 Slides]
98 | - Microsoft, Munich
99 | - Cloud Camp, Dublin [💾 Slides]
100 | - Microsoft Ignite, Orlando [💾 Slides]
101 | - Azure Saturday, Munich [💾 Slides]
102 | - Microsoft TechDays, Helsinki [💾 Slides]
103 | - Microsoft TechSummit, Birmingham [💾 Slides]
104 |
105 | 📅 2017
106 | - Microsoft Ignite, Orlando [💾 Slides]
107 | - Experts 2 Experts Virtualization Conference, Barcelona [🎥 On Demand] [💾 Slides]
108 | - Experts 2 Experts Virtualization Conference, Orlando [🎥 On Demand] [💾 Slides]
109 |
110 | 📅 2016
111 | - Experts 2 Experts Virtualization Conference, Dublin
112 | - Bri-Forum, London
113 |
114 | 📅 2015
115 | - Bri-Forum, London
116 |
117 |
118 |
119 | 📅 2014
120 | - Experts 2 Experts Virtualization Conference, Brussels
121 | - Dutch Citrix User Group, Amsterdam
122 |
--------------------------------------------------------------------------------
/fb-intro-photo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/fb-intro-photo.jpg
--------------------------------------------------------------------------------
/freekberson.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/freekberson.jpg
--------------------------------------------------------------------------------
/header.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fberson/Slidedecks/220215cc5c9bf74a00aaa2f3eaf37a91a275497d/header.jpg
--------------------------------------------------------------------------------