Danh sách bài viết trong series Sử dụng Ansible tự động hệ thống
- Bài 1: Ansible Là Gì Mà Dân DevOps Mê Thế?
- Bài 2: Ansible Inventory – Danh Bạ Server Của Bạn
- Bài 3: Ansbile Ad-Hoc – Lệnh Nhanh Như Chớp
- Bài 4: Ansbile Playbook Đầu Tiên – Đừng Sợ YAML
- Bài 5: Ansible Variables – Bí Kíp Linh Hoạt Hóa Mọi Thứ
- Bài 6: Ansible Module Nâng Cao – Mở Rộng Khả Năng
- Bài 7: Ansible Roles – Sạch Sẽ Như Nhà Mới Dọn
- Bài 8: Ansible Template Jinja2 – Config Động Như Phim Marvel
- Bài 9: Ansible Conditionals Và Loops – Đỉnh Cao Điều Khiển
- Bài 10: Ansible Error Handling – Không Panic Khi Fail
- Bài 11: Ansible Quản Lý Cloud – Chơi Lớn Với AWS
- Bài 12: Ansible Dynamic Inventory – Danh Sách Server Tự Động
- Bài 13: Ansible Vault – Khóa Két Sắt Cho Bí Mật
- Bài 14: Ansible Tower/AWX – Trung Tâm Điều Khiển DevOps
- Bài 15: Ansible Best Practices – Viết Ansible Sạch, Chạy Đỉnh Cao
Sau khi khám phá Ansible Module DevOps ở bài trước, mình đã thấy module nâng cao như user
hay shell
giúp làm việc nhanh thế nào. Nhưng mà hồi đó, playbook của mình dài ngoằng, trông như “truyện Conan” – vừa rối mắt vừa khó bảo trì. Rồi một hôm, mình mò ra Ansible Role DevOps, và đúng là “cứu tinh” để dọn dẹp mớ hỗn độn! Role giúp tổ chức playbook thành từng phần rõ ràng, tái sử dụng được, giống như dọn nhà mới vậy. Hôm nay, mình sẽ kể bạn nghe Ansible Role DevOps là gì, tại sao nó quan trọng, và cùng tạo một role để cài Nginx cho sạch sẽ. Cùng bắt đầu nhé!
Ansible Role DevOps Là Gì? – “Ngôi Nhà” Cho Playbook
Nói đơn giản, Ansible Role DevOps là cách tổ chức playbook thành các phần nhỏ, có cấu trúc rõ ràng, để dễ quản lý và tái sử dụng. Bạn có thể tưởng tượng playbook như một ngôi nhà, còn role là các phòng – mỗi phòng làm một việc (VD: cài Nginx, cấu hình database). Hồi mới học Ansible, mình toàn viết playbook trong một file YAML dài cả trang, vừa sửa vừa sợ lỗi. Có lần mình thêm task mới vào giữa, làm thụt lề sai, playbook chạy lỗi tùm lum – mất cả buổi debug.
Rồi mình phát hiện Ansible Role DevOps. Role chia nhỏ công việc thành thư mục, mỗi thư mục chứa tasks, variables, templates, và cả handlers – tất cả đều có tổ chức. Ví dụ, role nginx
sẽ lo cài Nginx, copy config, và restart service, trong khi role mysql
lo database. Mình từng dùng role để quản lý 10 server, mỗi server dùng vài role – vừa gọn gàng vừa dễ mở rộng. So với playbook “một cục”, role đúng là “ngôi nhà mới” – sạch sẽ và chuyên nghiệp!
Cấu Trúc Role – “Phòng ốc” Của Ngôi Nhà
Một role trong Ansible Role DevOps có cấu trúc thư mục cố định, giúp Ansible tự nhận diện. Mình sẽ tạo một role cơ bản để bạn thấy rõ. Tạo thư mục roles
:
mkdir -p roles/nginx/{tasks,vars,templates,handlers}
Cấu trúc sẽ là:
tasks/
: Chứa file định nghĩa task (bắt buộc).vars/
: Chứa biến (tùy chọn).templates/
: Chứa file template (tùy chọn).handlers/
: Chứa handler để restart service (tùy chọn).
Mình từng quên tạo thư mục tasks
, chạy playbook báo lỗi “role not found” – mất cả tiếng mới phát hiện. Nên nhớ: Thư mục tasks
là bắt buộc, không có là Ansible “bơ” role của bạn!
Tạo Role Cài Nginx – Thực Hành Ngay
Giờ mình sẽ tạo role nginx
để cài Nginx, dùng biến, và restart service. Cùng làm từng bước nhé!
-
Định Nghĩa Task: Tạo file
roles/nginx/tasks/main.yml
:- name: Install Nginx apt: name: nginx state: present become: yes - name: Create Nginx config from template template: src: nginx.conf.j2 dest: /etc/nginx/sites-available/default mode: '0644' notify: Restart Nginx become: yes
template:
: Copy file template với biến.notify:
: Gọi handler khi config thay đổi.
-
Thêm Biến: Tạo file
roles/nginx/vars/main.yml
:nginx_port: 8080
Biến
nginx_port
sẽ dùng trong template. -
Tạo Template: Tạo file
roles/nginx/templates/nginx.conf.j2
:server { listen {{ nginx_port }}; server_name localhost; location / { return 200 'Hello from Ansible Role!'; } }
File
.j2
cho phép chèn biến{{ nginx_port }}
. -
Thêm Handler: Tạo file
roles/nginx/handlers/main.yml
:- name: Restart Nginx service: name: nginx state: restarted become: yes
-
Chạy Playbook Với Role: Tạo file
playbook_with_role.yml
:- name: Deploy Nginx using role hosts: webservers become: yes roles: - nginx
Chạy:
ansible-playbook -i hosts playbook_with_role.yml
Kết quả:
TASK [nginx : Install Nginx] ************ changed: [web1] changed: [web2] TASK [nginx : Create Nginx config from template] **** changed: [web1] changed: [web2] RUNNING HANDLER [nginx : Restart Nginx] **** changed: [web1] changed: [web2]
Kiểm tra trên server:
ssh ubuntu@192.168.1.10 "curl localhost:8080"
Nếu thấy “Hello from Ansible Role!”, là thành công! Mình từng quên thêm
become: yes
, làm Nginx không cài được – lỗi đỏ lòm cả màn hình.
Tái Sử Dụng Role – “Đa Năng” Hơn Playbook
Role hay ở chỗ bạn có thể tái sử dụng trên nhiều playbook. Ví dụ, tạo role mysql
tương tự, rồi dùng cả nginx
và mysql
trong một playbook:
- name: Deploy full stack
hosts: webservers
become: yes
roles:
- nginx
- mysql
Mình từng dùng role nginx
cho cả môi trường production và staging, chỉ đổi biến nginx_port
– tiết kiệm cả đống thời gian!
Mẹo Nhỏ Từ Kinh Nghiệp Thật
- Kiểm tra trước: Dùng
--check
để mô phỏng:ansible-playbook -i hosts playbook_with_role.yml --check
Mình hay làm thế để tránh lỗi thực tế.
- Tên role rõ ràng: Đặt tên role ý nghĩa (VD:
webserver
,database
), đừng đểrole1
– sau này bạn sẽ quên mất nó làm gì. - Sao lưu template: Nếu template phức tạp, backup file
.j2
để tránh sửa nhầm.
Có lần mình tạo role nginx
, nhưng quên thêm handler, làm config thay đổi mà Nginx không restart – server chạy cũ, khách hàng báo lỗi 404. Từ đó, mình luôn thêm handler cho mọi role có config!
Tiếp Theo Là Gì?
Bài này tụi mình đã làm quen với Ansible Role DevOps, từ cấu trúc đến tạo role cài Nginx. Lần sau, mình sẽ kể bạn nghe về template với Jinja2 – cách làm config động, không còn hardcode lung tung nữa. Chịu không?
Thử Nghiệm Nhẹ: Thử thêm task file
vào role nginx
để tạo thư mục /var/www/html
, rồi chạy lại playbook. Có gì thắc mắc cứ nhắn mình nhé – role là bước quan trọng, làm quen tốt là bạn đã sẵn sàng cho dự án lớn!