Ansible|Runner is|a|tool and Python library that helps when interfacing with Ansible directly or as part of another system. Ansible Runner works as a standalone tool, a container image interface, or a Python module that can be imported. The goal is to provide a stable and consistent interface abstraction to Ansible.
The Ansible Runner as a Service (ARaaS) wraps the ansible runner interface inside a REST API enabling Ansible playbooks to be executed and queried from other platforms.
Ensure your code delivers the experience and functionality the business expects by optimizing performance across test, pre-production, and production environments with AppDynamics.
The incentive for this is to:
Security
Monitoring
Playbook Execution
Playbook State
Inventory management
Developer Friendly
Deployment
So far, testing has been mainly against Fedora (28) and CentOS7 for the docker image. Package Dependencies:
Assuming you have an environment that meets the python3 dependencies, simply unzip the archive and run the following command.
python3 ansible_runner_service.py
When you run from any directory outside of /usr, the script regards this as 'dev' mode. In this mode, all files and paths are relative to the path that you've unzipped the project into.
For 'prod' mode, a setup.py is provided. Once the package is installed and called from /usr/*/bin, the script will expect config and output files to be found in all the normal 'production' locations.
sudo python3 setup.py install --record installed_files --single-version-externally-managed
Once this is installed, you may start the service.
python3 ansible_runner_service.py
Once the service is running, you can point your browser to https://localhost:5001/api to show which endpoints are available.
Each endpoint is described along with a curl example showing invocation and output.
You may click on any row to expand the description of the API route and show the curl example.
The app uses a self-signed certificate, so all examples use the -k parameter (insecure mode).
API Routesand descriptions
/api- Show available API endpoints (this info)
/api/v1/groups - List all the defined groups in the inventory
/api/v1/groups/<group_name>- Manage groups within the inventory
/ /v1/groupvars/<group_name>- Manage group variables
/api/v1/hosts- Return a list of hosts from the inventory
/api/v1/hosts/<host_name>- Show group membership for a given host
/api/v1/hosts/<host_name>/groups/<group_name>- Manage ansible control of a given host
/api/v1/hostvars/<host_name>/groups/<group_name>- Manage host variables for a specific group within the inventory
/api/v1/jobs/<play_uuid>/events- Return a list of events within a given playbook run (job)
/api/v1/jobs/<play_uuid>/events/<event_uuid>- Return the output of a specific task within a playbook
/api/v1/playbooks- Return the names of all available playbooks
/api/v1/playbooks/<play_uuid>- Query the state or cancel a playbook run (by uuid)
/api/v1/playbooks/<playbook_name>- Start a playbook by name, returning the play's uuid
/api/v1/playbooks/<playbook_name>/tags/- Start a playbook using tags to control which tasks run
/metrics- Provide Prometheus compatible statistics which describe playbook activity
Get the list of available playbooks
curl -k -i https://localhost:5001/api/v1/playbooks -X GET
Run the playbook.yml playbook, passing the time_delay parameter (30 secs should be enough)
curl -k -i -H "Content-Type: application/json" --data '{"time_delay": 30}' https://localhost:5001/api/v1/playbooks/playbook.yml -X POST
Get a list of all the events in a playbook. The return list consists of all the job event ID's
curl -k -i https://localhost:5001/api/v1/jobs/de264512-32f1-11ec-aaf5-005056a854a6/events -X GET
To get specific output from a job event, you can query the job event
curl -k -i https://localhost:5001/api/v1/jobs/de264512-32f1-11ec-aaf5-005056a854a6/events/16-b853adec-9978-4499-8e6d-d2aecc34e108??????? -X GET
Obviously, you'll need to change the playbook UUID and job UUIDs for your run.
...Yep, you got it right! ?
That is cool, right? Wrapping a plain/CLI Ansible playbook inside a REST API call! Think of the (AppD/Others?) integration possibilities... ?
This article aims to cover the basic functionality of Ansible Runner as a Service. Here are some helpful links to learn more:
We'd love to hear what you think. Ask a question or leave a comment below.
And stay connected with Cisco DevNet on social!
LinkedIn | Twitter @CiscoDevNet | Facebook | YouTube Channel