[Ansible] Phần 12: Top 10 tips khi sử dụng Ansible

Tác giả: 09/12/2023

Ansible làm cho việc tạo, chia sẻ, và quản lý tự động hóa dễ dàng hơn rất nhiều, nhưng cũng như bất kỳ công cụ nào, trong bài viết này mình sẽ chia sẻ 1 vài tips để giúp các bạn sử dụng Ansible hiệu quả hơn.

1. Sử dụng version control

Sử dụng version control là 1 tiêu chuẩn của lập trình, và Ansible không phải ngoại lệ. Hãy chắc chắn là luôn giữ các playbook, role, inventory, và variable ở Git hoặc bất kỳ hệ thống version control nào khác.

2. Sử dụng khoảng trắng và comment

Ansible sử dụng YAML để viết playbook, và ký tự khoảng trắng được YAML dùng để định nghĩa cấu trúc document và đánh dấu sự lồng ghép.

Ví dụ:

foo: bar
  dah: dum
  lah:
    dee: dah
    dah: dee

Sẽ được dịch sang Python (bằng thư viện PyYAML) là:

foo: bar
dah: dum
lah: {'dee': 'dah', 'dah':'dee'}

Sử dụng dấu comments là 1 cách tốt để mô tả ý nghĩa của dòng code. Nhưng cố gắng đừng lạm dụng nó nhé! Trong YAML thì ta dùng ký tự # để comment

# Đây là comment

3. Đặt cho biến những cái tên có ý nghĩa

Đặt tên 1 biến bằng tên vai trò của chúng để tránh bị  khi lâu lâu đọc lại code:

apache_max_keepalive: 25
apache_port: 80
tomcat_port: 8080

Thay vì:

max_keepalive: 25
port: 80
port: 8080

4. Sử dụng role để giúp playbook gọn hơn

Trong khi có rất nhiều cách để tổ chức nội dung trong playbook, 1 cách tốt hơn thảy đó là sử dụng roles trong Ansible. Chúng ta sẽ có 1 bài riêng để nói về roles sau, ví dụ đây là 1 cấu trúc thư mục sử dụng role:

site.yml
webservers.yml
fooservers.yml
roles/
    common/
        tasks/
        handlers/
        files/
        templates/
        vars/
        defaults/
        meta/
    webservers/
        tasks/
        defaults/
        meta/

5. Kiểm thử ansible playbook

Nếu bạn đang tìm kiếm 1 cách để kiểm thử playbook trước khi thực sự sử dụng nó, thì dưới đây là 1 vài cách để làm điều này:

  • -vvvv: kiểm tra kết nối
  • --step: ansible sẽ hỏi liệu bạn có muốn tiếp tục trước mỗi task
  • --check: ansible sẽ chỉ dự đoán kết quả khi chạy playbook chứ không thực hiện thay đổi nào cả
  • --diff: ansible sẽ cung cấp sự khác nhau giữa trước và sau play
  • --start-at-task: bắt đầu playbook ở 1 task chỉ định nào đó

6. Sử dụng cú pháp block

Cú pháp block đã được nhắc đến ở phần 11, nó giúp ta dễ dàng thiết lập dữ liệu hoặc chỉ thị cho 1 tập các task dùng chung mục đích. Cùng với đó là cho phép rollback khi gặp phải thay đổi nghiêm trọng.

tasks:
   - name: Install, configure, and start Apache
     block:
       - name: install httpd and memcached
         yum:
           name:
           - httpd
           - memcached
           state: present

       - name: apply the foo config template
         template:
           src: templates/src.j2
           dest: /etc/foo.conf
       - name: start service bar and enable it
         service:
           name: bar
           state: started
           enabled: true
     when: ansible_facts['distribution'] == 'CentOS'
     become: true
     become_user: root
     ignore_errors: yes

7. Sử dụng cấu trúc tệp inventory riêng cho môi trường staging và production

Bạn sẽ không muốn thực hiện các thay đổi thử nghiệm lên trên các server production đâu. Để tránh điều này, hãy sử dụng các tệp inventory tách biệt cho môi trường staging và production. Như thế này chẳng hạn:

|----inventories/   
|    |--dev/
|    |  |--group_vars/...
|    |  |--host_vars/...
|    |--prod/
|       |--group_vars/...
|       |--host_vars/
|            |--my_playbook_hostname_vars.yml
|----roles/...     
|----hosts.yml    
|----my_playbook.yml  
|

8. Hiểu về từ khóa serial

Bạn có thể kiểm soát số lượng máy chủ được thực hiện cùng 1 lúc với từ khóa serial. Mặc định, Ansible sẽ cố gắng quản lý tất cả hệ thống được sử dụng trong play đó song song với nhau. Tuy nhiên ta có thể chỉ định số lượng host thực hiện play đồng thời bằng từ khóa serial

- name: test play
  hosts: webservers
  serial: 2
  gather_facts: False

  tasks:
    - name: task one
      command: hostname
    - name: task two
      command: hostname

9. Sử dụng modules đúng với mục đích

Mục đích của Ansible là khiến mọi thứ đơn giản và thuận tiện nhất có thể. Vì vậy khi bạn có thể sử dụng lệnh như commandshellraw và script để thực hiện các hoạt động trên terminal, thì cũng đừng nên làm vậy. Hãy sử dụng module của ansible để thực hiện nó.

Ví dụ 1 service hoàn toàn có thể được restart bằng lệnh systemctl restart foo.bar thì hãy sử dụng module service của ansible để thay thế

- name: Restart service foo
  service:
    name: foo.bar
    state: restarted

10. Hạn chế debug quá nhiều

Trong khi debugging rất tiện dụng, debug module lại có thể khiến đầu ra khi chạy playbook bị lộn xộn. Ví dụ ta có thể debug ra chỉ khi playbook được chạy với verbosity là 3

- debug:
   msg: "I always display!"

- debug:
   msg: "I only display with ansible-playbook -vvv+"
   verbosity: 3

Tổng kết

Có nhiều cách để sử dụng Ansible, trên đây chỉ là những tips mình rút ra trong quá trình làm việc với nó. Đừng coi đây là 1 tôn chỉ gì cả, hãy nghĩ đơn giản nó là 1 lời khuyên thôi.

Mình là Vương Bảo Trung, hiện đang học việc tại Công ty TNHH Phần mềm Nhân Hòa, các bạn hãy theo dõi các bài viết tiếp theo của mình tại Wiki Nhân Hòa.

Chúc các bạn luôn may mắn và thành công trong công việc!

Trả lời