Ansible Playbooks Phần 1: Giới thiệu và Cấu trúc cơ bản
Playbook là "trái tim" của Ansible, giúp bạn tự động hóa cấu hình hệ thống, triển khai ứng dụng, và quản lý hạ tầng một cách lặp lại và đáng tin cậy.
Phần 1: Giới thiệu và Cấu trúc:
- Playbook là gì và tại sao cần Playbooks
- So sánh với Ad-Hoc Commands
- Cấu trúc YAML cơ bản
- Play-level vs Task-level directives
- Playbook đơn giản đầu tiên
- Các cách chạy và debug playbooks
Playbook là gì?
Playbook là một file (thường có đuôi .yml hoặc .yaml) mô tả trạng thái mong muốn của hệ thống. Nó giúp bạn nói với Ansible:
"Hãy đảm bảo server của tôi ở trạng thái này."
Playbooks được viết bằng YAML – ngắn gọn, dễ đọc, dễ bảo trì.
Tại sao cần Playbooks?
Trong khi Ad-Hoc Commands rất tốt cho các tác vụ đơn giản, một lần, thì Playbooks giải quyết các vấn đề phức tạp hơn:
| Ad-Hoc Commands | Playbooks |
|---|---|
| Chạy một lệnh đơn giản | Orchestration nhiều bước |
| Không lưu lại được | Version control với Git |
| Khó tái sử dụng | Dễ dàng tái sử dụng |
| Không có logic phức tạp | Hỗ trợ conditionals, loops, handlers |
| Thích hợp cho troubleshooting | Thích hợp cho automation |
Đặc điểm của Playbooks
- Declarative: Bạn khai báo "muốn gì" chứ không phải "làm thế nào"
- Idempotent: Chạy nhiều lần cho kết quả giống nhau
- Readable: Syntax YAML dễ đọc, dễ hiểu
- Version Control: Lưu trong Git để track changes
- Reusable: Tái sử dụng cho nhiều environments
- Testable: Có thể test với
--checkmode
Cấu trúc Playbook
Một Playbook có thể chứa nhiều "plays". Mỗi play áp dụng cho một nhóm host.
Cấu trúc cơ bản
---
- name: Mô tả play
hosts: target_servers
become: yes
vars:
variable_name: value
tasks:
- name: Mô tả task
module_name:
key: value
notify: handler_name
handlers:
- name: handler_name
module_name:
key: value
Các thành phần chính
| Thành phần | Bắt buộc | Mô tả |
|---|---|---|
--- |
Không | Dấu hiệu bắt đầu YAML document |
name |
Không nhưng nên có | Mô tả play/task cho dễ đọc |
hosts |
✅ Bắt buộc | Nhóm host hoặc host cụ thể từ inventory |
become |
Không | Nâng quyền sudo (default: no) |
vars |
Không | Khai báo variables |
tasks |
✅ Bắt buộc | Danh sách các tác vụ cần chạy |
handlers |
Không | Tasks được trigger bởi notify |
YAML Syntax cần nhớ
# Comment bắt đầu với #
# Key-value pairs
key: value
name: "Chuỗi có dấu ngoặc"
port: 8080
# Lists (danh sách)
packages:
- nginx
- git
- vim
# Hoặc inline list
packages: ['nginx', 'git', 'vim']
# Dictionaries (nested)
nginx:
port: 80
workers: 4
config:
gzip: enabled
# Multi-line strings
description: |
Đây là một đoạn text
có nhiều dòng
giữ nguyên line breaks
# Folded multi-line (gộp thành 1 dòng)
description: >
Đây là text
sẽ được gộp
thành một dòng
Play-level vs Task-level directives
Play-level (áp dụng cho tất cả tasks trong play):
- name: Configure webservers
hosts: web
become: yes # Tất cả tasks sẽ dùng sudo
gather_facts: yes # Thu thập system facts
vars:
http_port: 80
tasks:
# ... tasks here
Task-level (chỉ áp dụng cho task cụ thể):
tasks:
- name: Install package
apt:
name: nginx
state: present
become: yes # Chỉ task này dùng sudo
when: ansible_os_family == "Debian" # Conditional
tags: ['install'] # Tag để chạy selective
Yêu cầu đăng nhập
Vui lòng đăng nhập để truy cập nội dung này
Additional Resources
Course Guide
Comprehensive PDF guide with examples
GitHub Repository
Example code for all lessons
Discussion
Have a question about this lesson? Post it here and get answers from instructors and peers.
