Một Dự Án Hoàn Chỉnh và Tổng Kết Series
You've reached the end
Bài cuối ghép mọi thứ thành một dự án hoàn chỉnh, chạy thật trên server, theo best practices của Bài 15. Sau đó ta dọn dẹp hạ tầng và nhìn lại cả hành trình.
Dự án: triển khai ứng dụng bằng role
Áp dụng cấu trúc Bài 15 — playbook mỏng gọi role dày:
project/
├── ansible.cfg
├── inventory.ini # host đích
├── deploy.yml # playbook (mỏng — chỉ gọi role)
└── roles/
└── webserver/ # role (dày — chứa logic)
├── defaults/main.yml # site_name (tham số, ưu tiên thấp)
├── tasks/main.yml # cài nginx, bật service, render template
├── templates/index.html.j2
└── handlers/main.yml # Restart nginx (notify)
deploy.yml — gọn, khai báo, gọi role và truyền biến:
---
- name: Triển khai web app (capstone)
hosts: web
become: true
roles:
- role: webserver
vars:
site_name: "KKloud — Capstone Deploy"
Chạy:
ansible-playbook deploy.yml
RUNNING HANDLER [webserver : Restart nginx] *
changed: [lab]
PLAY RECAP **********************************
lab : ok=4 changed=1 failed=0
Chạy lần hai để chứng minh idempotency (Bài 5):
lab : ok=4 changed=0 failed=0
changed=0 — lần hai không đổi gì. Và curl http://<host>/ trả về:
<h1>KKloud — Capstone Deploy — role webserver</h1>
Một lệnh, từ máy trắng tới web server chạy — khai báo, idempotent, tái dùng được. Đây là toàn bộ series cô đọng lại.
Bài học thực tế khi làm capstone: server lab tích lũy cấu hình từ các bài trước (hai file
conf.d/*.confcùng đặtserver_tokens→ nginx báo duplicate directive → không start). Bài học: trạng thái tích lũy là kẻ thù — đó chính là lý do ta dùng Ansible (mô tả trạng thái mong muốn đầy đủ) và vì sao môi trường sạch/idempotent quan trọng. Trong dự án thật, role nên quản lý trọn vẹn cấu hình nó phụ trách (kể cả xóa file thừa), và molecule (Bài 14) test trên container sạch để bắt loại lỗi này.
Mở rộng dự án trong thực tế
Từ khung này, dự án thật thêm:
- Nhiều role:
common(user, firewall, baseline) +webserver+database+monitoring, gọi trongsite.yml. - Tách môi trường (Bài 15):
inventories/production/vàinventories/staging/vớigroup_vars/riêng. - Secret qua Vault (Bài 10): mật khẩu DB trong
group_vars/.../vault.yml. - Rolling deploy (Bài 13):
serial+ load balancer cho zero-downtime. - CI:
ansible-lint+molecule(Bài 14, 15) chạy mỗi khi sửa.
🧹 Dọn dẹp: terminate EC2
Series kết thúc — dọn hạ tầng để khỏi tốn tiền (nhớ thói quen từ series AWS). Terminate EC2 lab và xóa key/security group:
# Lấy id từ AWS (hoặc dùng tag Name=ansible-lab)
aws ec2 terminate-instances --instance-ids <INSTANCE_ID>
aws ec2 wait instance-terminated --instance-ids <INSTANCE_ID>
aws ec2 delete-key-pair --key-name <KEY_NAME>
aws ec2 delete-security-group --group-id <SG_ID>
Thú vị: bạn cũng có thể dùng chính Ansible để dọn (module amazon.aws.ec2_instance với state: absent) — Ansible quản lý được cả vòng đời hạ tầng, không chỉ cấu hình. Code hands-on toàn series ở github.com/nghiadaulau/ansible-series.
Tổng kết series
Mười bảy bài, từ "Ansible là gì" tới tự viết module và thiết kế dự án:
- Nền tảng (Bài 0–7): kiến trúc agentless (ship module qua SSH), cài đặt + ad-hoc, inventory, playbook, idempotency, biến/facts/template, điều khiển luồng.
- Tổ chức & mở rộng (Bài 8–12): roles, Galaxy/collections, Vault, viết custom module, plugins.
- Nâng cao (Bài 13–16): tối ưu & rolling update, kiểm thử Molecule, best practices, dự án hoàn chỉnh.
Vài ý cốt lõi đáng giữ:
- Khai báo trạng thái, không phải lệnh — đây là tư duy Ansible. Bạn nói "phải thế này", Ansible lo đưa hệ thống về đó.
- Idempotent là tất cả — chạy lại an toàn là điều phân biệt Ansible với script. Mọi thứ bạn viết (task, role, module) phải idempotent.
- Agentless qua SSH — không cần cài gì trên host; module được ship tới chạy tại chỗ (Bài 1).
- Tổ chức để tái dùng — role + collection + inventory tách môi trường + lint/test trong CI.
Hướng học tiếp
- Ansible Automation Platform (AWX): giao diện web + RBAC + lập lịch + ghi log tập trung cho Ansible ở quy mô tổ chức.
- Tích hợp CI/CD: chạy playbook tự động khi deploy (kết hợp series DevOps với AWS — GitHub Actions).
- Dynamic inventory ở quy mô lớn (Bài 3): tự động quản lý fleet cloud thay đổi liên tục.
- Execution Environments: đóng gói Ansible + dependency vào container để chạy nhất quán mọi nơi.
- Kết nối các series khác: Ansible cấu hình EC2 (series AWS), chuẩn bị host Docker (series Docker), thay cho SSH/script tay (series Linux), và dựa trên SSH/network bạn đã hiểu (series Mạng).
Cảm ơn bạn đã theo hết series. Bạn giờ không chỉ chạy được playbook, mà hiểu Ansible từ cơ chế bên dưới (ship module qua SSH) tới thiết kế dự án chuẩn mực — đủ để tự động hóa thật và đi tiếp vào hệ sinh thái rộng hơn.
You've reached the end