Site logo

Ansible Playbooks Phần 1: Giới thiệu và Cấu trúc cơ bản

5:00 read

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 --check mode

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:  tả play
  hosts: target_servers
  become: yes
  vars:
    variable_name: value
  tasks:
    - name:  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.