Bài 15: Ansible Best Practices – Viết Ansible Sạch, Chạy Đỉnh Cao

Sau khi trải qua hành trình từ Ansible cơ bản (bài 1) đến Ansible Tower/AWX DevOps (bài 14), có lẽ bạn cũng đã nắm được khá rõ ràng ansible – từ ping server, viết playbook, đến quản lý cloud và bảo mật. Nhớ hồi đó, mình thường viết playbook “bừa bộn”: không có cấu trúc, không chú thích, chạy chậm và dễ sai. Rồi mình mò ra Ansible Best Practices DevOps, và đúng là “kim chỉ nam” để nâng cấp cách làm việc! Hôm nay, trong bài cuối cùng trong series này, mình sẽ chia sẻ các best practices để viết Ansible sạch và cùng thực hành tổ chức lại một playbook. Đây là món quà cuối cho bạn – hy vọng bạn áp dụng thành công trong công việc nhé!

Ansible Best Practices DevOps Là Gì? – “Nguyên Tắc Vàng” Cho Ansible

Nói đơn giản, Ansible Best Practices DevOps là các nguyên tắc và mẹo để viết playbook, role, và quản lý Ansible hiệu quả, dễ bảo trì, và tránh lỗi. Bạn có thể tưởng tượng nó như “nguyên tắc vàng” – giúp bạn từ một người viết code “tùm lum” thành một DevOps chuyên nghiệp. Hồi mới học, mình thường crams mọi thứ vào một file YAML, không dùng role, không chú thích – đến khi sửa lại thì rối như mớ bòng bong. Có lần playbook dài 200 dòng, lỗi 1 task làm mình debug cả ngày.

Sau đó, mình áp dụng best practices: chia nhỏ role, thêm chú thích, tối ưu task – playbook chạy mượt mà, team khen “sạch sẽ quá!”. Ansible Best Practices DevOps bao gồm cách tổ chức code, bảo mật, tối ưu hiệu suất, và quản lý team – đặc biệt quan trọng khi làm việc với quy mô lớn hoặc nhiều người. Đây là bài học quý mà mình muốn chia sẻ để bạn “chạm đỉnh” với Ansible!

Best Practices Cụ Thể – “Sạch Từ Trong Ra Ngoài”

Dưới đây là các nguyên tắc mình đã áp dụng và thấy hiệu quả. Mình sẽ minh họa bằng cách tổ chức lại playbook từ bài 7 (cài Nginx).

  1. Chia Nhỏ Role Và Tái Sử Dụng: Thay vì để tất cả trong một file, chia thành role rõ ràng. Từ bài 7, mình đã có role nginx, nhưng có thể tách thành:

    • common: Cài các package cơ bản.
    • nginx: Cài và cấu hình Nginx. Tạo thư mục roles/common/tasks/main.yml:
    • name: Install common packages apt: name: “{{ item }}” state: present become: yes loop:
      • python3
      • git
        
        Role `nginx` giữ nguyên (bài 7). Tái sử dụng giúp code gọn hơn – mình từng dùng `common` cho cả web và DB server.
  2. Sử Dụng Biến Và Tách Ra File Riêng: Đừng hardcode trong task. Tạo roles/nginx/vars/main.yml:

    nginx_port: 8080
    nginx_conf_path: /etc/nginx/sites-available/default

    Dùng trong roles/nginx/tasks/main.yml:

    - name: Create Nginx config from template
     template:
       src: nginx.conf.j2
       dest: "{{ nginx_conf_path }}"
       mode: '0644'
     notify: Restart Nginx
     become: yes

    Mình từng hardcode port, mỗi lần đổi là sửa cả đống task – giờ chỉ sửa biến là xong!

  3. Thêm Chú Thích Và Tài Liệu: Mỗi task nên có name rõ ràng, và thêm file README. Sửa roles/nginx/tasks/main.yml:

    - name: Install Nginx package
     apt:
       name: nginx
       state: present
     become: yes

    Tạo roles/nginx/README.md:

    # Nginx Role
    Role to install and configure Nginx server.
    - Uses port {{ nginx_port }} (configurable via vars).

    Mình từng không chú thích, team mới vào hỏi “Task này làm gì?” – mất thời gian giải thích.

  4. Tối Ưu Hiệu Suất Với Tags: Dùng tags để chạy task chọn lọc. Thêm vào roles/nginx/tasks/main.yml:

    - name: Install Nginx package
     apt:
       name: nginx
       state: present
     become: yes
     tags: install
    
    - name: Create Nginx config from template
     template:
       src: nginx.conf.j2
       dest: "{{ nginx_conf_path }}"
       mode: '0644'
     notify: Restart Nginx
     become: yes
     tags: config

    Chạy chỉ task install:

    ansible-playbook playbook_with_role.yml --tags install

    Mình từng chạy toàn bộ playbook dài 200 task, mất 10 phút – giờ dùng tags, chỉ 1 phút!

  5. Bảo Mật Với Vault: Như bài 13, mã hóa biến nhạy cảm (VD: SSH key). Thêm vào group_vars/webservers.yml:

    ssh_private_key: !vault |
           $ANSIBLE_VAULT;1.1;AES256
           66386331343063323636343738336266376237623565643366323866353266303338346666663234
           ...

    Chạy với --ask-vault-pass. Mình từng để key plaintext, lỡ commit lên Git – suýt “toang”!

  6. Kiểm Tra Và Test Trước: Dùng --check--syntax-check:

    ansible-playbook playbook_with_role.yml --check
    ansible-playbook playbook_with_role.yml --syntax-check

    Mình hay quên, chạy thẳng vào production, làm server lỗi – giờ luôn test trước.

Thực Hành Tổ Chức Playbook – “Sạch Như Mới”

Giờ mình sẽ tổ chức lại playbook cài Nginx theo best practices. Tạo cấu trúc:

roles/
  common/
    tasks/
      main.yml
  nginx/
    tasks/
      main.yml
    vars/
      main.yml
    templates/
      nginx.conf.j2
    handlers/
      main.yml
group_vars/
  webservers.yml
playbook_with_role.yml
  • roles/common/tasks/main.yml: Cài package cơ bản.
  • roles/nginx/vars/main.yml: Định nghĩa nginx_port.
  • playbook_with_role.yml:
  • name: Deploy full stack with best practices hosts: webservers become: yes vars_files:
    • group_vars/webservers.yml roles:
    • common
    • { role: nginx, tags: [‘nginx’] }
      Chạy:

      ansible-playbook playbook_with_role.yml –tags nginx –ask-vault-pass

      
      Kết quả: Nginx được cài, config áp dụng, an toàn với Vault. Mình từng không dùng role, playbook dài lê thê – giờ tổ chức thế này, dễ bảo trì hơn nhiều!

Mẹo Nhỏ Từ Kinh Nghiệm Thấy Hiệu Quả

  • Dùng Role Mặc Định: Tạo defaults/main.yml trong role để biến mặc định, dễ override.
  • Kiểm Tra Idempotent: Đảm bảo task chạy nhiều lần không đổi gì (VD: state: present).
  • Phân Quyền Team: Với AWX (bài 14), gán quyền rõ ràng – mình từng để cả team chạy production, rủi ro cao.

Cảm Nhận Sau Khi Áp Dụng Best Practices

Áp dụng Ansible Best Practices DevOps, mình thấy playbook như “tác phẩm nghệ thuật” – sạch sẽ, dễ đọc, chạy mượt mà. So với thời “bừa bộn” ban đầu, mình tiết kiệm thời gian debug và làm việc hiệu quả hơn. Cảm giác như vừa “nâng cấp” bản thân thành DevOps pro!

Lời Kết Cho Series

Đây là bài cuối của series “Sử dụng Ansible tự động hệ thống”. Từ ping server (bài 1) đến quản lý cloud và AWX (bài 14), mình hy vọng bạn đã học được cách dùng Ansible từ cơ bản đến nâng cao. Ansible Best Practices DevOps là bước cuối để bạn áp dụng vào thực tế, làm việc chuyên nghiệp hơn. Cảm ơn bạn đã đồng hành – nếu có dự án, cứ thử nhé, có gì chia sẻ mình cùng xem nhé.

Thử Nghiệm Cuối: Tái cấu trúc một playbook cũ của bạn theo best practices (dùng role, tags, Vault). Chạy và chia sẻ cảm nhận với mình nhé.

Điều hướng chuỗi bài viết<< Bài 14: Ansible Tower/AWX – Trung Tâm Điều Khiển DevOps
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận