Hướng dẫn tạo Cron Job tự động dọn dẹp log bằng Ansible

Trên server, các file log thường phát sinh rất nhiều và nếu không dọn dẹp định kỳ, chúng có thể chiếm đầy dung lượng. Ansible hỗ trợ chúng ta tự động hoá việc này thông qua cron module. Trong bài này, chúng ta sẽ tạo một playbook để:

  1. Viết script dọn log (cleanup_logs.sh)
  2. Tạo một cron job chạy script này vào 03:30 sáng thứ Hai hàng tuần.

Xem thêm:

Ansible là gì? Vì sao chúng ta lại cần nó – Bài 1

Làm quen với YAML – Bài 2

1. Cron job là gì?

Cron là một daemon (dịch vụ chạy ngầm) trong hệ điều hành Unix/Linux, có nhiệm vụ thực thi các lệnh hoặc script theo lịch định sẵn.

Job ở đây nghĩa là một tác vụ (task) hoặc công việc mà bạn muốn hệ thống tự động chạy.

Ví dụ:

  • Bạn muốn sao lưu database mỗi ngày lúc 2h sáng → tạo một cron job để chạy script backup vào giờ đó.
  • Bạn muốn dọn dẹp log mỗi tuần 1 lần → tạo một cron job để chạy script cleanup.

2. Chuẩn bị script dọn log

Trước tiên, bạn cần có một script cleanup_logs.sh trên máy Ansible Control (máy chạy Ansible). Ví dụ nội dung đơn giản như sau:

#!/bin/bash
# cleanup_logs.sh - Script dọn dẹp log cũ

# Thư mục chứa log
LOG_DIR="/var/log"

# Xoá log cũ hơn 7 ngày
find $LOG_DIR -type f -name "*.log" -mtime +7 -exec rm -f {} \;

echo "Log cleanup completed on $(date)" >> /var/log/cleanup_history.log

Cấp quyền thực thi cho script này:

sudo chmod +x cleanup_logs.sh

3. Viết Ansible Playbook

Tạo file log_cleanup.yml với nội dung:

---
- name: Schedule a weekly log cleanup
  hosts: app
  become: 'yes'

  tasks: 
    - name: Ensure log cleanup script is exists
      copy:
        src: /home/azureadmin/cleanup_logs.sh
        dest: /usr/local/bin/cleanup_logs.sh
        mode: '0755'

    - name: Schedule weekly log cleanup 
      cron:
        name: "Weekly Log Cleanup"
        job: "/usr/local/bin/cleanup_logs.sh"
        minute: "30"
        hour: "3"
        day: "*"
        month: "*"
        weekday: "1"
        user: root

Giải thích:

  • copy: Copy script từ máy Ansible Control sang máy remote tại đường dẫn /usr/local/bin/.
  • mode: '0755': Cấp quyền thực thi cho script.
  • cron: Tạo cron job chạy script định kỳ.
    • minute: "30" → chạy lúc phút thứ 30.
    • hour: "3" → chạy lúc 3 giờ sáng.
    • weekday: "1" → số 1 là thứ Hai.
    • user: "root" → job chạy dưới quyền root.
    • job: "/usr/local/bin/cleanup_logs.sh" → script cần chạy.

4. Chạy Playbook

Thực thi playbook:

ansible-playbook -i inventory.ini log_cleanup.yml

Trong đó:

  • inventory.ini là file khai báo danh sách server.
  • log_cleanup.yml là playbook vừa tạo.

5. Kiểm tra cron job

Sau khi chạy thành công, bạn có thể SSH vào server và kiểm tra cron của root:

crontab -l -u root

Kết quả sẽ thấy dòng:

# Ansible: Weekly Log Cleanup
30 3 * * 1 /usr/local/bin/cleanup_logs.sh

Bài viết cùng chủ đề:

ansible playbook là gì? Cấu trúc và cách viết chuẩn – Bài 4

Ansible Variables – Biến trong Ansible là gì và cách sử dụng – Bài 5

Cảm ơn bạn đã tham khảo ansible tutorial trên ttnguyen.net

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em