This contains a Bicep template that will deploy a VMSS suitable for an Azure Devops agent.
It is currently configured for use with Terraform but can easily be customised using the cloud-init.yml
.
The resulting ARM JSON file is over 700 lines long, this shows how much easier Bicep is to work with!
- Virtual network
- NSG blocking all inbound connections
- VM Scale Set
- Managed identity enabled
- Cloud-init used to install tooling
- Randomly generated SSH public key used to prevent interactive logins
- Storage account for Terraform backend
- Azure AD RBAC assigned to VMSS identity
- Private endpoint and firewall preventing public access
- Key Vault for secrets storage
- Azure AD RBAC assigned to VMSS identity
- Private endpoint and firewall preventing public access
- Private DNS zones
- Zone for blob storage
- Zone for Key Vault
# Generate a random SSH public key, discarding the private key
ADMINSSHPUBKEY=$(scripts/generate-random-ssh-pubkey.sh)
# Destination subscription id
# (omit if you want to use the context of az account, remember to remove --subscription from the az command line)
SUBSCRIPTIONID=00000000-0000-0000-0000-000000000000
# Destination region
LOCATION=westeurope
# Resource naming
RESOURCEGROUPNAME=myrg
KEYVAULTNAME=mykv
STORAGEACCOUNTNAME=mystg
az deployment sub create \
--subscription $SUBSCRIPTIONID \
--location $LOCATION \
--template-file bicep/buildagent.bicep \
--parameters adminSshPubKey="$ADMINSSHPUBKEY" \
resourceGroupName=$RESOURCEGROUPNAME \
keyVaultName=$KEYVAULTNAME \
storageAccountName=$STORAGEACCOUNTNAME
Finally, complete the setup in Azure DevOps to add the VM extension
See the .azure-pipelines
directory for a sample pipeline to deploy this.