Ansible Loops
Trong playbook, tác vụ lặp lại rất thường gặp (ví dụ tạo nhiều users).
Nếu copy-paste cùng một task nhiều lần, file sẽ dài, khó đọc và khó bảo trì. loop giúp giải quyết vấn đề này.
1) Vì sao cần loops?
Ví dụ tạo 1 user thì đơn giản:
- name: Create one user
user:
name: joe
state: present
Nhưng khi có 10, 50, 100 users, cách tốt hơn là dùng một task + loop.
Không dùng loop:
Task 1 create joe
Task 2 create george
Task 3 create ravi
...
Dùng loop:
One task + iterate users[]
2) loop và biến item hoạt động thế nào?
loop chạy cùng một task nhiều lần.
Mỗi vòng lặp, Ansible đặt giá trị hiện tại vào biến mặc định tên là item.
- name: Create multiple users
user:
name: ""
state: present
loop:
- joe
- george
- ravi
Cách “visualize” để dễ hiểu
Iteration 1 -> item = "joe"
Iteration 2 -> item = "george"
Iteration 3 -> item = "ravi"
Tức là cùng một task nhưng được “nở ra” thành nhiều lần chạy với item khác nhau.
3) Loop với array of dictionaries
Khi mỗi user cần nhiều thuộc tính (vd name, uid), dùng list of dictionaries.
- name: Create users with uid
user:
name: ""
uid: ""
state: present
loop:
- { name: "joe", uid: 1001 }
- { name: "george", uid: 1002 }
- { name: "ravi", uid: 1003 }
Ở đây item không còn là string nữa, mà là object/dictionary.
- Lấy username:
item.name - Lấy uid:
item.uid
item (iteration #1)
name: joe
uid: 1001
item (iteration #2)
name: george
uid: 1002
4) loop vs with_items
Bạn có thể gặp cả hai cách viết:
loop: ""
hoặc kiểu cũ:
with_items: ""
- Với simple loop hiện nay, ưu tiên dùng
loop - Nhưng cần hiểu
with_itemsvì vẫn xuất hiện trong playbook cũ
5) Mở rộng với các with_* directives
with_items chỉ là một biến thể.
Ansible còn nhiều dạng with_* khác (ví dụ làm việc với files, URLs, data sources…).
Về bản chất, phần sau with_ thường gắn với lookup plugin.
- lookup plugin = cơ chế lấy dữ liệu từ nguồn bên ngoài (file, URL, hệ thống khác)
- sau khi lấy dữ liệu, task sẽ iterate trên dữ liệu đó
Kết luận
Loops là một trong các kỹ thuật quan trọng nhất để giữ playbook:
- ngắn gọn
- ít lặp code
- dễ mở rộng
Nắm chắc loop + item (string và dictionary) sẽ giúp bạn đọc nhanh cả playbook mới lẫn playbook legacy dùng with_items.