Bài 9: Ansible Conditionals Và Loops – Đỉnh Cao Điều Khiển

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 iffor đã đủ, 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 whenloop 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ểu when: 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!

Điều hướng chuỗi bài viết<< Bài 8: Ansible Template Jinja2 – Config Động Như Phim Marvel
>> Bài 10: Ansible Error Handling – Không Panic Khi Fail
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận