Trong Ansible, when
được sử dụng để chỉ định điều kiện để thực thi một task. Có thể sử dụng các toán tử so sánh, các hàm, hoặc các biến để tạo điều kiện. Dưới đây là một ví dụ nâng cao về cách sử dụng when
.
Tham số trong When.
Trong Ansible, khi sử dụng module when
, có thể sử dụng một số tham số để thêm tính linh hoạt và tùy chỉnh điều kiện. Một số tham số đó bao gồm:
changed_when
: tham số này dùng để chỉ định một giá trị boolean để quyết định khi nào một task được xem là đã thay đổi. Giá trị mặc định làfalse
. Ví dụ:
- name: Ensure the package is installed
apt:
name: mypackage
state: present
changed_when: false
when: ansible_os_family == 'Debian'
failed_when
: tham số này dùng để chỉ định một giá trị boolean để quyết định khi nào một task được xem là đã thất bại. Giá trị mặc định là false
. Ví dụ:
- name: Run a command and fail only if it returns a specific result code
command: /bin/false
register: result
failed_when: "'specific result code' in result.stderr"
ignore_errors
: tham số này dùng để xác định xem task có bị bỏ qua nếu xảy ra lỗi không. Giá trị mặc định là false
. Ví dụ:
- name: Stop a service if it's running
service:
name: myservice
state: stopped
ignore_errors: true
retries
và until
: tham số này dùng để xác định khi nào task được thực hiện lại nhiều lần và khi nào task sẽ được thực hiện thành công. Ví dụ:
- name: Wait for a service to start
service:
name: myservice
state: started
retries: 5
delay: 10
until: "'ACTIVE' in {{ service_status.stdout }}"
Giả sử bạn muốn kiểm tra xem một file đã tồn tại trước khi sao chép nó từ máy local đến remote. Nếu file đã tồn tại, bạn sẽ bỏ qua việc sao chép. Nếu không, bạn sẽ sao chép file đó.
Bạn có thể sử dụng stat
module để kiểm tra xem file đã tồn tại hay chưa. Dưới đây là một ví dụ playbook để kiểm tra và sao chép file.
- name: Check and copy file
hosts: server
tasks:
- name: Check if file exists
stat:
path: /path/to/file
register: file_status
- name: Copy file if it doesn't exist
copy:
src: /local/path/to/file
dest: /remote/path/to/file
when: not file_status.stat.exists
Trong playbook này, task đầu tiên sử dụng stat
module để kiểm tra xem file có tồn tại hay không. Kết quả được lưu trữ trong biến file_status
. Task thứ hai sử dụng copy
module để sao chép file từ máy local đến remote, nhưng chỉ khi file chưa tồn tại trên remote. Điều kiện này được định nghĩa bằng when: not file_status.stat.exists
. Nếu file đã tồn tại trên remote, task thứ hai sẽ bị bỏ qua và không được thực thi.
Thực hiện 1 task khi một biến cụ thể được xác định.
Ví dụ, bạn muốn thực hiện một task chỉ khi một biến cụ thể được xác định, bạn có thể sử dụng when
như sau:
- name: Install Apache
apt:
name: apache2
state: present
when: apache_installed == False
Trong ví dụ này, task sẽ chỉ được thực thi khi biến apache_installed
có giá trị là False
.
Bạn cũng có thể sử dụng toán tử so sánh để xác định điều kiện.
- name: Restart Apache
service:
name: apache2
state: restarted
when: apache_status.changed
Trong ví dụ này, task sẽ chỉ được thực thi nếu trạng thái của dịch vụ Apache đã thay đổi từ lần thực thi trước đó.
when
là một trong những từ khóa quan trọng và hữu ích trong Ansible, giúp bạn kiểm soát các bước thực thi của các task và play.
Ví dụ xử lý thư mục chứa Database.
Ví dụ tiếp theo, để thực hiện điều kiện kiểm tra nếu {{clearDB}} bằng yes thì chạy 3 lệnh dưới đây: rm -rf {{prometheus_db}}, mkdir -p {{prometheus_db}}, chown 65534:65534 {{prometheus_db}}, bạn có thể sử dụng module “command” và module “when” của Ansible để thực hiện như sau:
- name: Remove Prometheus DB if clearDB is yes
command: rm -rf {{ prometheus_db }}
when: clearDB == "yes"
- name: Create Prometheus DB directory if it does not exist
command: mkdir -p {{ prometheus_db }}
when: clearDB == "yes"
- name: Set Prometheus DB owner to 65534:65534 if clearDB is yes
command: chown 65534:65534 {{ prometheus_db }}
when: clearDB == "yes"
Trong đó, module “command” được sử dụng để thực hiện các lệnh shell. Tham số “when” được sử dụng để chỉ định rằng các lệnh chỉ được thực thi khi biến {{clearDB}} bằng “yes”.
Sử dụng các biểu thức điều kiện phức tạp.
Trong Ansible, bạn có thể sử dụng các biểu thức điều kiện phức tạp bằng cách sử dụng toán tử and
, or
hoặc not
. Ví dụ, nếu bạn muốn kiểm tra hai điều kiện cùng một lúc, bạn có thể sử dụng toán tử and
như sau:
- name: Check if container exists and is running
shell: docker ps -q -f name={{ project_name }}
register: container_running
ignore_errors: yes
when: project_name is defined
- name: Stop container if it exists and is running
docker_container:
name: "{{ project_name }}"
state: stopped
when: container_running.stdout != "" and container_running.rc == 0
Trong ví dụ này, chúng tôi sử dụng biểu thức điều kiện and
để kiểm tra nếu container đã tồn tại và đang chạy. Nếu cả hai điều kiện đều đúng, chúng tôi tiến hành stop container. Lưu ý rằng chúng tôi sử dụng ignore_errors: yes
ở task đầu tiên để tránh báo lỗi nếu container chưa tồn tại.