Danh sách bài viết trong series Sử dụng Ansible tự động hệ thống
- Bài 1: Ansible Là Gì Mà Dân DevOps Mê Thế?
- Bài 2: Ansible Inventory – Danh Bạ Server Của Bạn
- Bài 3: Ansbile Ad-Hoc – Lệnh Nhanh Như Chớp
- Bài 4: Ansbile Playbook Đầu Tiên – Đừng Sợ YAML
- Bài 5: Ansible Variables – Bí Kíp Linh Hoạt Hóa Mọi Thứ
- Bài 6: Ansible Module Nâng Cao – Mở Rộng Khả Năng
- Bài 7: Ansible Roles – Sạch Sẽ Như Nhà Mới Dọn
- Bài 8: Ansible Template Jinja2 – Config Động Như Phim Marvel
- Bài 9: Ansible Conditionals Và Loops – Đỉnh Cao Điều Khiển
- Bài 10: Ansible Error Handling – Không Panic Khi Fail
- Bài 11: Ansible Quản Lý Cloud – Chơi Lớn Với AWS
- Bài 12: Ansible Dynamic Inventory – Danh Sách Server Tự Động
- Bài 13: Ansible Vault – Khóa Két Sắt Cho Bí Mật
- Bài 14: Ansible Tower/AWX – Trung Tâm Điều Khiển DevOps
- Bài 15: Ansible Best Practices – Viết Ansible Sạch, Chạy Đỉnh Cao
Sau khi làm quen với Ansible Template Jinja2 ở bài trước, mình đã thấy template giúp tạo config động “thần thánh” thế nào – kiểu như Iron Man tự động điều chỉnh mọi thứ. Nhưng hồi đó, mình gặp vấn đề: Làm sao để playbook chạy task có chọn lọc, kiểu chỉ cài package trên Ubuntu, hay lặp lại task cho nhiều file? Rồi mình phát hiện ra Ansible Conditionals Loops DevOps, và đúng là “đỉnh cao điều khiển”! Hôm nay, mình sẽ kể bạn nghe Ansible Conditionals Loops DevOps là gì, cách dùng conditionals (when
) và loops (loop
) để làm playbook thông minh, và cùng thực hành một ví dụ để bạn thấy sức mạnh của nó. Cùng bắt đầu nhé!
Ansible Conditionals Loops DevOps Là Gì? – “Bộ Não” Của Playbook
Nói đơn giản, Ansible Conditionals Loops DevOps là cách thêm logic điều khiển vào playbook: conditionals (when
) để chạy task có điều kiện, và loops (loop
) để lặp lại task nhiều lần. Bạn có thể tưởng tượng chúng như “bộ não” của playbook – giúp nó quyết định “làm gì” và “làm bao nhiêu lần”. Hồi mới làm DevOps, mình toàn viết playbook chạy “cứng” – mọi server đều chạy hết task, không phân biệt hệ điều hành hay trạng thái. Có lần mình cài apt
package trên CentOS, báo lỗi đỏ lòm – mất cả buổi mới phát hiện CentOS dùng yum
. Từ đó, mình học conditionals và loops, và playbook của mình “thông minh” hơn hẳn.
Ansible Conditionals Loops DevOps đặc biệt hữu ích khi quản lý nhiều server với môi trường khác nhau. Ví dụ:
- Conditionals: Chỉ cài Nginx trên Ubuntu, dùng
yum
cho CentOS. - Loops: Tạo 5 user cùng lúc thay vì viết 5 task giống nhau.
Mình từng nghĩ Bash script với
if
vàfor
đã đủ, nhưng conditionals và loops trong Ansible dễ dùng hơn, đặc biệt khi kết hợp với biến và template.
Conditionals Với when
– “Làm Khi Nào?”
Conditionals trong Ansible Conditionals Loops DevOps dùng từ khóa when
để chạy task có điều kiện. Điều kiện dựa trên biến hoặc facts (thông tin server mà Ansible thu thập). Ví dụ, cài nginx
chỉ trên Ubuntu. Tạo file conditional.yml
:
- name: Install Nginx with conditionals
hosts: webservers
become: yes
tasks:
- name: Install Nginx on Ubuntu
apt:
name: nginx
state: present
when: ansible_os_family == "Debian"
- name: Install Nginx on CentOS
yum:
name: nginx
state: present
when: ansible_os_family == "RedHat"
ansible_os_family
: Fact nội tại, trả về “Debian” (Ubuntu) hoặc “RedHat” (CentOS).when:
: Chỉ chạy task nếu điều kiện đúng.
Chạy playbook:
ansible-playbook -i hosts conditional.yml
Kết quả sẽ cài Nginx đúng theo hệ điều hành. Mình từng quên kiểm tra facts, viết when: ansible_os == "Ubuntu"
(sai cú pháp), làm playbook bỏ qua task – debug cả tiếng mới ra. Nên nhớ: Dùng ansible_os_family
để phân biệt họ hệ điều hành, chính xác hơn!
Loops Với loop
– “Làm Bao Nhiêu Lần?”
Loops trong Ansible Conditionals Loops DevOps dùng từ khóa loop
để lặp lại task. Trước đây, nếu cần tạo 5 user, mình viết 5 task giống nhau – dài dòng và dễ sai. Với loop
, mọi thứ gọn hơn nhiều. Ví dụ, tạo nhiều user. Tạo file loop_users.yml
:
- name: Create multiple users
hosts: webservers
become: yes
tasks:
- name: Create users
user:
name: "{{ item }}"
state: present
shell: /bin/bash
create_home: yes
loop:
- user1
- user2
- user3
loop:
: Danh sách giá trị để lặp.{{ item }}
: Giá trị hiện tại trong vòng lặp.
Chạy:
ansible-playbook -i hosts loop_users.yml
Kết quả sẽ tạo 3 user: user1
, user2
, user3
. Mình từng dùng with_items
(cách cũ), nhưng từ Ansible 2.5, loop
là chuẩn – nhanh và dễ đọc hơn.
Thực Hành Nhẹ: Kết Hợp Conditionals Và Loops
Giờ bạn thử kết hợp cả hai: cài package và tạo file cho user, nhưng chỉ trên Ubuntu. Dựa trên role nginx
từ bài 7, thêm logic. Tạo file roles/nginx/tasks/main.yml
:
- name: Install Nginx on Debian
apt:
name: nginx
state: present
when: ansible_os_family == "Debian"
- name: Create log directories for users
file:
path: "/var/log/nginx/{{ item }}"
state: directory
mode: '0755'
loop:
- user1
- user2
- user3
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
Chạy playbook:
ansible-playbook -i hosts playbook_with_role.yml
Kết quả sẽ cài Nginx trên Ubuntu, tạo thư mục /var/log/nginx/user1
, /var/log/nginx/user2
, /var/log/nginx/user3
, và apply config. Kiểm tra:
ssh ubuntu@192.168.1.10 "ls /var/log/nginx"
Nếu thấy các thư mục user, là thành công! Mình từng quên become: yes
, làm task file
lỗi “permission denied” – suýt khóc vì tưởng khó.
Mẹo Nhỏ Từ Kinh Nghiệm Thật
- Kiểm tra facts: Dùng
ansible -m setup
để xem facts:ansible web1 -i hosts -m setup
Mình hay dùng cái này để kiểm tra
ansible_os_family
. - Kết hợp
when
vàloop
cẩn thận: Nếu điều kiện sai, task sẽ bỏ qua – luôn debug trước. - Dùng
when
với biến: Kết hợp với biến từ bài 5, kiểuwhen: env_type == "production"
.
Có lần mình dùng loop
để xóa file log, nhưng quên thêm when
, làm xóa nhầm file log trên production… Từ đó, mình luôn kiểm tra điều kiện kỹ trước khi chạy loop :)))
Cảm Nhận Sau Khi Dùng Conditionals Và Loops
Lần đầu dùng Ansible Conditionals Loops DevOps, mình thấy nó như “bộ não” thật – playbook không còn chạy “cứng” nữa, mà “thông minh” hơn hẳn. So với Bash script, conditionals và loops trong Ansible dễ viết và mạnh mẽ hơn, đặc biệt khi quản lý nhiều server. Cảm giác như vừa nâng cấp playbook lên “cấp độ thiên tài” – điều khiển mọi thứ chính xác và hiệu quả!
Tiếp Theo Là Gì?
Bài này tụi mình đã làm quen với Ansible Conditionals Loops DevOps, từ when
đến loop
. Lần sau, mình sẽ kể bạn nghe về error handling – cách xử lý lỗi trong playbook để không “panic” khi fail. Chịu không?
Thử Nghiệm Nhẹ: Thử thêm điều kiện when: ansible_os_family == "RedHat"
với module yum
vào role nginx
, rồi chạy lại. Có gì thắc mắc cứ nhắn mình nhé – conditionals và loops là “vũ khí” mạnh, làm quen tốt là bạn đã đi xa!