Tự động hóa quy trình sao lưu và vệ sinh log trên server Linux
Trong môi trường vận hành hệ thống (sysadmin), một trong những thách thức lớn nhất là duy trì sức khỏe của server mà không cần con người can thiệp liên tục. Các file log thường tăng kích thước theo cấp số nhân, gây nguy cơ đầy ổ đĩa và làm tê liệt dịch vụ. Bên cạnh đó, việc sao lưu dữ liệu quan trọng một cách thủ công là nguồn gốc của nhiều sự cố khi quên hoặc thao tác sai. Bài viết này sẽ hướng dẫn bạn xây dựng một giải pháp tự động hóa hoàn chỉnh bằng cách kết hợp sức mạnh của Bash scripting, cron cho việc lên lịch, và Ansible để triển khai giải pháp này lên hàng chục server cùng lúc một cách đồng bộ.
Xây dựng kịch bản Bash linh hoạt cho việc cắt xén log
Trước khi đi vào tự động hóa quy mô lớn, chúng ta cần tạo ra một kịch bản Bash vững chắc có khả năng xử lý việc nén và xóa file log cũ. Kịch bản này không chỉ đơn thuần là xóa file mà cần có cơ chế lưu trữ các phiên bản trước đó để phục vụ cho việc khôi phục khi cần thiết. Logic cơ bản sẽ bao gồm việc tìm kiếm các file log theo một mẫu tên, kiểm tra kích thước hoặc ngày tạo, sau đó thực hiện lệnh nén và đặt tên lại với dấu thời gian. Việc sử dụng các biến môi trường giúp kịch bản trở nên tái sử dụng cao hơn, cho phép bạn thay đổi đường dẫn đích hoặc thời hạn lưu trữ mà không cần viết lại code.
Dưới đây là một đoạn mã mẫu cho file rotate_log.sh thực hiện việc tìm tất cả file log có đuôi .log trong thư mục mục tiêu, nén chúng bằng gzip và xóa các file nén cũ hơn 7 ngày:
#!/bin/bash
# Cấu hình biến
LOG_DIR="/var/log/myapp"
RETENTION_DAYS=7
TIMESTAMP=$(date +%F-%H%M%S)
# Kiểm tra quyền và thư mục
if [ ! -d "$LOG_DIR" ]; then
echo "Lỗi: Thư mục $LOG_DIR không tồn tại."
exit 1
fi
# Tìm và xử lý các file log lớn hơn 1MB
find "$LOG_DIR" -name "*.log" -size +1M -type f | while read -f; do
filename=$(basename "$file")
# Tạo tên file mới với timestamp
new_name="${filename%.log}_${TIMESTAMP}.log.gz"
echo "Nén file: $filename -> $new_name"
gzip -c "$file" > "$LOG_DIR/$new_name"
# Xóa file gốc sau khi nén thành công
if [ -f "$LOG_DIR/$new_name" ]; then
rm "$file"
else
rm "$LOG_DIR/$new_name"
echo "Lỗi khi nén file $filename"
fi
done
# Xóa các file log đã nén cũ hơn $RETENTION_DAYS ngày
find "$LOG_DIR" -name "*.gz" -mtime +$RETENTION_DAYS -delete
echo "Hoàn tất quy trình vệ sinh log vào lúc $(date)"
Đoạn mã trên sử dụng hàm find để lọc các file theo kích thước, sau đó dùng vòng lặp while read để xử lý từng file một. Việc sử dụng gzip -c cho phép ghi đầu ra ra file mới mà không xóa file gốc ngay lập tức, đảm bảo an toàn. Nếu bước nén thất bại, script sẽ tự động dọn dẹp file nén lỗi và thông báo. Cuối cùng, dòng lệnh find ... -mtime +7 -delete đảm bảo ổ đĩa luôn được giải phóng các file không cần thiết.
Lên lịch thực thi tự động với Cron
Khi đã có kịch bản Bash hoàn chỉnh, bước tiếp theo là đưa nó vào quy trình chạy định kỳ nhờ vào Cron, một daemon quản lý thời gian trên hệ thống Linux. Cron cho phép bạn chỉ định chính xác khi nào script sẽ chạy, từ vài phút một lần đến vài ngày một lần. Đối với tác vụ vệ sinh log, tần suất thích hợp nhất thường là hàng ngày vào khung giờ thấp điểm, ví dụ 3 giờ sáng, để tránh ảnh hưởng hiệu năng của server trong giờ cao điểm.
Để cài đặt cron job, bạn cần chỉnh sửa crontab của user root hoặc user cụ thể quản lý ứng dụng. Bạn hãy sử dụng lệnh crontab -e để mở file cấu hình. Trong file này, hãy thêm dòng lệnh gọi script với đường dẫn tuyệt đối. Lưu ý rằng biến môi trường trong cron rất hạn chế so với shell thường, do đó bạn nên khai báo đầy đủ đường dẫn cho các lệnh như find hoặc gzip nếu gặp vấn đề, hoặc tốt hơn là khai báo biến PATH ngay trong script.
Cú pháp thêm vào file crontab sẽ như sau: 0 3 * * * /usr/local/bin/rotate_log.sh >> /var/log/rotate_log_action.log 2>&1. Dòng này yêu cầu hệ thống chạy script vào lúc 03:00 hàng ngày, sau đó chuyển toàn bộ đầu ra chuẩn (stdout) và đầu ra lỗi (stderr) vào file nhật ký riêng biệt rotate_log_action.log. Việc này cực kỳ quan trọng để bạn có thể debug khi script gặp lỗi mà không cần trực tiếp xem hệ thống vào đúng giờ chạy.
Triển khai hàng loạt với Ansible Automation
Trong thực tế, bạn thường quản lý hàng chục, thậm chí hàng trăm server. Việc SSH vào từng máy để paste script và cấu hình cron là một quy trình lạc hậu, dễ gây sai sót và tốn thời gian. Đây là lúc Ansible phát huy sức mạnh của mình với phương pháp "Configuration as Code". Ansible cho phép bạn đóng gói toàn bộ logic trên thành một Playbook, sau đó chỉ cần một lệnh duy nhất để triển khai đồng bộ lên toàn bộ cluster.
Bạn sẽ tạo một file playbook với tên là log_rotation_playbook.yml. Playbook này sẽ thực hiện ba nhiệm vụ chính: upload file script lên remote, cấp quyền thực thi cho script, và đảm bảo cron job được cấu hình chính xác. Ansible có module copy để truyền file, module file để chỉnh sửa quyền, và module cron để quản lý lịch trình. Module cron đặc biệt hữu ích vì nó tự động tạo và ghi đè vào crontab mà không cần bạn phải can thiệp thủ công vào file văn bản, đảm bảo tính idempotent (chạy nhiều lần chỉ cho ra một kết quả cuối cùng không đổi).
Dưới đây là nội dung chi tiết của file playbook Ansible:
---
- name: Triển khai tự động hóa vệ sinh log
hosts: webservers
become: yes
tasks:
- name: Upload script rotate_log.sh
copy:
src: rotate_log.sh
dest: /usr/local/bin/rotate_log.sh
owner: root
group: root
mode: '0755'
- name: Tạo thư mục log nếu chưa tồn tại
file:
path: /var/log/myapp
state: directory
owner: root
group: root
mode: '0755'
- name: Cài đặt cron job cho script
cron:
name: "Log Rotation Automation"
minute: "0"
hour: "3"
job: "/usr/local/bin/rotate_log.sh >> /var/log/rotate_log_action.log 2>&1"
user: root
- name: Chạy thử script ngay sau khi deploy
command: /usr/local/bin/rotate_log.sh
args:
creates: /var/log/myapp/.deployed
warn: yes
Trong playbook trên, nhiệm vụ copy đảm bảo file script được đưa lên đúng vị trí với quyền thực thi 0755. Nhiệm vụ file đảm bảo thư mục đích luôn tồn tại, ngăn chặn lỗi script do thiếu thư mục. Nhiệm vụ quan trọng nhất là cron, nó khai báo rõ ràng tên job, thời gian chạy (phút 0, giờ 3) và lệnh thực thi. Nếu bạn chạy lại playbook này khi cron đã tồn tại, Ansible sẽ không tạo mới mà chỉ so sánh và cập nhật nếu có thay đổi, giúp hệ thống luôn nhất quán. Nhiệm vụ cuối cùng command cho phép bạn chạy thử script ngay lập tức để kiểm tra tính năng, với tham số creates ngăn chặn việc chạy lại script nhiều lần nếu file marker đã tồn tại.
Tổng hợp lại, việc kết hợp Bash để xử lý logic chi tiết, Cron để duy trì chu kỳ hoạt động và Ansible để mở rộng quy mô triển khai tạo nên một hệ thống tự động hóa bền vững. Giải pháp này không chỉ giải quyết bài toán đầy ổ đĩa log mà còn là nền tảng để bạn mở rộng sang các tác vụ khác như sao lưu database, cập nhật package hay giám sát tài nguyên, giúp công việc vận hành trở nên chuyên nghiệp và hiệu quả hơn rất nhiều.