Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/ansible/awx/llms.txt

Use this file to discover all available pages before exploring further.

Overview

Workflow job templates chain multiple job templates, projects updates, and inventory updates together with conditional logic. They enable complex automation workflows with success/failure/always branching.

Endpoints

MethodEndpointDescription
GET/api/v2/workflow_job_templates/List workflow templates
POST/api/v2/workflow_job_templates/Create workflow template
GET/api/v2/workflow_job_templates/{id}/Retrieve workflow template
PATCH/api/v2/workflow_job_templates/{id}/Update workflow template
DELETE/api/v2/workflow_job_templates/{id}/Delete workflow template
POST/api/v2/workflow_job_templates/{id}/launch/Launch workflow
POST/api/v2/workflow_job_templates/{id}/copy/Copy workflow template

List Workflow Templates

curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Create Workflow Template

curl -X POST \
  https://awx.example.com/api/v2/workflow_job_templates/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Deploy Full Stack",
    "description": "Deploy database, backend, and frontend",
    "organization": 1,
    "extra_vars": "---\nenv: production",
    "allow_simultaneous": false,
    "survey_enabled": false,
    "ask_variables_on_launch": true,
    "ask_inventory_on_launch": false,
    "ask_limit_on_launch": false,
    "ask_labels_on_launch": false
  }'
name
string
required
Workflow template name
description
string
Workflow description
organization
integer
required
Organization ID
extra_vars
string
Workflow-level extra variables
allow_simultaneous
boolean
default:"false"
Allow multiple instances to run simultaneously
survey_enabled
boolean
default:"false"
Enable survey
ask_variables_on_launch
boolean
Prompt for variables at launch
ask_inventory_on_launch
boolean
Prompt for inventory at launch
ask_limit_on_launch
boolean
Prompt for limit at launch
ask_labels_on_launch
boolean
Prompt for labels at launch
webhook_service
string
Enable webhook: github or gitlab
webhook_credential
integer
Webhook credential ID

Retrieve Workflow Template

curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/5/ \
  -H "Authorization: Bearer YOUR_TOKEN"
Links to related resources:
  • organization - Parent organization
  • workflow_jobs - Execution history
  • workflow_nodes - Workflow node definitions
  • schedules - Execution schedules
  • launch - Launch endpoint
  • webhook_key - Webhook configuration
  • webhook_receiver - Webhook URL
  • activity_stream - Activity log
  • notification_templates_* - Notification templates
  • survey_spec - Survey specification
  • access_list - Access list
  • object_roles - Available roles
  • labels - Associated labels
  • copy - Copy endpoint

Workflow Nodes

List Workflow Nodes

curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/5/workflow_nodes/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Create Workflow Node

curl -X POST \
  https://awx.example.com/api/v2/workflow_job_templates/5/workflow_nodes/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "unified_job_template": 10,
    "identifier": "deploy_db"
  }'
unified_job_template
integer
required
ID of job template, project, or inventory source
identifier
string
required
Unique identifier for the node
extra_data
object
Node-level extra vars (overrides template vars)
inventory
integer
Node-level inventory override
limit
string
Node-level limit
job_type
string
Job type override: run or check
all_parents_must_converge
boolean
default:"false"
Whether all parent nodes must complete before this node runs

Associate Node Relationships

Create success/failure/always relationships:
# Success relationship
curl -X POST \
  https://awx.example.com/api/v2/workflow_job_template_nodes/100/success_nodes/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "id": 101
  }'

# Failure relationship
curl -X POST \
  https://awx.example.com/api/v2/workflow_job_template_nodes/100/failure_nodes/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "id": 102
  }'

# Always relationship  
curl -X POST \
  https://awx.example.com/api/v2/workflow_job_template_nodes/100/always_nodes/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "id": 103
  }'

Launch Workflow

curl -X POST \
  https://awx.example.com/api/v2/workflow_job_templates/5/launch/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "extra_vars": "deploy_version: v2.0",
    "limit": "production"
  }'
Returns a workflow_job object.

Survey Specification

# Get survey
curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/5/survey_spec/ \
  -H "Authorization: Bearer YOUR_TOKEN"

# Create/update survey
curl -X POST \
  https://awx.example.com/api/v2/workflow_job_templates/5/survey_spec/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Deployment Survey",
    "description": "Parameters for deployment",
    "spec": [
      {
        "question_name": "Environment",
        "required": true,
        "type": "multiplechoice",
        "variable": "environment",
        "choices": ["dev", "staging", "production"]
      }
    ]
  }'

Workflow Jobs

curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/5/workflow_jobs/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Schedules

curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/5/schedules/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Labels

curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/5/labels/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Notifications

curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/5/notification_templates_started/ \
  -H "Authorization: Bearer YOUR_TOKEN"

curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/5/notification_templates_success/ \
  -H "Authorization: Bearer YOUR_TOKEN"

curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/5/notification_templates_error/ \
  -H "Authorization: Bearer YOUR_TOKEN"

curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/5/notification_templates_approvals/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Object Roles

curl -X GET \
  https://awx.example.com/api/v2/workflow_job_templates/5/object_roles/ \
  -H "Authorization: Bearer YOUR_TOKEN"
Available roles:
  • admin_role - Full workflow administration
  • execute_role - Launch workflows
  • read_role - View workflow details

Copy Workflow

curl -X POST \
  https://awx.example.com/api/v2/workflow_job_templates/5/copy/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Deploy Full Stack Copy"
  }'

Complete Example

import requests
import json

base_url = "https://awx.example.com/api/v2"
token = "YOUR_TOKEN"
headers = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json"
}

# Create workflow template
workflow_data = {
    "name": "Full Stack Deploy",
    "description": "Deploy all components",
    "organization": 1
}

response = requests.post(
    f"{base_url}/workflow_job_templates/",
    headers=headers,
    data=json.dumps(workflow_data)
)

workflow = response.json()
workflow_id = workflow['id']

# Create nodes
nodes = [
    {"unified_job_template": 10, "identifier": "deploy_db"},
    {"unified_job_template": 11, "identifier": "deploy_backend"},
    {"unified_job_template": 12, "identifier": "deploy_frontend"},
    {"unified_job_template": 13, "identifier": "rollback"}
]

node_ids = {}
for node_data in nodes:
    node_response = requests.post(
        f"{base_url}/workflow_job_templates/{workflow_id}/workflow_nodes/",
        headers=headers,
        data=json.dumps(node_data)
    )
    node = node_response.json()
    node_ids[node['identifier']] = node['id']

# Create relationships
# DB -> Backend (on success)
requests.post(
    f"{base_url}/workflow_job_template_nodes/{node_ids['deploy_db']}/success_nodes/",
    headers=headers,
    data=json.dumps({"id": node_ids['deploy_backend']})
)

# Backend -> Frontend (on success)
requests.post(
    f"{base_url}/workflow_job_template_nodes/{node_ids['deploy_backend']}/success_nodes/",
    headers=headers,
    data=json.dumps({"id": node_ids['deploy_frontend']})
)

# Any failure -> Rollback
for node_name in ['deploy_db', 'deploy_backend', 'deploy_frontend']:
    requests.post(
        f"{base_url}/workflow_job_template_nodes/{node_ids[node_name]}/failure_nodes/",
        headers=headers,
        data=json.dumps({"id": node_ids['rollback']})
    )

print(f"Workflow created: {workflow_id}")

# Launch workflow
launch_response = requests.post(
    f"{base_url}/workflow_job_templates/{workflow_id}/launch/",
    headers=headers
)

workflow_job = launch_response.json()
print(f"Launched workflow job: {workflow_job['id']}")