Ansible Roles – Quản lý playbook và tái sử dụng – Bài 10

Trong bài này, mình sẽ giới thiệu một khái niệm rất quan trọng giúp bạn quản lý dự án Ansible một cách chuyên nghiệp – đó là Ansible Role.

Xem thêm:

Ansible Templates – Bài 9

Ansible Handler – Bài 8

1. Ansible Role là gì?

Hiểu đơn giản, Role là cách tổ chức code trong Ansible theo từng phần nhỏ, rõ ràng, có cấu trúc chuẩn hóa.

Thay vì viết hàng chục, hàng trăm dòng trong 1 file playbook duy nhất, với Role bạn sẽ chia nhỏ từng phần ra: task riêng, handler riêng, biến riêng, file riêng…

Ví dụ:

  • Role webserver: chứa logic cài đặt và cấu hình web server
  • Role common: chứa các cấu hình dùng chung

2. Tại sao nên dùng Role?

Lợi ích Mô tả
Dễ quản lý Tách riêng các phần giúp code rõ ràng, dễ debug
Tái sử dụng được Viết một lần, dùng ở nhiều nơi
Chuẩn hóa Dự án có cấu trúc rõ ràng, dễ bảo trì và mở rộng

3. Cấu trúc thư mục chuẩn của Role

Khi bạn tạo 1 role bằng lệnh:

ansible-galaxy init webserver

Ansible sẽ tạo sẵn một thư mục webserver với cấu trúc như sau:

webserver/
├── tasks/        # Nơi chứa các tasks chính (main.yml)
├── handlers/     # Nơi chứa các handler
├── files/        # Chứa file sẽ được copy sang máy đích
├── templates/    # Chứa file .j2 (template)
├── vars/         # Khai báo biến

Mỗi thư mục sẽ có 1 file main.yml mà Ansible sẽ tự tìm và chạy.

4. Cách sử dụng Role trong Playbook

- name: Cài Web Server
  hosts: web
  become: yes
  roles:
    - webserver

Chỉ cần gọi tên role, Ansible sẽ tự động tìm và thực hiện các file main.yml trong thư mục tasks, vars, handlers, v.v…

5. Ví dụ

Cài đặt nginx bằng Role webserver

  • tasks/main.yml
- name: Cài nginx
  apt:
    name: nginx
    state: present
  notify: Restart nginx

- name: Copy file config
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  • handlers/main.yml
- name: Restart nginx
  service:
    name: nginx
    state: restarted
  • vars/main.yml
nginx_port: 80
nginx_server_name: example.com
  • templates/nginx.conf.j2
server {
  listen {{ nginx_port }};
  server_name {{ nginx_server_name }};
}

6. Quản lý task phức tạp trong Role

Nếu số lượng task nhiều, bạn có thể chia nhỏ task thành từng file YAML khác nhau và import vào:

# tasks/main.yml
- import_tasks: installNginx.yml
- import_tasks: configureNginx.yml
- import_tasks: copyFiles.yml

Ansible sẽ chạy từng file lần lượt.

Ghi nhớ: .yaml.yml là như nhau.

7. Nơi lưu Role

  • Nếu không khai báo path, Ansible sẽ tìm role trong:
    • roles/ (ngang hàng với playbook)
    • /etc/ansible/roles
  • Bạn cũng có thể chỉ định đường dẫn tuyệt đối tới Role

Bài viết cùng chủ đề:

Ansible Modules – Bài 7

Điều kiện và vòng lặp trong Ansible – Bài 6

Ansible Variables – Biến trong Ansible là gì và cách sử dụng – Bài 5

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em