Saturday, January 18, 2025

[Ansible] When trong Ansible

-

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

retriesuntil: 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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories