Trong bài viết này chúng ta sẽ tìm hiểu về điều kiện (Conditionals) và 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 Conditionals là nế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
registersau 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 item là mặ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
Ansible Inventory – Bài 3