- Tác giả

- Name
- Nguyễn Đức Xinh
- 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
--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
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
--checkmode 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-tasksvà--list-hosts
