Hundreds of Hours of FREE Azure Learning Resources

There are hundreds of hours of free learning resources for learning Microsoft cloud technologies ranging from DevOps to hybrid cloud, to Office 365 and cybersecurity. A few of the most recent offerings are listed here.

Kusto Query Language (KQL) from Scratch. KQL is the language of Azure Log Analytics, which is ubiquitous across the Microsoft cloud. This 4-hour course is a great place to get some hands-on practice.

Microsoft Learn. Microsoft Learn is the property replacing Microsoft Virtual Academy as a go-to place for learning Microsoft technologies free of charge.

Microsoft Hands-On Labs. Here, you’ll find more than 140 hands-on labs on Microsoft cloud services and hybrid cloud. To get to the content most relevant to you, you can sort the list by job role and topic.

Azure DevOps Hands-On Labs. There are more than a dozen hands-on labs with push-button automation to pre-populate your Azure environment.

Create NEW VM on EXISTING Subnet with Azure CLI

A common mistake I see with sysadmins trying to create new VMs on existing subnets from the Azure CLI. One would think that specifying the existing VNET name and subnet name, as shown below, would do the job.

az vm create -n MyVm /
-g MyResourceGroup /
--image debian /
--vnet-name MyVnet /
--subnet subnet1

While it seems logical this should work, it actually results in a new VNET and subnet being created along with the new VM! Unfortunately, the Azure CLI documentation does not make this clear enough for many new users.

How to get it done

If you want to attach a VM to an existing subnet, you need to pass the subnet ID to the –subnet parameter. Begin by retrieving the ID of the existing subnet and assign to a variable.

In this sample, the subnet is named ‘default’, and represented by the –name parameter, and SUBNETID is the name of the variable.

export SUBNETID=$(az network vnet subnet show /
--resource-group 'MyRG' --name default /
--vnet-name 'Existing-VNET' --query id -o tsv)

Then, when you create the VM, you’ll notice that for the –subnet parameter, we specify the variable that holds the subnet ID (line 5 below). The VNET is not mentioned, as it’s contained within the subnet ID.

az vm create /
--resource-group "$RES_GRP" /
--name "$SVR_NAME" /
--image "$SKU" /
--subnet "$SUBNETID" /
--data-disk-sizes-gb 10 10 /
--public-ip-address-dns-name "$SVR_NAME" /
--admin-username "$ADMIN_USER" /
--admin-password "$ADMIN_PW"

I hope this helps. You can find Azure CLI documentation, including syntax and examples at

Minikube on Ubuntu: Step-by-Step

With Kubernetes now the de facto standard for container orchestration, there is no time like the present to get started. Minikube provides the perfect single-node Kubernetes cluster for your development environment where you can begin exploring.

If you read my previous post, “Install & configure Minikube on Windows 10”, it may have occurred to you that Docker and Kubernetes have been native to Linux since inception, and that perhaps it makes sense to try that route. Below is a link to my notes for Minikube on Ubuntu 18.04.

As I found most tutorials lacked left a few interesting details, like lighting up the Grafana dashboard, and starting minikube with verbose logging, just to name a couple, I have included in this tutorial on my Git repo.

Find it at “Install & configure Minikube on Ubuntu”.

And while you are there, find my command cheat sheet,  Minikube Command Cheat Sheet“.

WORKAROUND: Git clone on Windows fails with ‘index-pack failed’ error

I tried checking out a feature branch of a Git repo from the command line on Windows, and received the following error:

fatal: early EOF
fatal: index-pack failed

Absolutely no real info here to help me identify the source problem.

The Fix

To get to the source of the issue, I launched the Git daemon in verbose mode.

 "C:\Program Files\Git\bin\sh.exe" --login -I -c 'git.exe daemon --verbose 

Then, I re-attempt the Git clone of my feature branch

git clone --branch myfeature 'https://MyGitRepoUrl' 

…and I received a a prompt from Windows that the Windows Firewall has blocked some features of this app with a prompt to allow the ports


What it creates is this new allow rule on Windows Firewall for Git for Windows as shown below



Minikube + Kubectl Command Cheat Sheet

To accompany my previous tutorial “Minikube on Windows 10″ Step-by-Step“, I have a cheat sheet I update periodically with useful minikube and kubectl commands to help folks get productive in their development environments quickly. Find my cheat sheet on Github at Minikube Command Cheat Sheet“.

Feel free to fork it and add your own or update and send me a PR.

Minikube on Windows 10: Step-by-Step

If you have been thinking about getting started with Kubernetes in 2019, minikube is a great first step. Minikube provides the perfect single-node cluster development environment where you can begin exploring.

As I found most tutorials lacked left a few interesting details, like lighting up the Grafana dashboard, and starting minikube with verbose logging, just to name a couple, I have included in this tutorial on my Git repo.

Find it at “Install & configure Minikube on Windows 10”.

While you are there, also find my cheat sheet on Github at MinikubeCommand Cheat Sheet“.

Convert Azure AD B2B Users from Guest to Member: How and Why

The primary difference between a Guest and a Member user lies in their lookup rights in the Azure AD domain. There are some important differences between UserType of Guest vs Member, specifically:

  • Member. A user expects to have access to internal-only sites. This user is not considered an external collaborator. This will be important when trying to exercise rights that come with privileged roles like Global Administrator.
  • Guest. indicates a user who isn’t considered internal to the company. This type of user will have restricted access and lookup rights in the directory.

Read more about this in “Understand the B2B user”.

To convert a user from UserType Guest to Member

Install the Azure AD PowerShell module

Install-Module AzureAD

Authenticate to your Azure AD tenant


Search for your user by upn (just to be sure).

Get-AzureADUser -SearchString

Now, pass the output to Set-AzureADUser, setting UserType to member

Get-AzureADUser -SearchString | Set-AzureADUser -UserType member

Repeat the Get-AzureADUser search to confirm the output shows Usertype = Member

Get-AzureADUser -SearchString

This would be a handy feature in the UI for sure. There is an actually a request on User Voice for this feature. Vote it up if you agree: Update UserType from portal.

Azure CLI ‘az login’ returns ‘Permission denied’

I recently encountered a fresh install of the Azure CLI on Ubuntu 18.04 LTS that failed at ‘az login’ step with the following error:

[Errno 13] Permission denied: ‘/home/pzerger/.azure/config

When I looked at permissions on the directory with the command below, I saw that my account simply lacked write and execute permisions.

ls -la /home/pzerger/.azure/

The Fix

To resolve the issue, I simply ran chmod to grant my account permissions, as shown below.

sudo chmod -R 777 /home/pzerger/.azure/config
sudo chmod -R 777 /home/pzerger/.azure

As soon as I did this ‘az login’ worked as designed.

Ubuntu 18.04 returns “not found” for Azure CLI install via apt

A quick note for anyone else who encounters this issue…

Recently I tried to install the Azure CLI via apt following the steps in “Install Azure CLI with apt”, I received the error “source not found”, even after modifying my sources list as described in the article.

When I enumerated the sources.list on my Ubuntu 18.04 LTS build, I felt like the list was a little shorter than it should be.

cat /etc/apt/sources.list

Frustrating, to say the least. This was my Ubuntu 18.04 LTS from Canonical, created via the new ‘”Quick Create” experience on Windows 10.

The Fix

After reading the issues others had with this in Github comment threads with no fix, I quickly decided to go back to basics.

To resolve the issue, I tried replacing my sources.list file from a known good source of the default sources.list file, as shown below.

Backup the original /etc/apt/sources.list

sudo mv /etc/apt/sources.list /etc/apt/sources.list.backup

Download my updated /etc/apt/sources.list

cd /etc/apt/
sudo wget">

Problem solved.

New Linux VM experience via “Quick Create” on Windows 10

I’ve never been a fan of the Windows subsystem for Linux, largely because it brings limitations and unpredictability to my Linux experience, leaving me frustrated. I prefer a full Linux VM, and a recent build of Windows 10 brings this Quick Create experience in Hyper-V for Ubuntu 18.04. (I believe this showed up in October, but I am on Windows 10 build 182298). What I like most about this build is that Xrdp is pre-installed, so you can remote into the VM and get a full screen and multi-monitor Linux experience (read below) right out of the gate.

To create your Ubuntu VM…

In Hyper-V Manage, right click your VM name and select Quick Create.


The Create Virtual Machine wizard then downloads the Ubuntu 18.04 LTS image (~1.5GB).


Once downloaded, you’ll walk through an abbreviated configuration wizard. When the wizard asks you if you’d like to login automatically, select No. Auto-login breaks remote access via Xrdp.

To access the VM…

You can right click in Hyper-V Manager, and specify full screen. If you select “Use all of my monitors” as shown below, the display automatically extends to your 2-N monitors!


Login with your username and password, leaving session value at the default of ‘Xorg’.


That’s all there is to it. Get the latest build of Windows 10 and give it a try!