Cơn ác mộng mang tên “SSH vào từng con server”
Nếu bạn chỉ quản lý 2-3 con VPS, việc SSH vào từng máy để gõ dnf update hay cài Nginx vẫn còn khá thư thả. Nhưng hãy thử tưởng tượng con số đó vọt lên 10, 20 hoặc 50 máy. Mình từng thức trắng đến 2 giờ sáng chỉ để sửa đúng một dòng cấu hình trong file nginx.conf trên 15 cụm server khác nhau. Chỉ cần một phút lơ đãng gõ nhầm lệnh trên một node, cả hệ thống có thể “đi viện” ngay lập tức.
Dùng Fedora làm máy chính đã 2 năm, mình cực thích tốc độ cập nhật package của nó. Tuy nhiên, khi hạ tầng phình to, mình nhận ra sức người không thể đấu lại số lượng server. Đó là lúc mình bắt buộc phải tìm đến tự động hóa để cứu lấy quỹ thời gian của chính mình.
Tại sao quản lý thủ công là con đường ngắn nhất dẫn đến… lỗi?
Vấn đề không chỉ là tốn thời gian. Khi thao tác bằng tay, bạn sẽ đối mặt với ba rủi ro chí mạng:
- Configuration Drift (Lệch cấu hình): Sau vài tháng, server A chạy Nginx 1.20, server B lại vọt lên 1.24, còn server C thì… quên chưa mở port Firewall. Bạn sẽ không bao giờ chắc chắn được các máy chủ có đang đồng nhất hay không.
- Khó tái bản (Reproducibility): Nếu một server sập hoàn toàn, bạn mất bao lâu để dựng lại một con y hệt? Nếu không có script chuẩn, việc này gần như là mò kim đáy bể.
- Sai sót do mệt mỏi: Một dấu cách thừa hay một lệnh
rm -rfnhầm thư mục luôn rình rập khi anh em Ops làm việc quá sức.
Chọn Shell Script, Puppet hay Ansible?
Cách đơn giản nhất là viết file .sh rồi copy sang từng máy. Tuy nhiên, script thuần thiếu tính Idempotency (tính hoán chuyển). Nếu bạn chạy script hai lần, nó có thể gây lỗi vì file đã tồn tại hoặc service đang chạy rồi.
Các công cụ như Puppet hay Chef thì lại quá cồng kềnh. Chúng bắt bạn cài một con “Agent” (phần mềm chạy ngầm) trên tất cả máy khách. Việc này vừa tốn RAM, vừa tăng thêm rủi ro bảo mật cho hệ thống.
Ansible là lựa chọn cân bằng nhất. Nó hoạt động theo cơ chế Agentless. Bạn chỉ cần cài Ansible trên máy điều khiển (Control Node). Sau đó, nó sẽ đẩy lệnh qua SSH tới các máy đích. Ngoài Python có sẵn trên Fedora, bạn không cần cài thêm bất cứ thứ gì lên server mục tiêu.
Bắt tay vào triển khai Ansible trên Fedora
Giả định bạn đã có một máy Fedora Server làm trung tâm điều khiển và vài máy chủ Linux khác để thực hành quản lý.
Bước 1: Cài đặt Ansible Core
Fedora luôn ưu tiên package mới nhất nên việc cài đặt rất nhanh. Trên máy điều khiển, hãy chạy lệnh:
sudo dnf install ansible-core -y
Để chắc chắn mọi thứ ổn thỏa, hãy kiểm tra phiên bản:
ansible --version
Bước 2: Thiết lập SSH Key-based Authentication
Ansible dùng SSH để giao tiếp. Thay vì nhập mật khẩu thủ công cực hình, bạn nên dùng SSH Key. Tạo key mới nếu chưa có:
ssh-keygen -t ed25519 -C "[email protected]"
Sau đó, đẩy key này sang các server mục tiêu:
ssh-copy-id [email protected]
Bước 3: Cấu hình Inventory (Danh sách máy chủ)
Ansible cần biết nó phải quản lý những ai. Hãy tạo file hosts.ini và phân nhóm server rõ ràng:
[webservers]
192.168.1.10
192.168.1.11
[dbservers]
192.168.1.20
[all:vars]
ansible_user=fedora
Bước 4: Kiểm tra kết nối với Ad-hoc Command
Hãy thử xem Ansible đã “nhận mặt” được các máy chưa bằng module ping:
ansible all -i hosts.ini -m ping
Khi màn hình hiện chữ "ping": "pong" màu xanh lá, nghĩa là đường truyền đã thông suốt.
Viết Playbook: Tự động hóa cấu hình Web Server trong 1 nốt nhạc
Playbook là nơi bạn định nghĩa kịch bản triển khai bằng định dạng YAML. Hãy tạo file setup-web.yml để cài Nginx và mở Firewall tự động.
---
- name: Cấu hình Web Server hàng loạt
hosts: webservers
become: yes
tasks:
- name: Cài đặt Nginx
dnf:
name: nginx
state: latest
- name: Kích hoạt Nginx
systemd:
name: nginx
state: started
enabled: yes
- name: Mở port HTTP trên Firewall
firewalld:
service: http
permanent: yes
state: enabled
notify: Reload Firewall
handlers:
- name: Reload Firewall
service:
name: firewalld
state: reloaded
Thực thi kịch bản bằng lệnh:
ansible-playbook -i hosts.ini setup-web.yml
Cái hay của Ansible là nếu bạn chạy lại lệnh này, nó sẽ nhận ra Nginx đã có sẵn và không làm gì cả. Trạng thái trả về sẽ là ok thay vì changed. Đây chính là sự khác biệt giữa dân chuyên nghiệp và người viết script dạo.
Kinh nghiệm thực tế: Đừng để SELinux làm khó bạn
Trong quá trình làm dự án thực tế, mình rút ra 3 lưu ý quan trọng cho anh em dùng Fedora:
- Ưu tiên Module chuyên dụng: Đừng lạm dụng module
shell. Hãy dùngdnf,copy, haytemplate. Chúng giúp câu lệnh của bạn an toàn và dễ kiểm soát hơn nhiều. - Xử lý SELinux: Fedora mặc định bật SELinux rất chặt. Khi dùng Ansible copy file cấu hình, hãy nhớ dùng module
sefcontextđể gán nhãn (label) đúng. Nếu không, Nginx sẽ báo lỗi Permission denied dù bạn đã chmod 777. - Khám phá Ansible Galaxy: Đừng tốn công “chế tạo lại bánh xe”. Trên Ansible Galaxy có sẵn hàng ngàn Role mẫu. Mình thường lên đó tải về rồi tùy chỉnh lại cho nhanh.
Chuyển sang Ansible ban đầu có thể khiến bạn hơi rối với cú pháp YAML. Nhưng tin mình đi, nó sẽ giúp bạn tiết kiệm hàng chục giờ gõ phím vô nghĩa. Thay vì mải mê SSH, bạn sẽ có thời gian để nghiên cứu kiến trúc hệ thống hoặc đơn giản là rời văn phòng sớm hơn thường lệ.

