Site logo
Tác giả
  • avatar Nguyễn Đức Xinh
    Name
    Nguyễn Đức Xinh
    Twitter
Ngày xuất bản
Ngày xuất bản

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

Playbook đơn giản đầu tiên

Ví dụ: Install và start Nginx

Tạo file simple-nginx.yml:

---
- name: Install and start Nginx
  hosts: web
  become: yes

  tasks:
    - name: Install nginx package
      apt:
        name: nginx
        state: present
        update_cache: yes

    - name: Start nginx service
      service:
        name: nginx
        state: started
        enabled: yes

    - name: Check nginx is responding
      uri:
        url: http://localhost
        status_code: 200

Chạy Playbook

# Syntax check
ansible-playbook simple-nginx.yml --syntax-check

# Check mode (dry run)
ansible-playbook simple-nginx.yml --check

# Execute
ansible-playbook -i inventory simple-nginx.yml

Output

PLAY [Install and start Nginx] *****************************************

TASK [Gathering Facts] *************************************************
ok: [web01]

TASK [Install nginx package] *******************************************
changed: [web01]

TASK [Start nginx service] *********************************************
ok: [web01]

TASK [Check nginx is responding] ***************************************
ok: [web01]

PLAY RECAP *************************************************************
web01   : ok=4    changed=1    unreachable=0    failed=0    skipped=0

Multiple Plays trong một Playbook

Một Playbook có thể chứa nhiều plays:

---
# Play 1: Configure database servers
- name: Setup database
  hosts: database
  become: yes
  tasks:
    - name: Install MySQL
      apt:
        name: mysql-server
        state: present

# Play 2: Configure web servers
- name: Setup web servers
  hosts: web
  become: yes
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present

# Play 3: Configure load balancers
- name: Setup load balancers
  hosts: lb
  become: yes
  tasks:
    - name: Install HAProxy
      apt:
        name: haproxy
        state: present

Plays chạy theo thứ tự từ trên xuống dưới.


Chạy và Debug Playbooks

Basic execution

# Chạy playbook
ansible-playbook site.yml

# Với inventory cụ thể
ansible-playbook -i inventory/production site.yml

# Verbose mode
ansible-playbook site.yml -v     # Level 1
ansible-playbook site.yml -vv    # Level 2
ansible-playbook site.yml -vvv   # Level 3 (detailed)

Check mode (Dry run)

# Xem sẽ thay đổi gì mà không thực hiện
ansible-playbook site.yml --check

# Check mode với diff
ansible-playbook site.yml --check --diff

Limiting execution

# Chỉ chạy trên một host
ansible-playbook site.yml --limit web01

# Chạy trên một group
ansible-playbook site.yml --limit webservers

# Multiple hosts
ansible-playbook site.yml --limit "web01,web02"

# Exclude hosts
ansible-playbook site.yml --limit "all:!database"

Step-by-step execution

# Confirm mỗi task trước khi chạy
ansible-playbook site.yml --step

List information

# List tất cả tasks
ansible-playbook site.yml --list-tasks

# List hosts sẽ được áp dụng
ansible-playbook site.yml --list-hosts

# List tags
ansible-playbook site.yml --list-tags

💡 Key Takeaways

  • Playbook là file YAML mô tả desired state của hệ thống
  • Playbook có thể chứa nhiều plays, mỗi play cho một nhóm hosts
  • YAML syntax đơn giản với key-value pairs, lists, và dictionaries
  • Luôn test với --check mode trước khi chạy thật
  • Sử dụng verbose mode (-v, -vv, -vvv) để debug

🎯 Thực hành

  • Viết playbook cài đặt và start Nginx
  • Viết playbook với 2 plays: một cho database, một cho web servers
  • Practice với check mode và verbose mode
  • Test với --list-tasks--list-hosts

📚 Tài liệu tham khảo