Hi there! I'm Maneshwar. Right now, I’m building LiveAPI, a first-of-its-kind tool that helps you automatically index API endpoints across all your repositories. LiveAPI makes it easier to discover, understand, and interact with APIs in large infrastructures.
Keeping servers clean, logs trimmed, and disk space healthy?
Cron jobs do the grunt work — but managing them manually? Pain.
That’s where Ansible saves the day.
Here's how I automated system maintenance jobs with a reusable Ansible role called cron-master
.
Project Structure
ansible-galaxy init roles/cron-master --offline
ansible/
├─ README.md
├─ ansible.cfg
├─ cron-master.yml # playbook to run cron-master role
├─ hosts.ini # inventory file
├─ install_ansible.sh # bootstrap script
├─ requirements.yml
├─ roles/
│ └─ cron-master/
│ ├─ tasks/ # main logic broken into files
│ │ ├─ main.yml
│ │ ├─ crons.yml
│ │ ├─ deps.yml
│ │ ├─ clean.yml
│ │ └─ space.yml
│ ├─ templates/ # cron scripts and job list
│ │ ├─ crons.j2
│ │ ├─ clean.sh.j2
│ │ └─ space.sh.j2
│ ├─ defaults/vars/meta/... usual role files
Installing Dependencies
We need basic packages and a specific version of cronitor
to monitor jobs.
roles/cron-master/tasks/deps.yml
- name: Ensure dependencies are installed
apt:
name:
- bc
- curl
state: present
- name: Check cronitor version
command: cronitor --version
register: cronitor_version
changed_when: false
failed_when: false
- name: Install specific cronitor version
when: "'30.3' not in cronitor_version.stdout"
block:
- name: Download cronitor 30.3
get_url:
url: https://github.com/cronitorio/cronitor-cli/releases/download/30.3/linux_amd64.tar.gz
dest: /tmp/cronitor.tar.gz
- name: Extract and move binary
unarchive:
src: /tmp/cronitor.tar.gz
dest: /tmp
remote_src: yes
- name: Move cronitor binary
command: mv /tmp/cronitor /usr/local/bin/cronitor
Defining Cron Jobs
I put my cron jobs in a crons.j2
template, so I can maintain them like code:
roles/cron-master/templates/crons.j2
0 0 * * * sudo truncate -s 0 /var/log/nginx/access.log
0 0 * * * sudo truncate -s 0 /var/log/nginx/nginx_error.log
0 0 * * * rm /var/log/nginx/*.gz
Then loaded it in crons.yml
:
- name: Add custom cron jobs to root crontab
vars:
lines: "{{ lookup('template', 'crons.j2').splitlines() }}"
cron:
name: "{{ (idx > 0 and lines[idx-1].strip().startswith('#')) | ternary(lines[idx-1] | trim | regex_replace('^#\\s*', ''), ' '.join(item.split()[5:])) }}"
minute: "{{ item.split()[0] }}"
hour: "{{ item.split()[1] }}"
day: "{{ item.split()[2] }}"
month: "{{ item.split()[3] }}"
weekday: "{{ item.split()[4] }}"
job: "{{ ' '.join(item.split()[5:]) }}"
user: root
loop: "{{ lines }}"
loop_control:
index_var: idx
when: item | trim | length > 0 and not item.strip().startswith('#')
Custom Scripts for Cleaning & Space Checks
I used templates like clean.sh.j2
and space.sh.j2
, then scheduled them via clean.yml
and space.yml
.
Master Task File
main.yml
ties it all together:
- name: Install dependencies
include_tasks: deps.yml
- name: Deploy clean script
include_tasks: clean.yml
- name: Deploy space check cron
include_tasks: space.yml
- name: Add custom cron jobs
include_tasks: crons.yml
Running the Role
Use a playbook like this:
cron-master.yml
- name: Set up cron jobs on servers
hosts: all
become: true
roles:
- cron-master
Then run it:
ansible-playbook -i hosts.ini cron-master.yml
Why This Rocks
- 🔁 Idempotent cron management
- 📋 All cron jobs version-controlled
- 🔎 Easy to test in isolation with
ansible-playbook --tags
- 🔐 Secure and predictable
Bonus Tip: Test with Vagrant or Docker
You can easily test this role in a local VM or container to be safe before pushing to prod.
LiveAPI helps you get all your backend APIs documented in a few minutes.
With LiveAPI, you can generate interactive API docs that allow users to search and execute endpoints directly from the browser.
If you're tired of updating Swagger manually or syncing Postman collections, give it a shot.
Top comments (0)