Xây dựng quy trình tự động sao lưu dữ liệu kết hợp Bash, Cron và Ansible
Trong môi trường quản trị hệ thống hiện đại, việc đảm bảo tính toàn vẹn và khả năng phục hồi dữ liệu là ưu tiên hàng đầu. Một phương pháp truyền thống thường chỉ dùng lệnh cron để chạy script Bash sao lưu, nhưng phương pháp này gặp nhiều hạn chế khi số lượng máy chủ tăng lên, đặc biệt là việc quản lý mã nguồn, kiểm soát phiên bản và xử lý các lỗi phức tạp. Bài viết này sẽ hướng dẫn bạn xây dựng một giải pháp lai (hybrid) mạnh mẽ: sử dụng Ansible để phân phối script, Cron để kích hoạt thực thi và Bash để xử lý logic sao lưu chi tiết, từ đó tạo ra một quy trình tự động hóa chuẩn bị cho việc mở rộng quy mô (scalability).
Phân tích kiến trúc và lợi ích của mô hình lai
Kiến trúc này tận dụng điểm mạnh của từng công nghệ. Ansible đóng vai trò là công cụ phân phối và quản lý cấu hình, giúp bạn viết một kịch bản (playbook) duy nhất để đẩy script Bash và cấu hình cron job đến hàng trăm máy chủ target một cách đồng bộ và idempotent (đảm bảo thực thi nhiều lần vẫn cho kết quả như nhau). Sau khi script được cài đặt, hệ thống Cron của chính máy chủ mục tiêu sẽ nhận vai trò là bộ điều khiển thời gian, đảm bảo tác vụ chạy đúng lịch trình mà không cần máy chủ quản lý (Control Node) phải luôn在线. Cuối cùng, script Bash sẽ thực thi các lệnh cụ thể như nén dữ liệu, chuyển file sang máy chủ lưu trữ và xóa các bản sao lưu cũ, cho phép tùy biến logic phức tạp mà các module của Ansible có thể chưa hỗ trợ trực tiếp hoặc quá cồng kềnh để viết.
Chuẩn bị script Bash chuyên nghiệp cho việc sao lưu
Bước đầu tiên và quan trọng nhất là viết một script Bash có khả năng xử lý lỗi, ghi log chi tiết và thực hiện các thao tác sao lưu an toàn. Thay vì viết các dòng lệnh rời rạc, chúng ta cần đóng gói chúng thành một hàm có cấu trúc rõ ràng. Script dưới đây sẽ thực hiện việc tạo thư mục đích nếu chưa tồn tại, nén dữ liệu với timestamp, chuyển file sang server remote qua SSH, và thực hiện chính sách giữ bản sao lưu cũ (retention policy) dựa trên ngày tháng. Việc thêm cơ chế logging vào file riêng biệt sẽ giúp bạn dễ dàng排查 lỗi khi có sự cố xảy ra thay vì chỉ xem log hệ thống chung chung.
#!/bin/bash
# Định nghĩa các biến cấu hình để dễ quản lý và thay đổi
BACKUP_SOURCE="/var/www/html"
REMOTE_USER="backup_admin"
REMOTE_HOST="backup-server.example.com"
REMOTE_PATH="/mnt/backups"
RETENTION_DAYS=7
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/backup_service.log"
BACKUP_FILE="site_backup_${TIMESTAMP}.tar.gz"
# Hàm ghi log để theo dõi quy trình
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
# Kiểm tra quyền truy cập và khởi đầu
log_message "Bắt đầu quy trình sao lưu cho $BACKUP_SOURCE"
# Tạo backup file
cd / || exit 1
tar -czf "$BACKUP_FILE" -C "$BACKUP_SOURCE" . || { log_message "LỖI: Không thể nén dữ liệu"; exit 1; }
# Chuyển file lên remote server
rsync -avz "$BACKUP_FILE" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" || { log_message "LỖI: Không thể chuyển file remote"; exit 1; }
# Xóa file local sau khi chuyển thành công để tiết kiệm dung lượng
rm -f "$BACKUP_FILE"
# Xóa các bản backup cũ trên remote theo chính sách retention
ssh "${REMOTE_USER}@${REMOTE_HOST}" "find ${REMOTE_PATH} -name 'site_backup_*.tar.gz' -mtime +${RETENTION_DAYS} -delete" || log_message "Cảnh báo: Không thể xóa file cũ trên remote"
log_message "Hoàn thành quy trình sao lưu thành công"
Script trên được thiết kế với các biến rõ ràng giúp việc cấu hình hóa dễ dàng hơn khi Ansible phân phối chúng. Đặc biệt, các lệnh kiểm tra lỗi (||) được thêm vào để đảm bảo nếu một bước thất bại, script sẽ dừng lại và ghi log, tránh việc tạo ra các bản backup không hoàn chỉnh hoặc thực hiện xóa dữ liệu khi chưa chuyển xong. Việc sử dụng rsync kết hợp với ssh đảm bảo tính an toàn và tốc độ truyền tải tốt hơn so với scp thông thường.
Cấu hình Ansible để phân phối script và Cron job
Khi đã có script Bash, nhiệm vụ của Ansible là đưa script này vào đúng vị trí trên tất cả các máy chủ target, cấp quyền thực thi cần thiết và cấu hình một cron job để kích hoạt nó. Chúng ta sẽ sử dụng module copy để truyền file script, module file để đặt quyền, và module cron để quản lý lịch trình. Điểm mấu chốt ở đây là sử dụng template của Ansible, cho phép bạn truyền các biến động (như thời gian chạy, tên server đích) vào script mà không cần sửa trực tiếp code Bash, giúp quy trình linh hoạt hơn khi áp dụng cho nhiều môi trường khác nhau.
---
- name: Deploy Backup Solution across Web Servers
hosts: webservers
become: yes
vars:
backup_source_path: /var/www/html
remote_backup_server: backup-server.example.com
backup_retention_days: 7
backup_schedule: "0 2 * * *" # Chạy lúc 2 giờ sáng mỗi ngày
tasks:
- name: Ensure backup log directory exists
file:
path: /var/log
state: directory
mode: '0755'
- name: Deploy the backup script using template
copy:
src: backup_script.sh.j2
dest: /usr/local/bin/run_backup.sh
owner: root
group: root
mode: '0755'
register: script_copy
- name: Deploy SSH key for backup user to remote server
authorized_key:
user: "{{ remote_backup_server_user }}"
key: "{{ lookup('file', '/home/admin/.ssh/id_rsa.pub') }}"
state: present
when: script_copy.changed
- name: Configure cron job for backup automation
cron:
name: "Automated backup for {{ inventory_hostname }}"
job: "/usr/local/bin/run_backup.sh >> /var/log/backup_service.log 2>&1"
minute: "0"
hour: "2"
state: present
Playbook trên giả định rằng bạn đã có một file template tên là backup_script.sh.j2. File template này sẽ có cùng nội dung với script Bash ở phần trước, nhưng các biến cứng sẽ được thay bằng biến động của Ansible như {{ backup_source_path }}. Nhờ cơ chế này, khi bạn muốn chạy script cho một server khác với đường dẫn khác, bạn chỉ cần thay đổi biến trong playbook hoặc trong file inventory mà không cần chỉnh sửa logic script. Module cron ở đây đảm bảo rằng task sẽ tự động chạy vào 2 giờ sáng mỗi ngày, và mọi đầu ra cũng như lỗi sẽ được chuyển hướng (redirect) vào file log để tập trung.
Triển khai và kiểm tra tính an toàn
Sau khi hoàn thành playbook, bước tiếp theo là thực thi với tham số --check để kiểm tra xem Ansible sẽ thực hiện những thay đổi gì mà không thực sự ghi đè vào hệ thống. Đây là bước bắt buộc trong quy trình DevOps chuyên nghiệp để tránh các lỗi không mong muốn. Sau khi xác nhận an toàn, hãy thực thi chính thức và kiểm tra log của script trên các máy chủ mục tiêu để đảm bảo cron job đã kích hoạt script và script đã hoàn thành nhiệm vụ sao lưu. Việc kiểm tra thủ công ban đầu này là cần thiết để xác minh kết nối SSH, quyền truy cập vào thư mục remote và chính sách xóa file cũ hoạt động đúng ý định của bạn.
Tổng kết lại, việc kết hợp Bash, Cron và Ansible tạo nên một mô hình tự động hóa vừa mạnh mẽ về mặt logic xử lý dữ liệu, vừa linh hoạt về mặt quản lý hạ tầng. Bạn không bị phụ thuộc vào một công cụ duy nhất mà tận dụng được thế mạnh của từng thành phần: tính linh hoạt của Bash, sự ổn định của Cron và khả năng quản lý tập trung của Ansible. Đây là nền tảng vững chắc để bạn mở rộng sang các tác vụ phức tạp hơn như sao lưu database, đồng bộ cấu hình hay giám sát hệ thống trong tương lai.