Kiểm Thử Role với Molecule

K
Kai··5 min read

Role (Bài 8) bạn viết — làm sao chắc nó đúng trước khi áp lên fleet thật? Chạy thử trên server production thì nguy hiểm. Molecule giải quyết: dựng một môi trường tạm (thường là container), áp role lên đó, kiểm tra idempotencyverify kết quả — tự động, lặp lại được, đưa vào CI được. Đây là best practice chất lượng cho role dùng chung.

Vì sao kiểm thử role

Role không kiểm thử dễ ẩn lỗi: chạy được trên máy bạn nhưng hỏng trên OS khác, hoặc không idempotent (chạy lần hai vẫn báo changed — sai). Molecule tự động hóa việc kiểm tra này trong môi trường sạch, mỗi lần sửa role chạy lại được. Với role chia sẻ (collection — Bài 9), molecule gần như bắt buộc.

Cài đặt

pip install molecule "molecule-plugins[docker]" docker
molecule --version
molecule 26.4.0 using python 3.11
    ansible:2.19.10

Molecule cần một driver để dựng môi trường tạm — phổ biến nhất là docker (container nhẹ, nhanh, sạch). Cần Docker chạy trên máy (series Docker).

Tạo scenario

Trong thư mục role, tạo một scenario test:

cd roles/baseline
molecule init scenario
INFO  default ➜ init: Initialized scenario in roles/baseline/molecule/default successfully.

Nó tạo thư mục molecule/default/:

molecule/default/
├── molecule.yml      # cấu hình: driver, platform (image), test sequence
├── create.yml        # cách dựng môi trường tạm
├── converge.yml      # playbook áp ROLE cần test
├── verify.yml        # kiểm tra kết quả (assertions)
└── destroy.yml       # dọn môi trường

Hai file bạn chỉnh nhiều nhất:

converge.yml — áp role cần test lên môi trường tạm:

---
- name: Converge
  hosts: all
  tasks:
    - name: Áp role baseline
      ansible.builtin.include_role:
        name: baseline

verify.yml — kiểm tra role làm đúng (giống unit test):

---
- name: Verify
  hosts: all
  tasks:
    - name: File cấu hình phải tồn tại
      ansible.builtin.stat:
        path: /etc/baseline.conf
      register: conf

    - name: Khẳng định file có
      ansible.builtin.assert:
        that:
          - conf.stat.exists
        fail_msg: "Thiếu /etc/baseline.conf — role lỗi"

molecule.yml cấu hình driver và platform (image container để test, ví dụ một image Ubuntu/Fedora có sẵn Ansible). Bạn test role trên đúng OS đích.

Vòng đời test: molecule test

Lệnh chính là molecule test, chạy một chuỗi (test sequence) đầy đủ:

molecule test

Chuỗi mặc định (từ molecule.yml):

   dependency → create → converge → idempotence → verify → destroy
        │          │         │           │            │         │
   tải role/    dựng     áp ROLE     CHẠY LẠI       chạy     xóa môi
   collection   container  vào đó    converge,      verify   trường tạm
   cần thiết               (lần 1)   PHẢI changed=0  (assert)

Bước quan trọng nhất là idempotence: Molecule chạy converge lần haibắt buộc changed=0. Nếu role của bạn không idempotent (Bài 5) — ví dụ dùng command không có creates: — bước này thất bại, lộ ra lỗi mà mắt thường khó thấy. Đây là giá trị lớn nhất của molecule: ép role thật sự idempotent.

Khi phát triển, bạn thường chạy từng bước thay vì cả chuỗi:

molecule create      # dựng container một lần
molecule converge    # áp role (chạy nhiều lần khi sửa role)
molecule verify      # chạy kiểm tra
molecule login       # SSH vào container để soi thủ công
molecule destroy     # dọn

Vòng converge → sửa role → converge lại rất nhanh (container đã sẵn), hợp cho phát triển.

Lưu ý phiên bản (đã gặp thực tế)

Molecule thay đổi khá nhiều giữa các phiên bản lớn. Với Molecule 26.x (bản mới khi viết bài):

  • Cờ -d <driver> của init scenario đã bị bỏ — driver cấu hình trong molecule.yml/create.yml.
  • Molecule bắt buộc role có tên hợp chuẩn Galaxy (qua ansible_compat): nếu chạy molecule test với role tên trần như baseline mà không nằm trong collection hay thiếu meta/main.yml đúng, bạn gặp lỗi "Computed fully qualified role name ... does not follow current galaxy requirements".

Đây thực ra là một bài học best-practice (Bài 15): role nghiêm túc nên có meta/main.yml khai báo galaxy_info (author, license, namespace) và lý tưởng là sống trong một collection. Cách xử lý: điền meta/main.yml đầy đủ, hoặc đặt role trong cấu trúc collection (Bài 9), hoặc pin một phiên bản molecule cũ hơn nếu cần khớp tài liệu cũ. Luôn đọc molecule --version và tài liệu đúng phiên bản — đây là công cụ tiến hóa nhanh.

Molecule trong CI

Sức mạnh thật của molecule là chạy tự động trong CI (GitHub Actions...) mỗi khi sửa role: push code → CI chạy molecule test → biết ngay role còn idempotent và đúng không, trên nhiều OS. Kết hợp ansible-lint (Bài 15) để bắt lỗi phong cách. Đây là quy trình của các role chất lượng trên Galaxy.

🧹 Dọn dẹp

Molecule tự destroy container sau test. Scenario mẫu ở repo nghiadaulau/ansible-series, thư mục 14-molecule.

Tổng kết

Molecule kiểm thử role tự động trong môi trường tạm (container qua driver docker). molecule init scenario tạo scenario (converge.yml áp role, verify.yml kiểm tra). molecule test chạy chuỗi create → converge → idempotence → verify → destroy — trong đó idempotence (chạy converge lần hai, bắt buộc changed=0) là kiểm tra giá trị nhất, ép role thật sự idempotent. Phát triển thì dùng molecule converge/verify từng bước. Lưu ý molecule tiến hóa nhanh và bản mới bắt role tuân chuẩn Galaxy (nên có meta/main.yml/collection). Chạy molecule + ansible-lint trong CI cho role chất lượng.

Đã biết viết, mở rộng, tối ưu, kiểm thử — Bài 15 gom thành best practices: cấu trúc dự án, thiết kế role, quy ước đặt tên, và ansible-lint.