BeyondTrust/POV

← Back to dashboard

Shared cloud infrastructure for the runners

Audience: operator · Profile: both · Read this when: you are giving the runners somewhere to run — a cluster, a registry, a subnet.

Part of Remote Worker. The cluster, registry and network each runner backend needs, and the per-cloud prerequisites.

Shared cloud infrastructure

The Ansible runner, the Kubernetes runner, and the image-promote runner all reuse the same per-cloud cluster / subnet / SG / role / ACR / VPC settings. Set them once and all three pick them up. Each runner reads the shared ansible_* (and Azure/GCP) keys directly, with the promote runner adding its own optional promote_runner_* overrides on top.

What each runner reads

Cloud Ansible runner reads Kubernetes runner reads Image-promote runner reads
AWS / ECS ansible_ecs_cluster, ansible_ecs_task_family, ansible_ecs_image, ansible_ecs_cpu, ansible_ecs_memory, ansible_ecs_subnet_id, ansible_ecs_security_group_ids, ansible_ecs_execution_role_arn, aws_region ansible_ecs_cluster, ansible_ecs_cpu, ansible_ecs_memory, ansible_ecs_subnet_id, ansible_ecs_security_group_ids, ansible_ecs_execution_role_arn, aws_region (own task family k8s-runner, own image k8s_runner_image) promote_runner_ecs_* → falls back to ansible_ecs_*
Azure / ACI azure_resource_group, azure_location, ansible_aci_subnet_id, ansible_aci_image, ansible_aci_acr_server/username/password azure_resource_group, azure_location, ansible_aci_subnet_id, ansible_aci_acr_server/username/password (own image k8s_runner_image) promote_runner_azure_* → falls back to azure_resource_group / azure_location
GCP / Cloud Run gcp_project_id, gcp_ansible_cloud_run_region (→ gcp_region), gcp_ansible_image, gcp_ansible_vpc_connector gcp_project_id, gcp_region (→ gcp_ansible_cloud_run_region), gcp_ansible_vpc_connector (own image k8s_runner_image) promote_runner_gcp_* → falls back to gcp_region / storage_gcs_*

Fallback chains

The takeaway: configure the ECS cluster + subnet + SG + role once (or the ACI subnet + ACR, or the GCP region + VPC connector once), and the Ansible runner, the Kubernetes runner, and image-promote all use it. The promote_runner_* keys exist only for installs that want the promote task on different infra than config-mgmt — most single-tenant installs leave them blank. See runners/promote/README.md for the full promote-runner key list.


Per-cloud prerequisites

Only needed for the cloud backends (ecs / aci / gcp). The local backends need nothing beyond the Docker socket (Ansible) or in-container kubectl/helm (Kubernetes).

AWS (ECS Fargate)

Azure (ACI)

GCP (Cloud Run Jobs)

Role Purpose
roles/run.admin Create, execute, and delete Cloud Run Jobs
roles/logging.viewer Retrieve job output from Cloud Logging
roles/iam.serviceAccountUser Act as a service account when submitting jobs

Troubleshooting

Ansible — cloud runners

ECS task fails to start — check CloudWatch logs for the task family ansible-config-mgmt. Common causes: missing execution role, ECR pull error, or subnet routing to the target.

GCP: "Permission denied" creating Cloud Run Job — add roles/run.admin and roles/iam.serviceAccountUser to the service account.

GCP: logs empty after successful job — add roles/logging.viewer:

gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="serviceAccount:SA_EMAIL" \
  --role="roles/logging.viewer"

GCP: Cloud Run job can't reach target host (play fails UNREACHABLE, "ssh: connect to host … port 22: Operation timed out", container exit code 4) — give the runner VPC reach: set gcp_run_network + gcp_run_subnetwork for direct VPC egress (preferred, no standing infra), or gcp_ansible_vpc_connector for a Serverless VPC Access connector — matching the Cloud Run region to the target's region. Also confirm a firewall rule permits tcp:22 from the runner's subnet range to the VM.

Azure: ACI runner UNREACHABLE / ssh: connect to host <ip> port 22: Operation timed out — the ACI container has no route to the target VM's private IP. Set ansible_aci_subnet_id to a VNet-delegated subnet with line-of-sight to the target subnet; when unset it now falls back to the gateway's azure_aci_subnet_id. With no subnet the container group is public and cannot reach private targets. (A working PRA Shell Jump to the same VM confirms the gateway's subnet reaches it — reuse that subnet.)