0

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_vars dùng khi nào?
  • host_vars dù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?
  • --check có tác dụng gì?
  • --diff có tác dụng gì?
  • serial dù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

Viblo
Let's register a Viblo Account to get more interesting posts.