Skip to main content
Airship authenticates to Azure as a Microsoft Entra application with a client secret, and launches one virtual machine per job.

Check your policies first

Four things commonly block this setup.

Register the resource providers

A fresh subscription may have neither. Contributor registers them on first use, so this step matters only with the custom role below.

Register the application

That registers an application, creates its service principal, assigns it Contributor on the subscription, and prints the values Airship needs: In the portal, the same is Microsoft Entra ID → App registrations → New registration, then Certificates & secrets → New client secret, then Subscriptions → Access control (IAM) → Add role assignment → Contributor.
The secret expires. Entra client secrets have an end date, at most two years out. An expired secret fails every launch — Events shows Entra’s refusal and the Cloud page shows credentials rejected — until you reconnect with a new one. Put the date in your calendar.

A narrower role

Contributor is what the quick path grants. To replace it, the role must be assigned at the subscription, not a resource group: the inventory scan lists the subscription’s VMs (the only list carrying their power state), image lookups are subscription-level reads, and the airship-runners resource group is created on first use.
airship-role.json
If a launch fails with AuthorizationFailed, Azure’s message names the missing action and Events shows that message. Add it and relaunch.

Quotas to check

If a definition names a third-party marketplace image with a purchase plan, accept its terms once for the subscription. Canonical’s Ubuntu images, the default, need none.

Connect it

Open Cloud → Microsoft Azure, enter the subscription ID, tenant ID, client ID and client secret, and choose the default region — spelled as the API spells it (eastus, uksouth), not as the portal shows it. On submit, Airship signs in to Entra, reads the subscription (an application that cannot see it gets a 404, reported as bad credentials), refuses a disabled or deleted subscription, and checks the default region is one the subscription offers.

Azure settings

instance_type takes a VM size as the API spells it (Standard_D4s_v5). Sizes with a p in their feature letters (Standard_D2pls_v5, Standard_E4ps_v5) are arm64; everything else is x64. GPUs come from the size — the NC, ND, NV and NG families — and gpu: is a flag rather than a name. machine_image takes a marketplace URN, the same as a mapping, a managed image ID, or a compute gallery image ID:
airship.yaml
Azure’s default here is a public address per machine, because Airship’s subnet is private — as Azure makes new subnets by default. Turning the address off creates a shared NAT gateway with a static address of its own, which every later runner in that region reuses.

Verify and audit

After a job the VM is deleted along with its disk, interface and address. Orphaned interfaces and addresses from a failed launch are swept once they are older than fifteen minutes.
Two installations sharing one subscription share the airship-runners resource group, the per-region networks and security groups and the NAT gateways — only the machines are separated, by tag. A subscription per installation keeps a security group rule one organization adds from applying to another’s runners.

Turning it off

Deactivate a repository to stop it; uninstall the GitHub App to stop everything. Disconnecting is refused while runners launched with that secret are alive. Then delete the application, and by hand the airship-runners resource group with the networks and NAT gateways inside it. Launch failures and their Azure messages are in Troubleshooting.