Skip to main content
AWX allows you to schedule jobs to run automatically at specific times or intervals using recurrence rules (RRULE) based on RFC5545.

Understanding Schedules

Schedules in AWX:
  • Use RRULE (Recurrence Rule) format from RFC5545
  • Support complex patterns (daily, weekly, monthly, etc.)
  • Can be attached to multiple resource types
  • Respect timezone specifications
  • Support both one-time and recurring execution

Schedulable Resources

Job Templates

Schedule playbook execution

Project Updates

Schedule SCM syncs

Inventory Sources

Schedule inventory synchronization

Workflow Templates

Schedule workflow execution

RRULE Format

Schedules use DTSTART (start date/time) and RRULE (recurrence rule):
DTSTART:20260115T120000Z RRULE:FREQ=DAILY;INTERVAL=1;COUNT=7

RRULE Components

  • DTSTART: Start date and time (required)
  • FREQ: Frequency (MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY)
  • INTERVAL: Interval between occurrences
  • COUNT: Number of occurrences (optional)
  • UNTIL: End date/time (optional)
  • BYDAY: Days of week (MO, TU, WE, TH, FR, SA, SU)
  • BYMONTH: Months (1-12)
  • BYMONTHDAY: Days of month (1-31)
  • BYHOUR: Hours (0-23)
  • BYMINUTE: Minutes (0-59)

Creating Schedules

Simple Daily Schedule

  1. Navigate to your job template/project/inventory source
  2. Click the Schedules tab
  3. Click Add
  4. Configure:
    • Name: Schedule name
    • Start Date/Time: When to start
    • Timezone: Local timezone
    • Frequency: Daily, Weekly, etc.
    • Interval: Every N days/weeks
  5. Click Save

Common Schedule Examples

Every Day at 2 AM UTC

rrule: "DTSTART:20260115T020000Z RRULE:FREQ=DAILY;INTERVAL=1"

Every Weekday at 6 PM

rrule: "DTSTART;TZID=America/New_York:20260115T180000 RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR"

Every Week on Monday at 8 AM

rrule: "DTSTART:20260119T080000Z RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO"

Every 2 Weeks on Monday and Thursday

rrule: "DTSTART:20260115T090000Z RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,TH"

Every Month on the 1st at Midnight

rrule: "DTSTART:20260101T000000Z RRULE:FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=1"

Every 3 Months on the 15th

rrule: "DTSTART:20260115T120000Z RRULE:FREQ=MONTHLY;INTERVAL=3;BYMONTHDAY=15"

Last Saturday of Every Month

rrule: "DTSTART:20260125T100000Z RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=SA;BYMONTHDAY=25,26,27,28,29,30,31;BYSETPOS=-1"
Or simpler:
rrule: "DTSTART:20260131T100000Z RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=SA;BYMONTHDAY=12,13,14,15,16,17,18"

Every 15 Minutes

rrule: "DTSTART:20260115T000000Z RRULE:FREQ=MINUTELY;INTERVAL=15"

Every Hour During Business Hours (9 AM - 5 PM)

rrule: "DTSTART;TZID=America/New_York:20260115T090000 RRULE:FREQ=HOURLY;INTERVAL=1;BYHOUR=9,10,11,12,13,14,15,16,17"

First Monday of Every Month

rrule: "DTSTART:20260105T090000Z RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=MO;BYMONTHDAY=1,2,3,4,5,6,7"

Advanced Scheduling

Limited Occurrence Count

Run 10 times then stop:
rrule: "DTSTART:20260115T120000Z RRULE:FREQ=DAILY;INTERVAL=1;COUNT=10"

With End Date (UNTIL)

Run until a specific date:
rrule: "DTSTART:20260115T120000Z RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20260215T120000Z"
When using UNTIL, the datetime must be in UTC (Z suffix) regardless of the DTSTART timezone.

Exclusion Rules (EXRULE)

EXRULE is deprecated in RFC5545 and not fully supported in AWX. Use alternative scheduling approaches.
For exclusions, create multiple schedules or use external orchestration.

Timezone Handling

UTC Timezone

Use the Z suffix for UTC times:
DTSTART:20260115T120000Z

Local Timezone

Use TZID parameter:
DTSTART;TZID=America/New_York:20260115T120000

Available Timezones

Get list of valid timezone identifiers:
curl https://awx.example.com/api/v2/schedules/zoneinfo/ \
  -H "Authorization: Bearer YOUR_TOKEN"
Common timezones:
  • America/New_York (US Eastern)
  • America/Chicago (US Central)
  • America/Denver (US Mountain)
  • America/Los_Angeles (US Pacific)
  • Europe/London
  • Europe/Paris
  • Asia/Tokyo
  • Australia/Sydney

Previewing Schedules

Preview the next 10 occurrences:
curl -X POST https://awx.example.com/api/v2/schedules/preview/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "rrule": "DTSTART;TZID=America/New_York:20260115T120000 RRULE:FREQ=DAILY;INTERVAL=1;COUNT=10"
  }'
Response:
{
  "local": [
    "2026-01-15T12:00:00-05:00",
    "2026-01-16T12:00:00-05:00",
    "2026-01-17T12:00:00-05:00",
    "2026-01-18T12:00:00-05:00",
    "2026-01-19T12:00:00-05:00"
  ],
  "utc": [
    "2026-01-15T17:00:00Z",
    "2026-01-16T17:00:00Z",
    "2026-01-17T17:00:00Z",
    "2026-01-18T17:00:00Z",
    "2026-01-19T17:00:00Z"
  ]
}

Schedule with Extra Variables

Pass variables when the schedule runs:
curl -X POST https://awx.example.com/api/v2/job_templates/1/schedules/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Weekly Cleanup",
    "rrule": "DTSTART:20260119T020000Z RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO",
    "extra_data": {
      "cleanup_days": 30,
      "send_report": true
    }
  }'
With Ansible:
- name: Create schedule with variables
  awx.awx.schedule:
    name: Weekly Cleanup
    unified_job_template: Cleanup Job Template
    rrule: "DTSTART:20260119T020000Z RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO"
    extra_data:
      cleanup_days: 30
      send_report: true
    state: present

Managing Schedules

List All Schedules

# List all schedules
curl https://awx.example.com/api/v2/schedules/ \
  -H "Authorization: Bearer YOUR_TOKEN"

# List schedules for a job template
curl https://awx.example.com/api/v2/job_templates/1/schedules/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Enable/Disable Schedule

# Disable schedule
curl -X PATCH https://awx.example.com/api/v2/schedules/1/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"enabled": false}'

# Enable schedule
curl -X PATCH https://awx.example.com/api/v2/schedules/1/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"enabled": true}'

Update Schedule

- name: Update schedule time
  awx.awx.schedule:
    name: Daily Backup
    unified_job_template: Backup Job Template
    rrule: "DTSTART:20260115T040000Z RRULE:FREQ=DAILY;INTERVAL=1"  # Changed to 4 AM
    state: present

Delete Schedule

- name: Delete schedule
  awx.awx.schedule:
    name: Daily Backup
    unified_job_template: Backup Job Template
    state: absent

Multiple Schedules

A single job template can have multiple schedules:
- name: Weekday schedule
  awx.awx.schedule:
    name: Weekday Deployment
    unified_job_template: Deploy Application
    rrule: "DTSTART:20260119T180000Z RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR"
    state: present

- name: Weekend schedule
  awx.awx.schedule:
    name: Weekend Maintenance
    unified_job_template: System Maintenance
    rrule: "DTSTART:20260124T020000Z RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SA"
    state: present

Schedule for Different Resources

Job Template Schedule

- name: Schedule job template
  awx.awx.schedule:
    name: Nightly Backup
    unified_job_template: Backup Job Template
    rrule: "DTSTART:20260115T020000Z RRULE:FREQ=DAILY;INTERVAL=1"
    state: present

Project Update Schedule

- name: Schedule project sync
  awx.awx.schedule:
    name: Hourly Project Sync
    unified_job_template: Infrastructure Playbooks  # Project name
    rrule: "DTSTART:20260115T000000Z RRULE:FREQ=HOURLY;INTERVAL=1"
    state: present

Inventory Source Schedule

curl -X POST https://awx.example.com/api/v2/inventory_sources/1/schedules/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "EC2 Inventory Sync",
    "rrule": "DTSTART:20260115T000000Z RRULE:FREQ=HOURLY;INTERVAL=6"
  }'

Workflow Template Schedule

- name: Schedule workflow
  awx.awx.schedule:
    name: Weekly Release Pipeline
    unified_job_template: Release Workflow
    rrule: "DTSTART:20260119T090000Z RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO"
    state: present

RRULE Limitations in AWX

AWX enforces these constraints:
  • RRULE must start with DTSTART
  • At least one RRULE entry required
  • Only one DTSTART allowed
  • RDATE and EXDATE are prohibited
  • INTERVAL must be included
  • FREQ=SECONDLY is prohibited
  • BYDAY with numeric prefix (e.g., 1MO, -1FR) is prohibited
  • Cannot use both COUNT and UNTIL in same rule
  • COUNT cannot exceed 999

Monitoring Scheduled Jobs

View Next Run Time

curl https://awx.example.com/api/v2/schedules/1/ \
  -H "Authorization: Bearer YOUR_TOKEN" | jq '{name, next_run, dtstart, dtend}'
Response:
{
  "name": "Daily Backup",
  "next_run": "2026-01-16T02:00:00Z",
  "dtstart": "2026-01-15T02:00:00Z",
  "dtend": null
}

View Recent Scheduled Jobs

# List jobs triggered by a schedule
curl 'https://awx.example.com/api/v2/jobs/?schedule=1' \
  -H "Authorization: Bearer YOUR_TOKEN"

Best Practices

Use Appropriate Intervals

Don’t schedule jobs too frequently - consider resource impact and job duration

Set Timeouts

Configure job timeouts to prevent long-running scheduled jobs from blocking

Monitor Failures

Set up notifications for scheduled job failures

Use Local Timezones

Use TZID for business-hours schedules to handle daylight saving time

Troubleshooting

Check:
  • Schedule is enabled ("enabled": true)
  • DTSTART is in the future
  • Timezone is correct
  • AWX scheduler service is running
View schedule details:
curl https://awx.example.com/api/v2/schedules/1/ \
  -H "Authorization: Bearer YOUR_TOKEN"
Common issues:
  • Missing INTERVAL in RRULE
  • Invalid DTSTART format
  • Using prohibited features (RDATE, EXDATE, BYDAY=1MO)
  • COUNT and UNTIL both specified
Test your RRULE:
curl -X POST https://awx.example.com/api/v2/schedules/preview/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"rrule": "YOUR_RRULE_HERE"}'
Possible causes:
  • Previous job still running (if simultaneous = false)
  • Instance capacity exhausted
  • Job template was modified/disabled
Check job template settings:
allow_simultaneous: false  # Change to true if needed
Ensure:
  • Using valid TZID from /api/v2/schedules/zoneinfo/
  • TZID syntax: DTSTART;TZID=America/New_York:20260115T120000
  • Note: No Z suffix when using TZID
  • UNTIL must still be in UTC (with Z suffix)
Verify with preview:
curl -X POST https://awx.example.com/api/v2/schedules/preview/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"rrule": "DTSTART;TZID=America/New_York:20260115T120000 RRULE:FREQ=DAILY;INTERVAL=1;COUNT=5"}'

Complex Scheduling Scenarios

Business Days Only

rrule: "DTSTART:20260119T090000Z RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR"

Quarterly on First Monday

rrule: "DTSTART:20260105T100000Z RRULE:FREQ=MONTHLY;INTERVAL=3;BYDAY=MO;BYMONTHDAY=1,2,3,4,5,6,7"

Every 4 Hours During Work Days

rrule: "DTSTART;TZID=America/New_York:20260119T080000 RRULE:FREQ=HOURLY;INTERVAL=4;BYDAY=MO,TU,WE,TH,FR;BYHOUR=8,12,16"

Twice a Month (1st and 15th)

rrule: "DTSTART:20260101T120000Z RRULE:FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=1,15"

Job Templates

Create job templates to schedule

Workflows

Schedule complex workflows

Notifications

Get notified about scheduled job results

RFC5545 Specification

Full RRULE specification reference

Build docs developers (and LLMs) love