Bài 4: Ansbile Playbook Đầu Tiên – Đừng Sợ YAML

Sau khi làm quen với lệnh ad-hoc ở bài trước, mình đã thấy Ansible Ad-Hoc DevOps nhanh và tiện thế nào – kiểu “tay nhanh hơn não” luôn! Nhưng mà ad-hoc chỉ hợp với việc nhỏ, còn nếu bạn muốn tự động hóa một chuỗi task dài hạn, kiểu như cài Nginx, copy config, rồi restart service, thì phải dùng đến Ansible Playbook DevOps. Hồi mới học, mình nghe đến YAML là run, nghĩ: “Trời ơi, lại ngôn ngữ mới, chắc khó lắm!”. Nhưng hóa ra YAML dễ hơn cả Excel. Hôm nay, mình sẽ kể bạn nghe Ansible Playbook DevOps là gì, cách viết playbook đầu tiên, và cùng làm một ví dụ nhỏ để bạn tự tin hơn. Đừng sợ YAML, mình dẫn bạn đi từng bước nhé!

Ansible Playbook Là Gì? – “Kế Hoạch Dài Hạn” Của DevOps

Nói đơn giản, Ansible Playbook DevOps là một file YAML chứa danh sách các task mà Ansible sẽ chạy trên server. Nếu ad-hoc (bài 3) là “lệnh đột kích” – gõ một dòng là xong, thì playbook là “kế hoạch dài hạn” – bạn viết ra, lưu lại, chạy đi chạy lại nhiều lần. Hồi mới làm DevOps, mình toàn dùng ad-hoc để cài package hay restart service, nhưng mỗi lần cần làm lại là phải gõ lại lệnh – vừa mệt vừa dễ quên. Có lần mình cần cài Nginx, copy config, và restart trên 5 server, gõ ad-hoc từng bước mà rối cả đầu, cuối cùng quên restart, làm server không chạy. Từ đó, mình chuyển sang dùng playbook, và đúng là “đời lên hương”!

Ansible Playbook DevOps dùng YAML (Yet Another Markup Language) để viết, nhìn qua thì giống một file cấu hình, dễ đọc hơn JSON hay XML nhiều. Playbook gồm các “play” (kế hoạch), mỗi play chứa nhiều task (nhiệm vụ). Ví dụ, một playbook có thể:

  • Cài Nginx.
  • Copy file config.
  • Restart Nginx. Tất cả chỉ trong một file – chạy một lần là xong, không cần gõ tay từng lệnh như ad-hoc. Mình thích playbook vì nó giúp mình tổ chức công việc gọn gàng, kiểu như viết “to-do list” cho server vậy.

Làm Quen Với YAML – Dễ Hơn Bạn Nghĩ

Trước khi viết playbook, mình phải nói về YAML một chút, vì nhiều bạn nghe đến YAML là sợ. Mình cũng từng như vậy, nghĩ: “Trời ơi, lại ngôn ngữ mới, chắc phức tạp lắm!”. Nhưng thật ra YAML rất đơn giản, chỉ cần chú ý thụt lề (indent) đúng là được. Dưới đây là cấu trúc cơ bản của một playbook YAML:

- name: Tên của play
  hosts: webservers
  tasks:
    - name: Tên task 1
      module_name: arguments
    - name: Tên task 2
      module_name: arguments
  • - name:: Đặt tên cho play hoặc task, để dễ đọc và debug.
  • hosts:: Nhóm server từ inventory (bài 2).
  • tasks:: Danh sách task, mỗi task dùng một module (như apt, copy).

Quan trọng nhất là thụt lề – mỗi cấp cách nhau 2 khoảng trắng (space), không dùng tab. Mình từng dùng tab thay vì space, playbook chạy lỗi tùm lum, ngồi debug cả buổi mới phát hiện. Nên nhớ: YAML ghét tab, chỉ thích space thôi!

Viết Playbook Đầu Tiên – Deploy File “Hello.txt”

Giờ mình sẽ hướng dẫn bạn viết một playbook đơn giản: copy file hello.txt lên server và kiểm tra nó có đúng không. Đầu tiên, tạo file hello.txt trên máy local:

echo "Hello Ansible!" > hello.txt

Tiếp theo, tạo file playbook deploy_file.yml:

nano deploy_file.yml

Gõ vào:

- name: Deploy a simple file to webservers
  hosts: webservers
  tasks:
    - name: Copy hello.txt to server
      copy:
        src: hello.txt
        dest: /tmp/hello.txt
        mode: '0644'
    - name: Check if file exists
      stat:
        path: /tmp/hello.txt
      register: file_status
    - name: Debug file status
      debug:
        msg: "File exists: {{ file_status.stat.exists }}"
  • copy:: Module copy file từ máy local lên server.
  • stat:: Module kiểm tra file có tồn tại không, lưu kết quả vào biến file_status.
  • debug:: Module in thông tin, ở đây in trạng thái file.

Giờ chạy playbook:

ansible-playbook -i hosts deploy_file.yml

Nếu bạn dùng inventory từ bài 2 (webservers chứa web1, web2), kết quả sẽ kiểu:

TASK [Copy hello.txt to server] **********
changed: [web1]
changed: [web2]

TASK [Check if file exists] **************
ok: [web1]
ok: [web2]

TASK [Debug file status] *****************
ok: [web1] => {
    "msg": "File exists: true"
}
ok: [web2] => {
    "msg": "File exists: true"
}

Thấy “File exists: true” là thành công! File hello.txt đã được copy lên /tmp trên cả hai server. Mình nhớ lần đầu chạy playbook, thấy output mà sướng cả người – kiểu “Ủa, chỉ vài dòng YAML mà làm được thế này sao?”.

Debug Khi Lỗi – Đừng Panic

Lỡ playbook lỗi thì sao? Mình từng viết sai đường dẫn dest, làm Ansible không tìm được chỗ để copy file, báo lỗi đỏ lòm. Khi đó, thêm --check để chạy thử mà không thay đổi thật:

ansible-playbook -i hosts deploy_file.yml --check

Hoặc thêm -v để debug chi tiết:

ansible-playbook -i hosts deploy_file.yml -v

Mình cũng hay SSH vào server kiểm tra tay:

ssh ubuntu@192.168.1.10 "cat /tmp/hello.txt"

Nếu thấy “Hello Ansible!”, là đúng rồi. Mẹo nhỏ: Luôn đặt name cho task, vì khi lỗi, Ansible sẽ báo đúng task nào fail – không phải đoán mò.

Thực Hành Mở Rộng: Cài Nginx Với Playbook

Giờ bạn đã biết viết playbook cơ bản, thử nâng cấp chút: cài Nginx và đảm bảo nó chạy. Tạo file install_nginx.yml:

nano install_nginx.yml

Gõ vào:

- name: Install and start Nginx on webservers
  hosts: webservers
  become: yes
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present
    - name: Start Nginx service
      service:
        name: nginx
        state: started
    - name: Check Nginx status
      command: systemctl status nginx
      register: nginx_status
    - name: Debug Nginx status
      debug:
        msg: "{{ nginx_status.stdout }}"
  • become: yes: Chạy với quyền sudo.
  • apt:: Cài Nginx.
  • service:: Khởi động Nginx.
  • command:: Kiểm tra trạng thái, lưu vào biến.

Chạy playbook:

ansible-playbook -i hosts install_nginx.yml

Kết quả sẽ in trạng thái Nginx, kiểu:

ok: [web1] => {
    "msg": "... active (running) ..."
}

Nếu thấy “active (running)”, là Nginx đã chạy ngon lành! Mình từng quên become: yes, làm Ansible không có quyền cài package – lỗi “permission denied” đỏ lòm cả màn hình. Nên nhớ: Cài package hay chỉnh service thì phải có quyền sudo nhé!

Mẹo Nhỏ Từ Kinh Nghiệm Thật

  • Thụt lề cẩn thận: YAML rất nhạy với thụt lề. Mình từng thụt sai một task, playbook chạy lỗi ngay – mất 30 phút tìm hiểu mới biết.
  • Dùng --check trước: Mô phỏng trước khi chạy thật, tránh làm hỏng server.
  • Lưu playbook: Playbook là “kế hoạch”, lưu lại để chạy lại sau, không như ad-hoc phải gõ lại.

Tiếp Theo Là Gì?

Bài này tụi mình đã viết Ansible Playbook DevOps đầu tiên, từ copy file đến cài Nginx. Lần sau, mình sẽ kể bạn nghe về biến trong Ansible – cách làm playbook linh hoạt hơn, không phải hardcode lung tung. Chịu không?

Thử Nghiệm Nhẹ: Thử chỉnh playbook install_nginx.yml, thêm task kiểm tra port 80 có mở không (dùng module command với netstat). Có gì thắc mắc cứ nhắn mình nhé – playbook là bước quan trọng, làm quen tốt là bạn đã sẵn sàng để tự động hóa “chuyên nghiệp”!

Điều hướng chuỗi bài viết<< Bài 3: Ansbile Ad-Hoc – Lệnh Nhanh Như Chớp
>> Bài 5: Ansible Variables – Bí Kíp Linh Hoạt Hóa Mọi Thứ
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