Kiểm Thử Role với Molecule
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 idempotency và verify 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 hai và bắ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ủainit scenariođã bị bỏ — driver cấu hình trongmolecule.yml/create.yml. - Molecule bắt buộc role có tên hợp chuẩn Galaxy (qua
ansible_compat): nếu chạymolecule testvới role tên trần nhưbaselinemà không nằm trong collection hay thiếumeta/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.