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)