├── 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 --------------------------------------------------------------------------------