Absolutely! Ansible Tower (now called Controller in AAP) has a robust, well-documented REST API. You can use it to automate everything you do via the web UI—launch jobs, manage inventories, users, credentials, and more.
Below is a practical, step-by-step guide (with examples!) to help you get started.
How to Work with Ansible Tower REST API (with Example)
1. Understanding the Ansible Tower API
- Type: RESTful, JSON-based API.
- Docs: Interactive Swagger/OpenAPI docs usually at:
https://<tower-server>/api/
(log in and try it!) - Authentication:
- Basic Auth (username/password or Personal Access Token)
- OAuth2 (for advanced use cases)
2. API Authentication
- Basic Auth:
Every request uses HTTP basic authentication.
Example:user:password
or Personal Access Token as username (no password needed). - Getting a Token:
In Tower UI:
User → Tokens → Create Token
(Recommended: use tokens for automation!)
3. Making a Simple API Request
Let’s say your Tower UI is at https://13.233.139.133/
.
List all Job Templates (curl):
curl -k -u 'admin:yourpassword' https://13.233.139.133/api/v2/job_templates/
Code language: JavaScript (javascript)
-k
: Allow insecure (self-signed) SSL-u
: Basic auth,'user:password'
- The response is JSON
Using a Personal Access Token (PAT):
curl -k -H "Authorization: Bearer <your_token>" https://13.233.139.133/api/v2/job_templates/
Code language: JavaScript (javascript)
4. Example: Launch a Job Template via API
Suppose you have a job template with ID 7.
API URL:POST /api/v2/job_templates/7/launch/
Example (with token):
curl -k -H "Authorization: Bearer <your_token>" \
-X POST https://13.233.139.133/api/v2/job_templates/7/launch/
Code language: JavaScript (javascript)
- The response includes the job ID (e.g.,
"id": 81
).
5. Check Job Status
Suppose your launched job returned "id": 81
.
curl -k -H "Authorization: Bearer <your_token>" \
https://13.233.139.133/api/v2/jobs/81/
Code language: JavaScript (javascript)
- Look for
"status": "successful"
(other states: “pending”, “running”, “failed”).
6. See Job Output (Standard Out)
curl -k -H "Authorization: Bearer <your_token>" \
https://13.233.139.133/api/v2/jobs/81/stdout/?format=txt
Code language: JavaScript (javascript)
- Add
?format=txt
or?format=html
as needed.
7. Example: Create an Inventory via API
curl -k -H "Authorization: Bearer <your_token>" \
-H "Content-Type: application/json" \
-d '{"name":"TestInventory","organization":1}' \
-X POST https://13.233.139.133/api/v2/inventories/
Code language: JavaScript (javascript)
- Replace
organization: 1
with your organization’s ID (list orgs via/api/v2/organizations/
).
8. Useful Endpoints
API Endpoint | Description |
---|---|
/api/v2/ | API root & docs |
/api/v2/job_templates/ | List/create job templates |
/api/v2/job_templates/<id>/launch/ | Launch a job template |
/api/v2/jobs/<id>/ | Check job status/details |
/api/v2/jobs/<id>/stdout/ | Get job standard output |
/api/v2/inventories/ | List/create inventories |
/api/v2/hosts/ | List/create hosts |
/api/v2/credentials/ | List/create credentials |
/api/v2/users/ | List/create users |
9. Example Python Script (requests library)
Here’s a simple Python snippet to list all job templates:
import requests
api_url = "https://13.233.139.133/api/v2/job_templates/"
token = "<your_token>" # Or use user/pass in auth param
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
response = requests.get(api_url, headers=headers, verify=False)
for jt in response.json()['results']:
print(f"ID: {jt['id']}, Name: {jt['name']}")
Code language: PHP (php)
(use verify=False
for self-signed SSL)
10. Finding More API Endpoints and Docs
- Visit:
https://<tower-server>/api/
in your browser - Try out requests in Swagger UI
Summary Table
Action | HTTP Method | API URL | Notes |
---|---|---|---|
List job templates | GET | /api/v2/job_templates/ | |
Launch a job template | POST | /api/v2/job_templates/<id>/launch/ | Needs job template ID |
Check job status | GET | /api/v2/jobs/<id>/ | |
Get job output | GET | /api/v2/jobs/<id>/stdout/?format=txt | |
Create inventory | POST | /api/v2/inventories/ | JSON body needed |
Tips and Best Practices
- Use Personal Access Tokens for CI/CD or scripts (not passwords).
- Always use HTTPS for security.
- Use the
/api/
browser docs for full details and live “try it now” features. - Automate with Python (
requests
), Bash (curl
), or your favorite language. - Respect rate limits and error messages—read the
"detail"
field in API responses for helpful info. - For bulk/complex changes, look at tower-cli (deprecated, now awx-cli) or the newer
awx
CLI tool.
I’m a DevOps/SRE/DevSecOps/Cloud Expert passionate about sharing knowledge and experiences. I have worked at Cotocus. I share tech blog at DevOps School, travel stories at Holiday Landmark, stock market tips at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at TrueReviewNow , and SEO strategies at Wizbrand.
Do you want to learn Quantum Computing?
Please find my social handles as below;
Rajesh Kumar Personal Website
Rajesh Kumar at YOUTUBE
Rajesh Kumar at INSTAGRAM
Rajesh Kumar at X
Rajesh Kumar at FACEBOOK
Rajesh Kumar at LINKEDIN
Rajesh Kumar at WIZBRAND