Điều kiện và vòng lặp trong Ansible – Bài 6

Trong bài viết này chúng ta sẽ tìm hiểu về điều kiện (Conditionals)vòng lặp (Loops) trong Ansible.

Xem thêm:

ansible playbook là gì? Cấu trúc và cách viết chuẩn – Bài 4

Ansible Variables – Biến trong Ansible là gì và cách sử dụng – Bài 5

1. Ansible Conditionals là gì?

Ansible Conditionalsnếu một điều kiện nào đó đúng, thì Ansible mới thực hiện task.

Điều kiện trong Ansible thường được viết bằng từ khóa when. Bạn có thể dùng để kiểm tra:

  • Biến bạn tự khai báo
  • Biến facts mà Ansible thu thập từ hệ thống
  • Biến register sau khi chạy một lệnh nào đó

Ví dụ

Bạn có 2 server:

  • 1 máy chạy Red Hat
  • 1 máy chạy Debian

Yêu cầu:

  • Nếu là Red Hat thì cài httpd
  • Nếu là Debian thì cài apache2

Không cần tạo 2 play riêng — bạn chỉ cần viết 1 play, và dùng điều kiện để phân nhánh:

- name: Install Web Server
  hosts: all
  tasks:
    - name: Install httpd on Red Hat
      yum:
        name: httpd
        state: present
      when: ansible_facts['os_family'] == "RedHat"

    - name: Install apache2 on Debian
      apt:
        name: apache2
        state: present
      when: ansible_facts['os_family'] == "Debian"

Dùng điều kiện kết hợp and, or, not

Bạn có thể kết hợp nhiều điều kiện:

when: ansible_facts['processor_cores'] > 1 and ansible_facts['memtotal_mb'] > 1024

Hoặc viết dạng list:

when:
  - ansible_facts['processor_cores'] > 1
  - ansible_facts['memtotal_mb'] > 1024

Bạn cũng có thể dùng or, not, in, v.v.

Điều kiện với biến register

Sau khi chạy một command, bạn có thể lưu kết quả vào biến và kiểm tra điều kiện:

- name: Check Docker
  command: which docker
  register: docker_check
  ignore_errors: true

- name: Notification Docker available
  debug:
    msg: "Docker installed"
  when: docker_check.rc == 0

- name: Alert if not install Docker
  debug:
    msg: "Docker is not installed"
  when: docker_check.rc != 0

2. Ansible Loops

Dùng loop với danh sách đơn giản

- name: Install packages
  apt:
    name: "{{ item }}"
    state: present
  loop:
    - nginx
    - curl
    - git

Ở đây, biến itemmặc định có sẵn trong loop, không cần khai báo.

Dùng loop với danh sách dictionary

- name: Create user
  user:
    name: "{{ item.name }}"
    uid: "{{ item.uid }}"
  loop:
    - { name: "user1", uid: 1001 }
    - { name: "user2", uid: 1002 }

Khi item là một dictionary, bạn dùng item.key để lấy giá trị.

Dùng loop với dictionary (key-value)

Bạn có thể biến dictionary thành danh sách key-value bằng filter dict2items:

vars:
  env:
    ENVIRONMENT: dev
    STAGE: test

- name: Print variable
  debug:
    msg: "{{ item.key }} = {{ item.value }}"
  loop: "{{ env | dict2items }}"

Kết hợp loop và điều kiện

Bạn có thể dùng when trong loop:

- name: Install packages
  apt:
    name: "{{ item }}"
    state: present
  loop:
    - nginx
    - apache2
  when: ansible_facts['os_family'] == "Debian"

3. Bonus: with_items, with_file, until

Trước đây, Ansible có nhiều kiểu loop gọi là with_x:

Cú pháp Dùng để…
with_items Lặp danh sách
with_file Đọc nội dung từ file
with_dict Lặp dictionary

Ví dụ:

- name: Dùng with_items
  debug:
    msg: "{{ item }}"
  with_items:
    - one
    - two

Nhưng hiện tại Ansible khuyến khích dùng loop thay thế cho with_x để code đồng bộ hơn.

until – Lặp lại task cho đến khi điều kiện đúng

Khác với loop, until giúp bạn thử lại task nhiều lần cho đến khi đạt yêu cầu.

- name: Check Service
  shell: systemctl is-active apache2
  register: apache_status
  until: apache_status.stdout == "active"
  retries: 5
  delay: 10

Cảm ơn bạn đã tham khảo ansible tutorial trên ttnguyen.net

Bài viết cùng chủ đề:

Ansible là gì? Vì sao chúng ta lại cần nó – Bài 1

Làm quen với YAML – Bài 2

Ansible Inventory – Bài 3

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em