Lab 13 — Ansible với nhiều Environment
Mục tiêu: Xây dựng một hệ thống Ansible có thể quản lý Dev / Staging / Production bằng cùng một bộ Playbook và Roles, nhưng mỗi environment có cấu hình, server và mức độ an toàn khác nhau.
Đây là Lab rất quan trọng để chuyển từ:
Ansible dùng cho vài server
sang:
Ansible Infrastructure Automation
1. Bối cảnh
Trong thực tế, chúng ta hiếm khi chỉ có một môi trường.
Thông thường sẽ có:
Ansible Controller
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
DEV STAGING PRODUCTION
│ │ │
Server(s) Server(s) Server(s)
Ví dụ:
| Environment | Mục đích | Server |
|---|---|---|
| Dev | Developer phát triển | dev-server |
| Staging | Test trước production | staging-server |
| Production | Người dùng thật | prod-server |
Điều quan trọng là:
Không nên copy toàn bộ Playbook thành 3 bản.
Không nên:
playbook-dev.yml
playbook-staging.yml
playbook-production.yml
vì sau một thời gian sẽ xảy ra:
Dev Playbook
↓
được sửa
Staging Playbook
↓
quên sửa
Production Playbook
↓
khác hoàn toàn
Thay vào đó:
Common Playbook
│
▼
Roles
│
┌───────────┼───────────┐
▼ ▼ ▼
Dev Staging Production
config config config
2. Mục tiêu Lab
Sau Lab này, người học có thể:
- Hiểu concept Environment.
- Tổ chức Inventory cho Dev / Staging / Production.
- Tách configuration theo environment.
- Sử dụng
group_vars. - Sử dụng
host_vars. - Dùng cùng một Playbook cho nhiều environment.
- Dùng cùng một Role cho nhiều environment.
- Override variables.
- Tách secrets theo environment.
- Dùng Ansible Vault.
- Kiểm soát Production deployment.
- Sử dụng
--limit. - Sử dụng
--check. - Sử dụng
--diff. - Thiết kế Inventory có khả năng scale.
- Tránh hard-code environment.
- Tránh copy Playbook.
- Thiết kế cấu trúc gần với production.
3. Kiến trúc mục tiêu
Chúng ta sẽ xây dựng:
Ansible Controller
│
site.yml
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
DEV STAGING PRODUCTION
│ │ │
dev-server stg-server prod-server
│ │ │
▼ ▼ ▼
Docker/App Docker/App Docker/App
Playbook vẫn chỉ có:
site.yml
Không phải:
site-dev.yml
site-staging.yml
site-production.yml
4. Nguyên tắc quan trọng
Có một nguyên tắc cần nhớ:
Code dùng chung, Configuration khác nhau.
Ví dụ Role:
roles/application/
được sử dụng cho:
Dev
Staging
Production
Nhưng:
application_port
application_domain
replicas
log_level
debug
database_host
có thể khác nhau.
5. Ví dụ thực tế
Dev:
app_environment: dev
app_port: 8080
app_debug: true
app_log_level: debug
Staging:
app_environment: staging
app_port: 8080
app_debug: false
app_log_level: info
Production:
app_environment: production
app_port: 8080
app_debug: false
app_log_level: warn
Role không cần biết mình đang chạy ở đâu.
6. Cấu trúc thư mục
Chúng ta sẽ sử dụng cấu trúc:
ansible/
│
├── ansible.cfg
├── site.yml
│
├── inventories/
│ │
│ ├── dev/
│ │ ├── hosts.ini
│ │ └── group_vars/
│ │ └── all.yml
│ │
│ ├── staging/
│ │ ├── hosts.ini
│ │ └── group_vars/
│ │ └── all.yml
│ │
│ └── production/
│ ├── hosts.ini
│ └── group_vars/
│ └── all.yml
│
└── roles/
└── application/
├── defaults/
├── handlers/
├── tasks/
└── templates/
Đây là mô hình rất dễ hiểu cho người mới.
7. Inventory Dev
Tạo:
inventories/dev/hosts.ini
Nội dung:
[application]
dev-server ansible_host=192.168.56.11 ansible_user=deploy
8. Inventory Staging
inventories/staging/hosts.ini
[application]
staging-server ansible_host=192.168.56.12 ansible_user=deploy
9. Inventory Production
inventories/production/hosts.ini
[application]
prod-server ansible_host=192.168.56.13 ansible_user=deploy
10. Kiểm tra Inventory
Dev:
ansible-inventory \
-i inventories/dev/hosts.ini \
--graph
Staging:
ansible-inventory \
-i inventories/staging/hosts.ini \
--graph
Production:
ansible-inventory \
-i inventories/production/hosts.ini \
--graph
11. Test SSH từng Environment
Dev:
ansible all \
-i inventories/dev/hosts.ini \
-m ping
Staging:
ansible all \
-i inventories/staging/hosts.ini \
-m ping
Production:
ansible all \
-i inventories/production/hosts.ini \
-m ping
Điều này giúp người học hiểu:
Inventory quyết định chúng ta đang quản lý server nào.
12. Tách Configuration
Dev:
inventories/dev/group_vars/all.yml
app_environment: dev
app_port: 8080
app_debug: true
app_log_level: debug
13. Staging Configuration
inventories/staging/group_vars/all.yml
app_environment: staging
app_port: 8080
app_debug: false
app_log_level: info
14. Production Configuration
inventories/production/group_vars/all.yml
app_environment: production
app_port: 8080
app_debug: false
app_log_level: warn
15. Vì sao dùng group_vars?
Inventory:
[application]
server01
server02
server03
Có thể khai báo:
group_vars/application.yml
hoặc:
group_vars/all.yml
Ansible tự động load variables phù hợp với Inventory.
Điều này giúp:
Playbook
│
├── Dev variables
├── Staging variables
└── Production variables
mà không cần sửa Playbook.
16. Tạo Playbook dùng chung
Tạo:
site.yml
---
- name: Deploy application
hosts: application
become: true
roles:
- application
Đây là toàn bộ phần environment-independent.
Không có:
if production
Không có:
if staging
Không có:
if dev
17. Tạo Role Application
Cấu trúc:
roles/application/
├── defaults/
│ └── main.yml
├── handlers/
│ └── main.yml
├── tasks/
│ └── main.yml
└── templates/
└── application.env.j2
18. Role Defaults
roles/application/defaults/main.yml
app_environment: dev
app_port: 8080
app_debug: false
app_log_level: info
Đây là:
Default value
Environment-specific variables có thể override.
19. Task
roles/application/tasks/main.yml
---
- name: Create application directory
ansible.builtin.file:
path: /opt/todo
state: directory
owner: deploy
group: deploy
mode: "0755"
- name: Deploy application environment
ansible.builtin.template:
src: application.env.j2
dest: /opt/todo/.env
owner: deploy
group: deploy
mode: "0600"
20. Template
roles/application/templates/application.env.j2
APP_ENVIRONMENT={{ app_environment }}
APP_PORT={{ app_port }}
APP_DEBUG={{ app_debug }}
APP_LOG_LEVEL={{ app_log_level }}
21. Chạy Dev
ansible-playbook \
-i inventories/dev/hosts.ini \
site.yml
Application nhận:
APP_ENVIRONMENT=dev
APP_PORT=8080
APP_DEBUG=true
APP_LOG_LEVEL=debug
22. Chạy Staging
ansible-playbook \
-i inventories/staging/hosts.ini \
site.yml
Application nhận:
APP_ENVIRONMENT=staging
APP_PORT=8080
APP_DEBUG=false
APP_LOG_LEVEL=info
23. Chạy Production
ansible-playbook \
-i inventories/production/hosts.ini \
site.yml
Application nhận:
APP_ENVIRONMENT=production
APP_PORT=8080
APP_DEBUG=false
APP_LOG_LEVEL=warn
Cùng một Playbook.
Đây chính là mục tiêu chính của Lab.
24. Kiểm tra Variables
Có thể chạy:
ansible \
all \
-i inventories/dev/hosts.ini \
-m debug \
-a "var=app_environment"
Hoặc:
ansible \
all \
-i inventories/production/hosts.ini \
-m debug \
-a "var=app_environment"
Kết quả phải khác nhau.
25. Một cách tốt hơn để Debug
Trong Playbook:
- name: Show environment
ansible.builtin.debug:
msg:
- "Environment: {{ app_environment }}"
- "Port: {{ app_port }}"
- "Debug: {{ app_debug }}"
Khi chạy:
ansible-playbook \
-i inventories/staging/hosts.ini \
site.yml
sẽ thấy:
Environment: staging
Port: 8080
Debug: False
26. Environment không nên được Hard-code
Không nên:
- name: Configure production
...
và:
app_environment: production
trong Role.
Role nên generic:
- name: Configure application
Environment quyết định configuration.
27. Environment-specific Domain
Dev:
app_domain: dev.example.com
Staging:
app_domain: staging.example.com
Production:
app_domain: example.com
Template:
server_name {{ app_domain }};
Role không cần thay đổi.
28. Environment-specific Resource
Dev:
docker_memory_limit: 512m
Staging:
docker_memory_limit: 1g
Production:
docker_memory_limit: 4g
Template:
mem_limit: "{{ docker_memory_limit }}"
29. Environment-specific Replica
Dev:
app_replicas: 1
Staging:
app_replicas: 2
Production:
app_replicas: 4
Ví dụ:
deploy:
replicas: {{ app_replicas }}
30. Tư duy Configuration Hierarchy
Một cách hiểu đơn giản:
Role Defaults
↓
Inventory Variables
↓
Group Variables
↓
Host Variables
↓
Extra Variables
Các biến ở mức ưu tiên cao hơn có thể override mức thấp hơn.
Người học cần hiểu:
Variable precedence là một trong những phần quan trọng nhất khi Ansible project lớn lên.
31. Host-specific Configuration
Ví dụ:
inventories/production/host_vars/prod-server.yml
app_port: 8081
Trong khi:
group_vars/all.yml
có:
app_port: 8080
Host-specific configuration sẽ override giá trị chung.
32. Khi nào dùng group_vars?
Dùng khi:
Nhiều server có cùng configuration
Ví dụ:
application servers
đều:
app_port: 8080
33. Khi nào dùng host_vars?
Dùng khi:
Một server có configuration đặc biệt
Ví dụ:
prod-server-03
có:
app_port: 8081
Nhưng không nên lạm dụng.
Nếu có quá nhiều host_vars:
server01.yml
server02.yml
server03.yml
server04.yml
...
thường là dấu hiệu configuration architecture cần xem lại.
34. Environment và Secrets
Đây là phần rất quan trọng.
Dev có thể:
database_name: todo_dev
Staging:
database_name: todo_staging
Production:
database_name: todo_production
Nhưng password:
❌ Không commit plaintext
Không:
database_password: password123
35. Sử dụng Vault
Cấu trúc:
inventories/
├── dev/
│ ├── group_vars/
│ │ ├── all.yml
│ │ └── vault.yml
│
├── staging/
│ ├── group_vars/
│ │ ├── all.yml
│ │ └── vault.yml
│
└── production/
├── group_vars/
│ ├── all.yml
│ └── vault.yml
Mỗi environment có secret riêng.
36. Ví dụ Vault
database_password: "..."
database_username: "todo"
File:
vault.yml
được encrypt bằng:
ansible-vault encrypt vault.yml
37. Chạy Production với Vault
ansible-playbook \
-i inventories/production/hosts.ini \
site.yml \
--ask-vault-pass
Hoặc dùng:
--vault-password-file
trong CI/CD theo cách an toàn.
38. Không nên có một Vault cho tất cả Environment
Không nên:
vault.yml
chứa:
Dev password
Staging password
Production password
Nếu một secret bị lộ:
All environments compromised
Tốt hơn:
Dev Vault
Staging Vault
Production Vault
39. Production Safety
Một trong những vấn đề lớn nhất:
ansible-playbook \
-i inventories/production/hosts.ini \
site.yml
chỉ cần chạy nhầm command là có thể thay đổi Production.
Vì vậy cần tạo guardrail.
40. Explicit Environment
Một cách đơn giản:
ansible-playbook \
-i inventories/production/hosts.ini \
site.yml
Nhưng người dùng phải biết mình đang chạy Inventory nào.
Có thể tạo script:
scripts/
├── deploy-dev.sh
├── deploy-staging.sh
└── deploy-production.sh
41. Production Script
#!/usr/bin/env bash
set -e
echo "Deploying to PRODUCTION"
read -p "Type PRODUCTION to continue: " confirm
if [ "$confirm" != "PRODUCTION" ]; then
echo "Deployment cancelled"
exit 1
fi
ansible-playbook \
-i inventories/production/hosts.ini \
site.yml
Đây là một guardrail đơn giản nhưng hữu ích.
42. Check Mode trước Production
Trước khi deploy:
ansible-playbook \
-i inventories/production/hosts.ini \
site.yml \
--check
Sau đó:
ansible-playbook \
-i inventories/production/hosts.ini \
site.yml \
--check \
--diff
Xem:
What will change?
rồi mới deploy thật.
43. Limit Production
Production:
prod01
prod02
prod03
prod04
Không nhất thiết deploy tất cả cùng lúc.
ansible-playbook \
-i inventories/production/hosts.ini \
site.yml \
--limit prod01
Kiểm tra:
prod01
sau đó:
--limit prod02
hoặc rollout theo batch.
44. Serial Deployment
Trong Playbook:
- name: Deploy application
hosts: application
serial: 1
roles:
- application
Nếu có:
prod01
prod02
prod03
prod04
Ansible sẽ:
prod01
↓
verify
↓
prod02
↓
verify
↓
prod03
↓
verify
↓
prod04
Đây là tư duy rất gần với production deployment.
45. Rolling Deployment
Có thể:
serial:
- 1
- 25%
- 50%
Ý tưởng:
1 server
↓
25%
↓
50%
↓
100%
Giảm blast radius.
46. Production Health Check
Sau khi deploy:
- name: Check application health
ansible.builtin.uri:
url: "http://localhost:{{ app_port }}/health"
status_code: 200
Nếu:
200
→ tiếp tục.
Nếu:
500
→ deployment fail.
47. Environment Validation
Thêm:
- name: Validate environment
ansible.builtin.assert:
that:
- app_environment in ['dev', 'staging', 'production']
48. Production Validation
Có thể yêu cầu:
- name: Validate production configuration
ansible.builtin.assert:
that:
- app_debug == false
- app_log_level != 'debug'
when: app_environment == 'production'
Điều này ngăn:
Production
↓
DEBUG=true
49. Environment Matrix
Sau khi hoàn thành, chúng ta có:
| Configuration | Dev | Staging | Production |
|---|---|---|---|
| Debug | true | false | false |
| Log level | debug | info | warn |
| Replicas | 1 | 2 | 4 |
| Memory | 512M | 1G | 4G |
| Domain | dev.example.com | staging.example.com | example.com |
| Database | todo_dev | todo_staging | todo_production |
Điểm quan trọng:
Code giống nhau, configuration khác nhau.
50. Không nên copy Role
Sai:
roles/
├── app-dev/
├── app-staging/
└── app-production/
Đây là duplication.
Nên:
roles/
└── application/
và:
inventories/
├── dev/
├── staging/
└── production/
51. Không nên dùng quá nhiều when
Không nên viết:
- name: Configure application
...
when: app_environment == "dev"
rồi:
- name: Configure application
...
when: app_environment == "staging"
rồi:
- name: Configure application
...
when: app_environment == "production"
Nếu logic khác nhau hoàn toàn, hãy cân nhắc tách Role hoặc Task rõ ràng.
Nhưng nếu chỉ khác:
port
domain
memory
log level
→ dùng variables.
52. Configuration vs Behavior
Đây là distinction quan trọng.
Configuration
Port
Domain
Memory
Replicas
Log level
Database host
→ Variables.
Behavior
Production cần backup
Production cần monitoring
Dev không cần monitoring
→ Có thể dùng:
when:
app_environment == "production"
hoặc tách role:
monitoring
backup
53. Tư duy Architecture
Mô hình tốt:
site.yml
│
▼
Common Roles
│
┌────────────┼────────────┐
▼ ▼ ▼
Dev Staging Production
│ │ │
vars vars vars
│ │ │
└────────────┼────────────┘
▼
Same Logic
54. Bài tập 1 — Tạo 3 Environment
Tạo:
dev
staging
production
Mỗi environment có:
hosts.ini
group_vars/all.yml
Yêu cầu:
app_environment
app_port
app_debug
app_log_level
phải khác nhau.
55. Bài tập 2 — Một Playbook
Chỉ được phép có:
site.yml
Không được tạo:
dev.yml
staging.yml
production.yml
Chạy:
ansible-playbook -i inventories/dev/hosts.ini site.yml
và:
ansible-playbook -i inventories/staging/hosts.ini site.yml
và:
ansible-playbook -i inventories/production/hosts.ini site.yml
56. Bài tập 3 — Environment-specific Template
Tạo:
application.env.j2
Template phải render:
APP_ENVIRONMENT
APP_PORT
APP_DEBUG
APP_LOG_LEVEL
APP_DOMAIN
Sau đó kiểm tra từng server.
57. Bài tập 4 — Environment-specific Secret
Tạo:
dev/vault.yml
staging/vault.yml
production/vault.yml
Mỗi environment có:
database_username
database_password
Mã hóa:
ansible-vault encrypt
Yêu cầu:
Không secret plaintext trong Git
58. Bài tập 5 — Production Guardrail
Tạo script:
deploy-production.sh
Yêu cầu:
Người dùng phải nhập:
PRODUCTION
mới được deploy.
59. Bài tập 6 — Production Check
Trước deployment:
ansible-playbook \
-i inventories/production/hosts.ini \
site.yml \
--syntax-check
sau đó:
ansible-playbook \
-i inventories/production/hosts.ini \
site.yml \
--check \
--diff
Cuối cùng mới:
ansible-playbook \
-i inventories/production/hosts.ini \
site.yml
60. Bài tập 7 — Rolling Deployment
Production có:
prod01
prod02
prod03
prod04
Sử dụng:
serial: 1
và health check.
Mục tiêu:
Deploy
↓
Health check
↓
Next server
Nếu một server fail:
STOP
không tiếp tục rollout toàn bộ.
61. Bài tập 8 — Production Misconfiguration
Cố tình đặt:
app_debug: true
trong Production.
Playbook phải phát hiện:
Production must not run with debug enabled
Sử dụng:
assert
62. Bài tập 9 — Environment Drift
Giả sử:
Dev
version: 1.5
Staging
version: 1.5
Production
version: 1.3
Xây dựng variable:
app_version:
và kiểm soát version theo environment.
Ví dụ:
# dev
app_version: "1.5"
# staging
app_version: "1.5"
# production
app_version: "1.3"
63. Bài tập 10 — Production Promotion
Thiết kế quy trình:
Developer
│
▼
DEV
│
▼
Testing
│
▼
STAGING
│
▼
Validation
│
▼
PRODUCTION
Không deploy trực tiếp:
DEV → PRODUCTION
trong workflow thông thường.
64. Challenge — Xây dựng Environment Architecture
Cuối Lab, hãy xây dựng:
ansible/
│
├── ansible.cfg
├── site.yml
│
├── inventories/
│ │
│ ├── dev/
│ │ ├── hosts.ini
│ │ ├── group_vars/
│ │ │ ├── all.yml
│ │ │ └── vault.yml
│ │ └── host_vars/
│ │
│ ├── staging/
│ │ ├── hosts.ini
│ │ ├── group_vars/
│ │ │ ├── all.yml
│ │ │ └── vault.yml
│ │ └── host_vars/
│ │
│ └── production/
│ ├── hosts.ini
│ ├── group_vars/
│ │ ├── all.yml
│ │ └── vault.yml
│ └── host_vars/
│
├── roles/
│ └── application/
│ ├── defaults/
│ ├── handlers/
│ ├── tasks/
│ └── templates/
│
└── scripts/
├── deploy-dev.sh
├── deploy-staging.sh
└── deploy-production.sh
65. Production-like Workflow
Workflow cuối Lab:
Git
│
▼
Ansible Code
│
▼
DEV
│
Automated Test
│
▼
STAGING
│
Integration Test
│
▼
Manual Approval
│
▼
PRODUCTION
│
Rolling Deploy
│
▼
Health Check
│
┌────┴────┐
│ │
PASS FAIL
│ │
▼ ▼
Continue Stop/Rollback
Đây là tư duy mà người học cần bắt đầu hình thành ở giai đoạn này.
66. Troubleshooting trong Multi-Environment
Khi có lỗi:
Production deployment failed
không chỉ kiểm tra Playbook.
Hãy hỏi:
Environment nào?
↓
Inventory nào?
↓
Variable nào?
↓
Secret nào?
↓
Host nào?
↓
Configuration nào?
Một lỗi rất phổ biến là:
Production
↓
nhưng lại load
↓
Staging variables
Vì vậy cần kiểm tra:
ansible-inventory \
-i inventories/production/hosts.ini \
--list
67. Environment Drift
Một vấn đề lớn trong hệ thống nhiều environment:
DEV
↓
works
STAGING
↓
works
PRODUCTION
↓
fails
Tại sao?
Có thể:
OS khác
Package khác
Docker khác
Config khác
Secret khác
Network khác
Environment variable khác
Mục tiêu của Ansible là giảm drift:
Same Automation
↓
Same Configuration Logic
↓
Predictable Environment
68. Nhưng Dev không nhất thiết giống Production 100%
Không nên hiểu:
Dev = Production copy.
Ví dụ:
Dev
1 server
1 replica
debug enabled
Production
4 servers
4 replicas
debug disabled
backup enabled
monitoring enabled
Điều cần giống nhau là:
Automation logic
Application configuration model
Deployment process
chứ không phải mọi giá trị đều giống nhau.
69. Tư duy Senior — Environment Promotion
Một Senior không chỉ nghĩ:
Deploy Production
mà nghĩ:
Artifact
↓
Dev
↓
Test
↓
Staging
↓
Validate
↓
Production
Điều này dẫn đến một nguyên tắc quan trọng:
Build once, promote the same artifact.
Ví dụ application version:
todo-api:1.8.3
được deploy:
DEV
↓
STAGING
↓
PRODUCTION
Không nên:
Dev build → 1.8.3-dev
Staging build → 1.8.3-staging
Production build → 1.8.3-prod
vì artifact khác nhau.
70. Tư duy Senior — Configuration Drift
Nếu Production bị sửa thủ công:
ssh production
vim /etc/nginx/nginx.conf
thì:
Ansible state
≠
Server state
Lần sau Ansible chạy:
Drift detected
↓
Ansible reconciles
Đây chính là một trong những giá trị lớn nhất của Infrastructure as Code.
71. Tư duy Senior — Git là Source of Truth
Mô hình:
Git
│
├── Playbook
├── Roles
├── Inventory
└── Configuration
│
▼
Ansible
│
▼
Infrastructure
Không nên:
Server
↓
Manual change
↓
Hope everything is okay
Thay vào đó:
Change
↓
Git
↓
Review
↓
Ansible
↓
Server
72. Những lỗi thiết kế cần tránh
❌ Copy Playbook
dev.yml
staging.yml
production.yml
❌ Copy Role
app-dev
app-staging
app-production
❌ Hard-code Production
domain: example.com
❌ Secret plaintext
password: abc123
❌ Deploy Production không kiểm tra
ansible-playbook production.yml
❌ Manual change trên server
vim /etc/...
73. Thiết kế tốt
Git
│
▼
site.yml
│
▼
Roles
│
┌──────┼──────┐
▼ ▼ ▼
Dev Staging Production
│ │ │
vars vars vars
│ │ │
vault vault vault
74. Checklist cuối Lab
Người học cần có khả năng trả lời:
Inventory
- Environment là gì?
- Inventory có vai trò gì?
- Làm sao chọn Dev/Staging/Production?
Variables
group_varsdùng khi nào?host_varsdùng khi nào?- Variable precedence là gì?
Roles
- Vì sao không copy Role?
- Làm sao dùng một Role cho nhiều environment?
Security
- Secret nên nằm ở đâu?
- Vì sao mỗi environment nên có secret riêng?
Production
- Làm sao tránh deploy nhầm Production?
--checkcó tác dụng gì?--diffcó tác dụng gì?serialdùng khi nào?
Architecture
- Code nào dùng chung?
- Configuration nào khác nhau?
- Environment promotion là gì?
- Configuration drift là gì?
75. Kết quả đạt được
Sau Lab 13, người học đã đi từ:
Lab 1
Hiểu Ansible
↓
Lab 2
SSH
↓
Lab 3
Ad-Hoc
↓
Lab 4
Playbook
↓
Lab 5
Variables
↓
Lab 6
Templates
↓
Lab 7
Idempotency
↓
Lab 8
Roles
↓
Lab 9
Provisioning
↓
Lab 10
Application Deployment
↓
Lab 11
Secrets
↓
Lab 12
Troubleshooting
↓
Lab 13
Multi-Environment
và bắt đầu có tư duy:
Ansible
│
▼
Infrastructure as Code
│
┌─────────┴─────────┐
▼ ▼
Reproducible Scalable
│ │
└─────────┬─────────┘
▼
Production
Automation
Lab 13 là bước chuyển từ "quản lý server" sang "quản lý hệ thống".
Và sau Lab này, Lab 14 — Final Project: Automated Server Provisioning nên gom toàn bộ kiến thức từ Lab 1 → 13 thành một project production hoàn chỉnh: từ Provision → Security → Docker → Application → Secrets → Multi-Environment → Deployment → Health Check → Troubleshooting, để người học thực sự chứng minh được năng lực thay vì chỉ hoàn thành từng bài lab riêng lẻ.
All Rights Reserved