Tự động hóa sao lưu dữ liệu với Bash, Cron và Ansible trên hạ tầng Linux
Trong môi trường vận hành hệ thống hiện đại, việc sao lưu dữ liệu định kỳ không chỉ là một nhiệm vụ bảo trì mà còn là một yêu cầu sống còn cho sự an toàn của tổ chức. Sự kết hợp giữa sức mạnh xử lý tập lệnh của Bash, khả năng lập thời gian biểu của Cron và sức mạnh tự động hóa triển khai của Ansible tạo nên một giải pháp bảo mật và hiệu quả cao. Bài viết này sẽ đi sâu vào cách xây dựng một quy trình sao lưu toàn diện, từ việc viết script Bash để nén và di chuyển dữ liệu, thiết lập lịch chạy tự động bằng Cron, cho đến việc sử dụng Ansible để triển khai đồng bộ quy trình này lên hàng trăm máy chủ đích mà không cần can thiệp thủ công.
Xây dựng tập lệnh Bash linh hoạt và an toàn
Điểm khởi đầu của mọi quy trình tự động hóa là một tập lệnh Bash được viết chuẩn xác. Script này sẽ chịu trách nhiệm thực thi các tác vụ cốt lõi như nén thư mục cần sao lưu, đặt tên theo thời gian hiện tại để tránh ghi đè, và di chuyển file sang thư mục đích hoặc server dự phòng. Để đảm bảo tính an toàn, script cần xử lý lỗi ngay khi phát sinh và ghi nhật ký chi tiết để dễ dàng tra cứu sau này. Chúng ta sẽ viết một script sử dụng lệnh tar để nén dữ liệu, kết hợp với việc tạo biến môi trường để cấu hình đường dẫn và lịch giữ file (retention policy).
Trước hết, hãy tạo một file script với tên là backup.sh. Nội dung bên trong sẽ bắt đầu bằng việc khai báo shell và các biến cấu hình. Việc sử dụng biến giúp script dễ dàng được điều chỉnh khi triển khai lên nhiều môi trường khác nhau. Sau đó, script sẽ tạo thư mục đích nếu chưa tồn tại, thực hiện lệnh nén và di chuyển file. Quan trọng nhất là phần xử lý lỗi thông qua lệnh set -e để dừng script ngay khi gặp lỗi và phần dọn dẹp các file sao lưu cũ vượt quá số ngày quy định.
#!/bin/bash
# Cấu hình cơ bản
BACKUP_DIR="/var/backups"
SOURCE_DIR="/var/www/html"
RETENTION_DAYS=7
DATE=$(date +%F_%H%M%S)
LOG_FILE="/var/log/backup.log"
# Biến để kiểm soát dòng lệnh
set -e
# Hàm ghi log
log_message() {
echo "[$(date '+%F %T')] $1" >> $LOG_FILE
}
# Bắt đầu quá trình
log_message "Bắt đầu sao lưu dữ liệu từ $SOURCE_DIR"
# Tạo thư mục đích nếu chưa có
mkdir -p $BACKUP_DIR
# Thực hiện nén dữ liệu
BACKUP_FILE="$BACKUP_DIR/backup_${DATE}.tar.gz"
if tar -czf $BACKUP_FILE $SOURCE_DIR; then
log_message "Sao lưu thành công: $BACKUP_FILE"
else
log_message "Lỗi khi thực hiện sao lưu"
exit 1
fi
# Dọn dẹp các file sao lưu cũ
find $BACKUP_DIR -type f -name "backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete
log_message "Đã xóa các file sao lưu cũ hơn $RETENTION_DAYS ngày"
log_message "Hoàn tất quy trình sao lưu"
Script trên sử dụng cấu trúc logic chặt chẽ với hàm ghi log riêng biệt để đảm bảo mọi hoạt động đều được ghi nhận. Lệnh find với tùy chọn -mtime giúp tự động loại bỏ các bản sao lưu cũ, giúp tiết kiệm dung lượng ổ đĩa mà không cần con người phải can thiệp. Việc sử dụng set -e đảm bảo nếu quá trình nén thất bại, script sẽ dừng ngay lập tức để tránh tạo ra các file rỗng hoặc sai lệch, từ đó cảnh báo admin qua email hoặc hệ thống giám sát.
Thiết lập lịch trình tự động với Cron
Khi đã có sẵn tập lệnh Bash, bước tiếp theo là đảm bảo script này được thực thi đúng thời điểm mà không cần người dùng đăng nhập vào hệ thống. Cron là công cụ quản lý định thời gian tiêu chuẩn trên Linux, cho phép chúng ta định nghĩa các biểu thức thời gian linh hoạt. Để script hoạt động ổn định, chúng ta cần cấp quyền thực thi cho file script và thêm dòng lệnh vào crontab của người dùng hoặc root tùy thuộc vào đặc quyền cần thiết.
Việc cấu hình Cron đòi hỏi sự cẩn thận với đường dẫn. Khi Cron chạy, nó thường không thừa kế các biến môi trường của shell người dùng, do đó cần sử dụng đường dẫn tuyệt đối cho mọi lệnh và file. Ngoài ra, để nhận được thông báo kết quả, ta có thể cấu hình phần email trong crontab để gửi log về địa chỉ của sysadmin. Một biểu thức cron tiêu chuẩn cho việc sao lưu hàng ngày vào lúc 2 giờ sáng sẽ bao gồm số phút 0, số giờ 2, và dấu * cho các vị trí tháng, ngày và ngày trong tuần.
chmod +x /opt/scripts/backup.sh
# Mở crontab để chỉnh sửa
crontab -e
# Thêm dòng lệnh sau vào file crontab:
# Sao lưu mỗi ngày lúc 02:00 sáng, gửi log về admin@example.com
0 2 * * * /opt/scripts/backup.sh >> /var/log/cron_backup.log 2>&1 | mail -s "Kết quả sao lưu $(hostname)" admin@example.com
Dòng lệnh trong ví dụ trên không chỉ thực thi script mà còn chuyển cả đầu ra chuẩn và lỗi chuẩn (2>&1) vào file log riêng biệt, đồng thời gửi email thông báo kết quả cho quản trị viên. Việc bao quanh hostname trong dấu ngoặc kép và ngoặc nhọn trong lệnh mail giúp động hóa tiêu đề email, giúp admin nhanh chóng xác định máy chủ nào có vấn đề. Đây là một thực hành tốt để giảm tải cho đội ngũ vận hành khi quản lý số lượng lớn máy chủ.
Triển khai quy trình trên nhiều máy chủ bằng Ansible
Trong môi trường có hàng chục hoặc hàng trăm máy chủ, việc chạy lệnh crontab thủ công trên từng máy là không khả thi và dễ sai sót. Ansible xuất hiện như một giải pháp để tự động hóa việc này. Thay vì đăng nhập SSH vào từng máy, chúng ta viết một playbook để Ansible phân phối file script, cấp quyền, và cấu hình crontab cho tất cả các máy chủ đích một cách đồng bộ.
Playbook của Ansible sẽ thực hiện các bước tuần tự: đầu tiên là đẩy file script backup.sh từ máy chủ quản lý lên thư mục /opt/scripts trên các node đích. Tiếp theo là sử dụng module copy hoặc script để đảm bảo file tồn tại với nội dung chính xác. Sau đó, module file sẽ thiết lập quyền sở hữu và quyền thực thi. Cuối cùng, module cron sẽ thêm hoặc cập nhật dòng lệnh vào crontab mà không cần phải mở file và chỉnh sửa thủ công. Cách tiếp cận này đảm bảo tính nhất quán (consistency) tuyệt đối giữa các máy chủ.
---
- name: Triển khai quy trình sao lưu tự động
hosts: webservers
become: yes
tasks:
- name: Tạo thư mục chứa script
file:
path: /opt/scripts
state: directory
mode: '0755'
- name: Sao chép file script backup.sh lên máy chủ đích
copy:
src: roles/backup/files/backup.sh
dest: /opt/scripts/backup.sh
owner: root
group: root
mode: '0755'
- name: Thiết lập lịch chạy cron hàng ngày
cron:
name: "Daily backup at 02:00"
minute: "0"
hour: "2"
job: "/opt/scripts/backup.sh >> /var/log/cron_backup.log 2>&1"
user: root
Playbook trên sử dụng module file để tạo thư mục, module copy để đẩy script, và module cron để quản lý lịch trình. Việc sử dụng biến become: yes cho phép các task thực thi với quyền root, điều bắt buộc khi cấu hình cron cho người dùng root. Module cron của Ansible rất thông minh, nó sẽ tự động kiểm tra xem dòng cron đã tồn tại chưa và chỉ cập nhật nếu cần thiết, hoặc thêm mới nếu chưa có, tránh việc tạo ra các dòng trùng lặp gây rối trong crontab.
Kết luận về quy trình tự động hóa
Việc tích hợp Bash, Cron và Ansible tạo nên một hệ thống sao lưu dữ liệu vững chắc, tự động và có khả năng mở rộng cao. Bash đảm nhiệm vai trò thực thi các tác vụ cụ thể với logic rõ ràng, Cron giữ vai trò kích hoạt đúng thời điểm, và Ansible đóng vai trò kiến trúc sư triển khai, đảm bảo quy trình này được áp dụng đồng bộ trên toàn bộ hạ tầng. Cách tiếp cận này không chỉ tiết kiệm thời gian vận hành mà còn giảm thiểu rủi ro do sai sót con người, nâng cao độ tin cậy của hệ thống. Khi gặp sự cố, các file log được ghi lại chi tiết kết hợp với email cảnh báo giúp đội ngũ kỹ thuật phản ứng nhanh chóng, đảm bảo dữ liệu của doanh nghiệp luôn an toàn trước mọi biến cố.