Bài 7: Ansible Roles – Sạch Sẽ Như Nhà Mới Dọn

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é!

  1. Đị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.
  2. Thêm Biến: Tạo file roles/nginx/vars/main.yml:

    nginx_port: 8080

    Biến nginx_port sẽ dùng trong template.

  3. 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 }}.

  4. Thêm Handler: Tạo file roles/nginx/handlers/main.yml:

    - name: Restart Nginx
     service:
       name: nginx
       state: restarted
     become: yes
  5. 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ả nginxmysql 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!

Điều hướng chuỗi bài viết<< Bài 6: Ansible Module Nâng Cao – Mở Rộng Khả Năng
>> Bài 8: Ansible Template Jinja2 – Config Động Như Phim Marvel
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận