Check your policies first
Four things commonly block this setup.Register the resource providers
Register the application
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.
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 theairship-runners
resource group is created on first use.
A custom role covering exactly the calls Airship makes
A custom role covering exactly the calls Airship makes
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
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 theairship-runners
resource group with the networks and NAT gateways inside it.
Launch failures and their Azure messages are in
Troubleshooting.