Merge pull request #491 from vntechies/main

This commit is contained in:
Michael Cade 2024-02-23 06:56:59 +00:00 committed by GitHub
commit 68a56296cd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
32 changed files with 258 additions and 78 deletions

View File

@ -26,11 +26,11 @@ Nói chung, ít nhất là trên các máy trạm của nhà phát triển, tôi
![](../../Days/Images/Day16_Linux1.png)
Bây giờ chúng ta đã cập nhật Ubuntu VM với các bản cài đặt mới nhất. Bây giờ chúng tôi muốn cài thêm một số phần mềm ở đây.
Bây giờ chúng ta đã cập nhật Ubuntu VM với các bản cài đặt mới nhất. Bây giờ chúng ta muốn cài thêm một số phần mềm ở đây.
Hãy chọn `figlet` - một chương trình tạo biểu ngữ văn bản.
Nếu chúng tôi nhập `figlet` trong terminal, bạn sẽ thấy rằng chúng ta chưa cài đặt nó trên hệ thống của mình.
Nếu chúng ta nhập `figlet` trong terminal, bạn sẽ thấy rằng chúng ta chưa cài đặt nó trên hệ thống của mình.
![](../../Days/Images/Day16_Linux2.png)
@ -92,19 +92,19 @@ Trên Windows, bạn có ổ C: và đó là thứ mà chúng ta coi là gốc.
![](../../Days/Images/Day16_Linux13.png)
- `/lib` - Chúng tôi đã đề cập rằng `/bin` là nơi chứa các tệp nhị phân và tệp thực thi của chúng tôi, và `/lib` là nơi bạn sẽ tìm thấy các thư viện dùng chung cho các tệp đó.
- `/lib` - Chúng ta đã đề cập rằng `/bin` là nơi chứa các tệp nhị phân và tệp thực thi, và `/lib` là nơi bạn sẽ tìm thấy các thư viện dùng chung cho các tệp đó.
![](../../Days/Images/Day16_Linux14.png)
- `/media` - Đây là nơi chúng tôi sẽ tìm thấy các thiết bị di động.
- `/media` - Đây là nơi chúng ta sẽ tìm thấy các thiết bị di động.
![](../../Days/Images/Day16_Linux15.png)
- `/mnt` - Đây là điểm gắn kết tạm thời. Chúng tôi sẽ đề cập sâu hơn trong phần tiếp theo về lưu trữ.
- `/mnt` - Đây là điểm gắn kết tạm thời. Chúng ta sẽ đề cập sâu hơn trong phần tiếp theo về lưu trữ.
![](../../Days/Images/Day16_Linux16.png)
- `/opt` - Optional software packages (gói phần mềm tùy chọn). Bạn sẽ nhận thấy ở đây rằng chúng tôi có một số phần mềm virtual box và vagrant được lưu trữ ở đây.
- `/opt` - Optional software packages (gói phần mềm tùy chọn). Bạn sẽ nhận thấy ở đây rằng chúng ta có một số phần mềm virtual box và vagrant được lưu trữ ở đây.
![](../../Days/Images/Day16_Linux17.png)
@ -128,15 +128,15 @@ Trên Windows, bạn có ổ C: và đó là thứ mà chúng ta coi là gốc.
![](../../Days/Images/Day16_Linux22.png)
- `/usr` - Nếu chúng tôi với tư cách là người dùng đã cài đặt các gói phần mềm, gói phần mềm đó thường sẽ được cài đặt ở vị trí `/usr/bin`.
- `/usr` - Nếu chúng ttaôi với tư cách là người dùng đã cài đặt các gói phần mềm, gói phần mềm đó thường sẽ được cài đặt ở vị trí `/usr/bin`.
![](../../Days/Images/Day16_Linux23.png)
- `/var` - Các ứng dụng của chúng tôi được cài đặt trong thư mục `bin`. Chúng tôi cần một nơi nào đó để lưu trữ tất cả các tệp logs, đó chính là `/var`
- `/var` - Các ứng dụng của chúng ta được cài đặt trong thư mục `bin`. Chúng ta cần một nơi nào đó để lưu trữ tất cả các tệp logs, đó chính là `/var`
## Lưu trữ (Storage)
Khi đề cập tới một hệ thống Linux hoặc bất kỳ hệ thống nào, chúng ta có thể muốn biết các ổ đĩa có sẵn và chúng tôi có bao nhiêu dung lượng trống trên các đĩa đó. Một vài lệnh sau đây giúp xác định và sử dụng cũng như quản lý bộ lưu trữ.
Khi đề cập tới một hệ thống Linux hoặc bất kỳ hệ thống nào, chúng ta có thể muốn biết các ổ đĩa có sẵn và chúng ta có bao nhiêu dung lượng trống trên các đĩa đó. Một vài lệnh sau đây giúp xác định và sử dụng cũng như quản lý bộ lưu trữ.
- `lsblk` Liệt kê các thiết bị khối (List Block devices). `sda` là đĩa vật lý của chúng ta và sau đó `sda1, sda2, sda3` là các phân vùng của chúng ta trên đĩa đó.
@ -156,7 +156,7 @@ Nếu bạn không muốn unmount ổ đĩa đó và bạn sẽ sử dụng nó
Sau khi bạn chỉnh sửa tệp cấu hình `fstab`, bạn có thể kiểm tra hoạt động bằng lệnh `sudo mount -a` nếu không có lỗi thì các thay đổi của bạn sẽ vẫn ở đó dù khởi động lại hệ thống.
Chúng tôi sẽ đề cập đến cách bạn chỉnh sửa tệp bằng trình soạn thảo văn bản trong ngày hôm sau
Chúng ta sẽ đề cập đến cách bạn chỉnh sửa tệp bằng trình soạn thảo văn bản trong ngày hôm sau
## Tài liệu tham khảo

View File

@ -19,7 +19,7 @@ Có rất nhiều tùy chọn ngoài kia nhưng tôi nghĩ có lẽ chúng ta n
- Không có sẵn trên mọi hệ thống.
- Dễ để bắt đầu hơn
Nếu bạn chạy `nano 90DaysOfDevOps.txt`, chúng ta sẽ có một tệp mới không có gì trong đó, từ đây chúng tôi có thể thêm văn bản của mình và hướng dẫn bên dưới là những gì chúng ta muốn thay đổi tệp đó.
Nếu bạn chạy `nano 90DaysOfDevOps.txt`, chúng ta sẽ có một tệp mới không có gì trong đó, từ đây chúng ta có thể thêm văn bản của mình và hướng dẫn bên dưới là những gì chúng ta muốn thay đổi tệp đó.
![](../../Days/Images/Day17_Linux1.png)

View File

@ -255,7 +255,7 @@ Bạn có thể thấy từ hình ảnh bên dưới rằng chúng ta đã thự
Yêu cầu cuối cùng là "Thông báo tạo tài khoản thành công được hiển thị." Chúng ta đã có dòng này ở dòng trên cùng của mã và có thể thấy ảnh chụp màn hình ở trên có dòng `90DaysOfDevOps user account being created` được hiển thị.
Bây giờ tập lệnh này có thể được sử dụng để nhanh chóng tích hợp và thiết lập người dùng mới trên hệ thống Linux của chúng ta. Nhưng có lẽ thay vì một vài người trong lịch sử phải giải quyết vấn đề này và sau đó phải lấy cho người khác tên người dùng hoặc mật khẩu mới của họ, chúng tôi có thể thêm một số đầu vào của người dùng mà chúng tôi đã đề cập trước đó để nắm bắt các biến của chúng tôi.
Bây giờ tập lệnh này có thể được sử dụng để nhanh chóng tích hợp và thiết lập người dùng mới trên hệ thống Linux của chúng ta. Nhưng có lẽ thay vì một vài người trong lịch sử phải giải quyết vấn đề này và sau đó phải lấy cho người khác tên người dùng hoặc mật khẩu mới của họ, chúng ta có thể thêm một số đầu vào của người dùng mà chúng ta đã đề cập trước đó để nắm bắt các biến.
```
#! /usr/bin/bash

View File

@ -90,7 +90,7 @@ Trước khi chúng ta đi vào một nhà cung cấp cụ thể, tôi đã tạ
[Link to Twitter Poll](https://twitter.com/MichaelCade1/status/1486814904510259208?s=20&t=x2n6QhyOXSUs7Pq0itdIIQ)
Bất kỳ nhà cung cấp nào nhận được tỷ lệ phần trăm cao nhất, chúng tôi sẽ tìm hiểu sâu hơn về cách dịch vụ của nhà cung cấp đó. Tôi nghĩ điều quan trọng cần đề cập là các dịch vụ từ các nhà cung cấp này đều khá giống nhau, đó là lý do tại sao tôi nói là hãy bắt đầu với một nhà cung cấp bất kì. Tôi nhận thấy rằng, khi biết nền tảng của một nhà cung cấp như cách tạo máy ảo, thiết lập mạng,... thì tôi đã có thể sử dụng dịch vụ của các nhà cung cấp khác và có thể nhanh chóng sử dụng chúng.
Bất kỳ nhà cung cấp nào nhận được tỷ lệ phần trăm cao nhất, chúng ta sẽ tìm hiểu sâu hơn về cách dịch vụ của nhà cung cấp đó. Tôi nghĩ điều quan trọng cần đề cập là các dịch vụ từ các nhà cung cấp này đều khá giống nhau, đó là lý do tại sao tôi nói là hãy bắt đầu với một nhà cung cấp bất kì. Tôi nhận thấy rằng, khi biết nền tảng của một nhà cung cấp như cách tạo máy ảo, thiết lập mạng,... thì tôi đã có thể sử dụng dịch vụ của các nhà cung cấp khác và có thể nhanh chóng sử dụng chúng.
Dù như thế nào, tôi cũng sẽ chia sẻ một số tài nguyên **MIỄN PHÍ** về cả ba nhà cung cấp lớn nhất.

View File

@ -61,7 +61,7 @@ Hãy nhớ rằng Microsoft Azure là một đám mây tính phí theo mô hình
Nếu bạn là một Doanh nghiệp thì bạn có thể muốn hoặc có một thoả thuận Doanh nghiệp với Microsoft để cho phép công ty của bạn sử dụng các dịch vụ của Azure.
Nếu bạn giống tôi và bạn đang sử dụng Microsoft Azure cho mục đích học tập thì chúng tôi có một số tùy chọn khác.
Nếu bạn giống tôi và bạn đang sử dụng Microsoft Azure cho mục đích học tập thì chúng ta có một số tùy chọn khác.
Chúng ta có [tài khoản Microsoft Azure miễn phí](https://azure.microsoft.com/en-gb/free/) và thường sẽ có một số tín dụng (tiền) miễn phí để bạn có thể sử dụng Azure trong một khoảng thời gian.
@ -120,7 +120,7 @@ Tiếp theo, chúng ta có resource group, đây là nơi chúng ta kết hợp
![](../../Days/Images/Day29_Cloud8.png)
Với những gì chúng ta có thể làm trong vài ngày tới, chúng tôi muốn tại resource group của riêng mình. Điều này được thực hiện dễ dàng trong console bằng cách nhấn "Create" trong hình ảnh ở trên.
Với những gì chúng ta có thể làm trong vài ngày tới, chúng ta muốn tạo resource group của riêng mình. Điều này được thực hiện dễ dàng trong console bằng cách nhấn "Create" trong hình ảnh ở trên.
![](../../Days/Images/Day29_Cloud9.png)

View File

@ -62,7 +62,7 @@ Tôi chưa từng xem xét vấn đề này trước đây nhưng tôi có thể
### Role-Based Access Control
Chúng ta đã đề cập vào [ngày 29](day29.md) phạm vi mà chúng tôi sẽ đề cập ở đây, chúng tôi có thể đặt kiểm soát RBAC của mình cho một trong những dịch vụ dưới đây.
Chúng ta đã đề cập vào [ngày 29](day29.md) phạm vi mà chúng ta sẽ đề cập ở đây, chúng ta có thể đặt kiểm soát RBAC của mình cho một trong những dịch vụ dưới đây.
- Subscriptions
- Management Group
@ -140,7 +140,7 @@ Sau đó, tôi thêm một người dùng user1@90DaysOfDevOps.com và nếu ch
![](../../Days/Images/Day30_Cloud14.png)
Nếu có khoảng 100 yêu cầu như thế này, chúng ta sẽ không muốn thực hiện tất cả điều này trong bảng điều khiển mà chúng tôi muốn tận dụng hoặc là các tuỳ chọn hàng loạt (bulk options) để tạo, mời, và xoá người dùng hoặc bạn có thể muốn sử dụng Powershell để làm điều này một cách tự động để có thể scale.
Nếu có khoảng 100 yêu cầu như thế này, chúng ta sẽ không muốn thực hiện tất cả điều này trong bảng điều khiển mà chúng ta muốn tận dụng hoặc là các tuỳ chọn hàng loạt (bulk options) để tạo, mời, và xoá người dùng hoặc bạn có thể muốn sử dụng Powershell để làm điều này một cách tự động để có thể scale.
Bây giờ, chúng ta có thể vào Resource group của mình và chỉ định rằng trong nhóm tài nguyên 90DaysOfDevOps, chúng ta muốn chủ sở hữu (owner) của nó là nhóm chúng ta vừa mới tạo.

View File

@ -48,7 +48,7 @@ Sau đó, trong drop-down, bạn có thể thấy chúng ta có ba tuỳ chọn
![](../../Days/Images/Day32_Cloud5.png)
Có rất nhiều tuỳ chọn nâng cao hơn có sẵn cho tài khoản lưu trữ của bạn, nhưng hiện tại, chúng tôi không cần phải truy cập vào các phần này. Các tuỳ chọn này là về mã hoá và bảo vệ dữ liệu.
Có rất nhiều tuỳ chọn nâng cao hơn có sẵn cho tài khoản lưu trữ của bạn, nhưng hiện tại, chúng ta không cần phải truy cập vào các phần này. Các tuỳ chọn này là về mã hoá và bảo vệ dữ liệu.
### Ổ đĩa được quản lý - Managed Disks

View File

@ -58,7 +58,7 @@ Chúng ta cũng có Virtual Network Peering. Điều này cho phép các mạng
| ILB | 1010 | Azure LoadBalancer | \* | \* | 10000 | Allow |
| Deny All Inbound | 4000 | \* | \* | \* | \* | DENY |
Chúng tôi cũng có Application Security Groups (ASGs)
Chúng ta cũng có Application Security Groups (ASGs)
- Trường hợp NSG tập trung vào dải địa chỉ IP có thể khó duy trì đối với môi trường đang phát triển.
- ASG cho phép xác định tên thật (Monikers) cho các vai trò ứng dụng khác nhau (Máy chủ web, máy chủ DB, WebApp1, v.v.)
@ -106,7 +106,7 @@ Azure PowerShell is a set of cmdlets for managing Azure resources directly from
We can see below that you can connect to your subscription using the PowerShell command `Connect-AzAccount`
Trước khi chúng tôi bắt đầu với Azure PowerShell, chúng ta nên biết tới PowerShell. PowerShell là một framework quản lý cấu hình và tự động hóa tác vụ, một command-line shell và ngôn ngữ kịch bản. Nó giống với những gì chúng ta đã tìm hiểu trong phần shell scripting cho Linux. PowerShell lúc đầu được sử dụng rộng rãi trên hệ điều hành Windows nhưng giờ đây nó đã có trên nhiều nền tảng.
Trước khi chúng ta bắt đầu với Azure PowerShell, chúng ta nên biết tới PowerShell. PowerShell là một framework quản lý cấu hình và tự động hóa tác vụ, một command-line shell và ngôn ngữ kịch bản. Nó giống với những gì chúng ta đã tìm hiểu trong phần shell scripting cho Linux. PowerShell lúc đầu được sử dụng rộng rãi trên hệ điều hành Windows nhưng giờ đây nó đã có trên nhiều nền tảng.
Azure PowerShell là một tập hợp các lệnh ghép ngắn để quản lý tài nguyên Azure trực tiếp từ dòng lệnh PowerShell.

View File

@ -33,7 +33,7 @@ Sau đó, tôi đã tạo tập lệnh PowerShell và tham khảo từ module đ
Vui lòng đảm bảo rằng bạn thay đổi vị trí tệp trong tập lệnh phù hợp với môi trường của mình.
Ở giai đoạn đầu tiên này, chúng tôi không có mạng ảo hoặc máy ảo nào được tạo trong môi trường của mình, tôi chỉ có một cloud shell storage được định cấu hình trong resource group của mình.
Ở giai đoạn đầu tiên này, chúng ta không có mạng ảo hoặc máy ảo nào được tạo trong môi trường của mình, tôi chỉ có một cloud shell storage được định cấu hình trong resource group của mình.
Trước hết, tôi chạy [PowerShell script](../../Days/Cloud/01VirtualNetworking/Module4_90DaysOfDevOps.ps1) của mình
@ -98,7 +98,7 @@ Tôi gặp một vấn đề khác ở đây là tài khoản của tôi không
![](../../Days/Images/Day34_Cloud14.png)
![](../../Days/Images/Day34_Cloud15.png)
Sau đó, tôi có thể quay lại tài khoản michael.cade@90DaysOfDevOps.com của mình và tiếp tục phần này. Ở đây chúng tôi đang chạy lại vài bài test tương tự nhưng bây giờ đã có thể truy cập được.
Sau đó, tôi có thể quay lại tài khoản michael.cade@90DaysOfDevOps.com của mình và tiếp tục phần này. Ở đây chúng ta đang chạy lại vài bài test tương tự nhưng bây giờ đã có thể truy cập được.
![](../../Days/Images/Day34_Cloud16.png)
@ -194,6 +194,6 @@ Bài lab này kết thúc phần tìm hiểu về Microsoft Azure nói riêng v
- [Google Cloud Digital Leader Certification Course](https://www.youtube.com/watch?v=UGRDM86MBIQ&list=WL&index=131&t=10s)
- [AWS Basics for Beginners - Full Course](https://www.youtube.com/watch?v=ulprqHHWlng&t=5352s)
Tiếp theo, chúng ta sẽ đi sâu vào các hệ thống kiểm soát phiên bản, cụ thể là xung quanh git và sau đó là tổng quan về kho lưu trữ mã và chúng tôi sẽ chọn GitHub vì đây là lựa chọn ưa thích của tôi.
Tiếp theo, chúng ta sẽ đi sâu vào các hệ thống kiểm soát phiên bản, cụ thể là xung quanh git và sau đó là tổng quan về kho lưu trữ mã và chúng ta sẽ chọn GitHub vì đây là lựa chọn ưa thích của tôi.
Hẹn gặp lại vào [ngày 35](day35.md)

View File

@ -28,7 +28,7 @@ Tôi đã bắt đầu áp dụng quản lý phiên bản không chỉ đối v
Tuy nhiên, để tránh hiểu lầm **Quản lý phiên bản không hoạt động như một bản sao lưu**
Một lợi ích khác của quản lý phiên bản là khả năng quản lý nhiều phiên bản của một dự án. Lấy ví dụ như chúng ta có một ứng dụng miễn phí và sau đó là ứng dụng trả phí có sẵn trên tất cả các hệ điều hành. Phần lớn mã được chia sẽ giữa hai ứng dụng. Chúng tôi có thể sao chép và dán mã của mình cho từng commit vào từng ứng dụng, nhưng điều đó sẽ rất lộn xộn, đặc biệt là khi bạn mở rộng quy mô phát triển với nhiều nhân sự, cũng sẽ rất dễ mắc lỗi.
Một lợi ích khác của quản lý phiên bản là khả năng quản lý nhiều phiên bản của một dự án. Lấy ví dụ như chúng ta có một ứng dụng miễn phí và sau đó là ứng dụng trả phí có sẵn trên tất cả các hệ điều hành. Phần lớn mã được chia sẽ giữa hai ứng dụng. Chúng ta có thể sao chép và dán mã của mình cho từng commit vào từng ứng dụng, nhưng điều đó sẽ rất lộn xộn, đặc biệt là khi bạn mở rộng quy mô phát triển với nhiều nhân sự, cũng sẽ rất dễ mắc lỗi.
Ứng dụng trả phí là nơi chúng ta có các chứ năng bổ sung, hãy gọi chúng là các commit trả phí, bản miễn phí sẽ chỉ chứa các commit bình thường.

View File

@ -56,7 +56,7 @@ Hầu như tất cả các công cụ phát triển hiện đại đều hỗ tr
- Công cụ nhóm - Cũng được đề cập trong các công cụ như Jenkins theo góc nhìn CI/CD, Slack từ góc độ dịch vụ nhắn tin và Jira từ góc độ quản lý dự án và theo dõi vấn đề.
- Cloud providers - Tất cả các nhà cung cấp điện toán đám mây lớn đều hỗ trợ git, Microsoft Azure, Amazon AWS và Google Cloud Platform.
- Các dịch vụ dựa trên Git - Sau đó, chúng ta có GitHub, GitLab và BitBucket mà chúng tôi sẽ đề cập rõ hơn ở phần sau. Các dịch vụ này có thể coi như là một mạng xã hội dành cho mã nguồn.
- Các dịch vụ dựa trên Git - Sau đó, chúng ta có GitHub, GitLab và BitBucket mà chúng ta sẽ đề cập rõ hơn ở phần sau. Các dịch vụ này có thể coi như là một mạng xã hội dành cho mã nguồn.
### Git Cheatsheet

View File

@ -38,7 +38,7 @@ Tiếp theo chúng ta sẽ commit tệp này với commit đầu tiên của ch
### Commit các thay đổi
Chúng ta rất có thể muốn thêm nhiều tệp hơn hoặc thậm chí thay đổi các tệp chúng ta có trong thư mục của mình. Chúng tôi đã thực hiện commit đầu tiên của mình ở trên. Nhưng bây giờ, chúng ta sẽ thêm nhiều chi tiết và nhiều tệp hơn.
Chúng ta rất có thể muốn thêm nhiều tệp hơn hoặc thậm chí thay đổi các tệp chúng ta có trong thư mục của mình. Chúng ta đã thực hiện commit đầu tiên của mình ở trên. Nhưng bây giờ, chúng ta sẽ thêm nhiều chi tiết và nhiều tệp hơn.
Chúng ta có thể lặp lại các quy trình của mình như trước đó, tạo hoặc chỉnh sửa tệp của mình > `git add .` để thêm tất cả các file vào khu vực staging sau đó sử dụng `git commit -m "meaningful message"`. Nhưng để đưa ra một thông điệp có ý nghĩa cho thay đổi trong commit của mình, bạn có lẽ không nên viết ra những thứ như `git commit -m "Chà, tôi đã thay đổi một số mã vì nó không hoạt động và khi tôi sửa mã đó, tôi cũng đã thêm một số thứ mới trong readme.md để đảm bảo rằng mọi người đều biết về trải nghiệm của người dùng và sau đó tôi pha một ấm trà."` Ý tôi là điều này cũng có thể sẽ hiệu quả mặc dù hơi dài dòng nhưng các tốt hơn ở đây là nên thêm thông điệp bằng một trình soạn thảo văn bản.
@ -68,7 +68,7 @@ Câu trả lời là có nhưng đừng coi đây là một lối tắt, bạn p
### Xoá tệp
Còn việc xoá tệp khỏi dự án của chúng tôi thì sao, có thể chúng ta có một tệp khác trong thư mục mà chúng ta đã cam kết nhưng hiện tại dự án không còn cần hoặc sử dụng tệp đó nữa, các tốt nhất là chúng ta nên xoá tệp đó.
Còn việc xoá tệp khỏi dự án của chúng ta thì sao, có thể chúng ta có một tệp khác trong thư mục mà chúng ta đã cam kết nhưng hiện tại dự án không còn cần hoặc sử dụng tệp đó nữa, các tốt nhất là chúng ta nên xoá tệp đó.
Chỉ vì chúng ta xoá tệp đó khỏi thư mục, git vẫn biết tệp này và chúng ta cũng cần xoá tệp khỏi repository. Bạn có thể thấy workflow như bên dưới.

View File

@ -89,7 +89,7 @@ Chúng ta có thể đảo ngược điều này và bắt đầu với commit h
### Xem một commit
Việc có thể xem nội dung commit là một điều tuyệt vời nếu bạn có ý thức tuân theo các best practices và có những nội dung commit có ý nghĩa. Tuy nhiên, cũng có lệnh `git show` cho phép chúng tôi kiểm tra và xem một commit.
Việc có thể xem nội dung commit là một điều tuyệt vời nếu bạn có ý thức tuân theo các best practices và có những nội dung commit có ý nghĩa. Tuy nhiên, cũng có lệnh `git show` cho phép chúng ta kiểm tra và xem một commit.
Chúng ta có thể sử dụng `git log --oneline --reverse` để lấy danh sách các commit của mình rồi lấy chúng và chạy `git show <commit ID>`
@ -119,7 +119,7 @@ Sẽ có lúc bạn có thể đã sử dụng `git add .` nhưng có những t
![](../../Days/Images/Day39_Git19.png)
Chúng ta cũng có thể thực hiện tương tự với các tệp đã sửa đổi, chẳng hạn như main.js và hủy thực hiện commit, như ở trên chúng tôi có chữ M màu xanh lá cây để sửa đổi và sau đó bên dưới chúng ta sẽ hủy thực hiện những thay đổi đó.
Chúng ta cũng có thể thực hiện tương tự với các tệp đã sửa đổi, chẳng hạn như main.js và hủy thực hiện commit, như ở trên chúng ta có chữ M màu xanh lá cây để sửa đổi và sau đó bên dưới chúng ta sẽ hủy thực hiện những thay đổi đó.
![](../../Days/Images/Day39_Git20.png)
@ -147,7 +147,7 @@ Ví dụ: hãy xóa tệp quan trọng nhất trong thư mục của chúng ta,
![](../../Days/Images/Day39_Git24.png)
Bây giờ, không còn readme.md trong thư mục làm việc của chúng tôi. Chúng ta có thể đã sử dụng `git rm readme.md` và nó sẽ được phản ánh trong cơ sở dữ liệu git. Chúng ta cũng hãy xóa nó khỏi đây để mô phỏng việc nó bị xóa hoàn toàn.
Bây giờ, không còn readme.md trong thư mục làm việc của chúng ta. Chúng ta có thể đã sử dụng `git rm readme.md` và nó sẽ được phản ánh trong cơ sở dữ liệu git. Chúng ta cũng hãy xóa nó khỏi đây để mô phỏng việc nó bị xóa hoàn toàn.
![](../../Days/Images/Day39_Git25.png)

View File

@ -27,11 +27,11 @@ Không có lựa chọn nào ở trên là đúng hay sai, nhưng chúng đều
Tôi cũng muốn nói rằng nếu bạn mới bắt đầu và đang phát triển một ứng dụng, bạn nên hướng tới các container đơn gỉan khi xét về tính hiệu quả, tốc độ và kích thước. Nhưng điều đó cũng đi kèm với một cái giá, nếu bạn không biết gì về container thì đó sẽ là một quá trình học tập để buộc bản thân bạn phải hiểu lý do tại sao chúng ta sử dụng và xây dựng một mindset mới. Nếu bạn đã phát triển các ứng dụng của mình theo một cách cụ thể hoặc chưa từng sử dụng containers thì bạn có thể có nhiều vấn đề khó giải quyết hơn trước cả khi xem xét đến việc sử dụng chúng.
Chúng tôi có nhiều sự lựa chọn khác nhau khi tải xuống một phần mềm nhất định, có rất nhiều hệ điều hành khác nhau mà chúng ta có thể đang sử dụng và hướng dẫn cụ thể về những gì chúng ta cần làm để cài đặt ứng dụng của mình.
Chúng ta có nhiều sự lựa chọn khác nhau khi tải xuống một phần mềm nhất định, có rất nhiều hệ điều hành khác nhau mà chúng ta có thể đang sử dụng và hướng dẫn cụ thể về những gì chúng ta cần làm để cài đặt ứng dụng của mình.
![](../../Days/Images/Day42_Containers1.png)
Gần đây, tôi nhận thấy rằng các ứng dụng mà chúng tôi có thể đã từng cần một hệ điều hành máy chủ đầy đủ, một máy ảo, một instance vật lý hoặc điện toán đám mây hiện đang phát hành các phiên bản phần mềm trên container của chúng. Tôi thấy điều này khá thú vị vì nó đứa thế giới của container và sau đó là Kubernetes tới mọi người chứ không chỉ tập trung vào các nhà phát triển ứng dụng.
Gần đây, tôi nhận thấy rằng các ứng dụng mà chúng ta có thể đã từng cần một hệ điều hành máy chủ đầy đủ, một máy ảo, một instance vật lý hoặc điện toán đám mây hiện đang phát hành các phiên bản phần mềm trên container của chúng. Tôi thấy điều này khá thú vị vì nó đứa thế giới của container và sau đó là Kubernetes tới mọi người chứ không chỉ tập trung vào các nhà phát triển ứng dụng.
![](../../Days/Images/Day42_Containers2.png)
@ -41,7 +41,7 @@ Như bạn có thể thấy như tôi đã nói trước đây, tôi sẽ không
Chúng ta đã có công nghệ container trong một thời gian dài, vậy tại sao trong 10 năm qua, điều này đã trở nên phổ biến, tôi có thể nói rằng thậm chí nó còn phổ biến hơn trong 5 năm qua. Chúng ta đã có container trong nhiều thập kỷ. Nó liên quan đến các thách thức của containers hay thậm chí các images, về cách chúng ta phân phối phần mềm của mình, bởi vì nếu chúng ta chỉ có công nghệ container, thì chúng ta vẫn sẽ gặp các vấn đề giống như chúng ta đã gặp phải với quản lý phần mềm.
Nếu chúng ta coi Docker như một công cụ, thì lý do khiến nó thành công là do hệ sinh thái images dễ tìm kiếm và sử dụng. Việc tích hợp vào hệ thống của bạn và thiết lập và chạy trở nên rất đơn giản. Một phần quan trọng của điều này là tính nhất quán, một trong những thách thức mà chúng ta phải đối mặt với việc triển phai, phát triển phần mềm. Không quan trọng đó là MongoDB hay nodeJS, quá trình thiết lập và chạy hai phần mềm này sẽ giống nhau. Việc tắt các ứng dụng trên cũng giống nhau. Tất cả những vấn đề vẫn sẽ tồn tại, nhưng điều tuyệt vời là khi chúng tôi kết hợp công nghệ images và containers với nhau, giờ đây chúng tôi có một bộ công cụ duy nhất giúp chúng tôi giải quyết tất cả các vấn đề được liệt kê dưới đây:
Nếu chúng ta coi Docker như một công cụ, thì lý do khiến nó thành công là do hệ sinh thái images dễ tìm kiếm và sử dụng. Việc tích hợp vào hệ thống của bạn và thiết lập và chạy trở nên rất đơn giản. Một phần quan trọng của điều này là tính nhất quán, một trong những thách thức mà chúng ta phải đối mặt với việc triển phai, phát triển phần mềm. Không quan trọng đó là MongoDB hay nodeJS, quá trình thiết lập và chạy hai phần mềm này sẽ giống nhau. Việc tắt các ứng dụng trên cũng giống nhau. Tất cả những vấn đề vẫn sẽ tồn tại, nhưng điều tuyệt vời là khi chúng ta kết hợp công nghệ images và containers với nhau, giờ đây chúng ta có một bộ công cụ duy nhất giúp chúng ta giải quyết tất cả các vấn đề được liệt kê dưới đây:
- Đầu tiên chúng ta phải tìm phần mềm trên internet.
- Sau đó chúng ta phải tải phần mềm này về.
@ -111,7 +111,7 @@ Sử dụng các container, bạn có thể mở rộng các container và sử
### Container là gì?
Khi chúng ta chạy các ứng dụng trên máy tính, đây có thể là VSCode hoặc trình duyệt web mà bạn đang sử dụng để đọc bài viết này. Ứng dụng đó đang chạy dưới dạng một process hoặc một thứ gì đó coi là một process. Trên máy tính xách tay hoặc hệ thống của chúng ta, chúng ta có xu hướng chạy nhiều ứng dụng hoặc như chúng tôi đã nói là các process. Khi chúng ta mở một ứng dụng mới hoặc click vào biểu tượng ứng dụng, đây là ứng dụng chúng ta muốn chạy, đôi khi ứng dụng này có thể là một dịch vụ mà chúng tôi chỉ muốn chạy nền, hệ điều hành của chúng ta có rất nhiều các dịch vụ chạy nền cung cấp cho bạn trải nghiệm người dùng mà bạn có đang có với hệ thống.
Khi chúng ta chạy các ứng dụng trên máy tính, đây có thể là VSCode hoặc trình duyệt web mà bạn đang sử dụng để đọc bài viết này. Ứng dụng đó đang chạy dưới dạng một process hoặc một thứ gì đó coi là một process. Trên máy tính xách tay hoặc hệ thống của chúng ta, chúng ta có xu hướng chạy nhiều ứng dụng hoặc như chúng ta đã nói là các process. Khi chúng ta mở một ứng dụng mới hoặc click vào biểu tượng ứng dụng, đây là ứng dụng chúng ta muốn chạy, đôi khi ứng dụng này có thể là một dịch vụ mà chúng ta chỉ muốn chạy nền, hệ điều hành của chúng ta có rất nhiều các dịch vụ chạy nền cung cấp cho bạn trải nghiệm người dùng mà bạn có đang có với hệ thống.
Biểu tượng ứng dụng đó đại diện cho một liên kết đến một tệp thực thi ở đâu đó trên hệ thống tệp của bạn, sau đó hệ điều hành sẽ tải tệp thực thi đó vào bộ nhớ. Thật thú vị, tệp thực thi đó đôi khi được nhắc tới như là một hình ảnh khi chúng ta đang nói về một process.

View File

@ -82,7 +82,7 @@ Quay lại tab Containers/Apps, nhấp vào container đang chạy của bạn.
![](../../Days/Images/Day44_Containers15.png)
Khi chúng tôi nhấn vào nút đó ở trên, chắc chắn rằng một trang web sẽ được mở ra và hiển thị nội dung tương tự như bên dưới.
Khi chúng ta nhấn vào nút đó ở trên, chắc chắn rằng một trang web sẽ được mở ra và hiển thị nội dung tương tự như bên dưới.
Container này cũng có thêm một số chi tiết về container và image của chúng ta.
@ -118,7 +118,7 @@ Bạn có thể thấy bên dưới khi chúng ta chạy lệnh, giờ đây ch
![](../../Days/Images/Day44_Containers21.png)
Chúng tôi có bash shell nhưng chúng ta không có gì khác, đó là lý do tại sao container image này nhỏ hơn 30 MB.
Chúng ta có bash shell nhưng chúng ta không có gì khác, đó là lý do tại sao container image này nhỏ hơn 30 MB.
![](../../Days/Images/Day44_Containers22.png)

View File

@ -50,7 +50,7 @@ Việc sử dụng phương pháp dockerfile phù hợp hơn nhiều với việ
Dockerfile là một quy trình gồm ba bước, theo đó bạn tạo dockerfile và thêm các lệnh bạn cần để tạo nên một image.
Bảng sau đây chứa một số câu lệnh dockerfile mà chúng tôi sẽ sử dụng và rất có thể bạn cũng sẽ sử dụng.
Bảng sau đây chứa một số câu lệnh dockerfile mà chúng ta sẽ sử dụng và rất có thể bạn cũng sẽ sử dụng.
| Lệnh | Mục đích |
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------- |

View File

@ -81,9 +81,9 @@ volumes:
wordpress_data: {}
```
Chúng ta khai báo một phiên bản và sau đó một phần lớn của tệp docker-compose.yml này được tạo thành từ các services, chúng tôi có service DB và service WordPress. Bạn có thể thấy mỗi trong số đó có một image được xác định bằng version tag. Bây giờ chúng ta sẽ tạo các volumes để có thể lưu trữ cơ sở dữ liệu của mình ở đó.
Chúng ta khai báo một phiên bản và sau đó một phần lớn của tệp docker-compose.yml này được tạo thành từ các services, chúng ta có service DB và service WordPress. Bạn có thể thấy mỗi trong số đó có một image được xác định bằng version tag. Bây giờ chúng ta sẽ tạo các volumes để có thể lưu trữ cơ sở dữ liệu của mình ở đó.
Sau đó, chúng tôi có một số biến môi trường (environment) như mật khẩu và tên người dùng. Các tệp này có thể trở nên rất phức tạp nhưng tệp cấu hình YAML đơn giản hóa giao diện tổng thể của chúng.
Sau đó, chúng ta có một số biến môi trường (environment) như mật khẩu và tên người dùng. Các tệp này có thể trở nên rất phức tạp nhưng tệp cấu hình YAML đơn giản hóa giao diện tổng thể của chúng.
### Xây dựng dự án
@ -103,7 +103,7 @@ Tiếp theo, chúng ta có thể xác thực việc đã thiết lập và chạ
![](../../Days/Images/Day46_Containers4.png)
Chúng tôi có thể trải qua quá trình thiết lập WordPress và sau đó có thể bắt đầu xây dựng trang web của mình với bảng điều khiển bên dưới.
Chúng ta có thể trải qua quá trình thiết lập WordPress và sau đó có thể bắt đầu xây dựng trang web của mình với bảng điều khiển bên dưới.
![](../../Days/Images/Day46_Containers5.png)
@ -149,7 +149,7 @@ Bây giờ, khi chúng ta sử dụng lại `docker-compose up -d`, các ứng d
Thú thật rằng khi tôi bắt đầu tìm hiểu về docker-compose và các khả năng của nó, tôi đã bối rối không biết nó nằm ở đâu bên cạnh hoặc với các công cụ Điều phối containers (Container Orchestration) như Kubernetes, mọi thứ chúng ta đã làm ở đây trong bản demo ngắn này đều tập trung vào một máy chủ khi chạy WordPress và DB trên máy tính để bàn cục bộ. Chúng ta không có nhiều máy ảo hoặc nhiều máy chủ vật lý, chúng ta cũng không thể dễ dàng mở rộng và thu nhỏ các yêu cầu của ứng dụng của mình.
Phần tiếp theo của chúng tôi sẽ đề cập đến Kubernetes nhưng trước tiên chúng tôi có một vài ngày nữa về Container nói chung.
Phần tiếp theo của chúng ta sẽ đề cập đến Kubernetes nhưng trước tiên chúng ta có một vài ngày nữa về Container nói chung.
Đây cũng là một nguồn tài nguyên tuyệt vời cho các mẫu ứng dụng docker-compose với nhiều tích hợp khác nhau. [Awesome-Compose](https://github.com/docker/awesome-compose)

View File

@ -81,7 +81,7 @@ Bây giờ chúng ta cần địa chỉ IP cho máy chủ thực tế của mìn
![](../../Days/Images/Day47_Containers9.png)
Sau đó, chúng tôi có thể lấy IP này, mở trình duyệt và truy cập `http://172.25.218.154:8080/` IP của bạn có thể khác. Điều này xác nhận rằng có thể truy cập được NGINX.
Sau đó, chúng ta có thể lấy IP này, mở trình duyệt và truy cập `http://172.25.218.154:8080/` IP của bạn có thể khác. Điều này xác nhận rằng có thể truy cập được NGINX.
![](../../Days/Images/Day47_Containers10.png)

View File

@ -43,7 +43,7 @@ Bây giờ chúng ta có thể sử dụng rất nhiều lệnh tương tự v
![](../../Days/Images/Day48_Containers1.png)
Sau đó, chúng tôi có thể chạy hình ảnh Ubuntu của mình bằng cách sử dụng `podman run -dit ubuntu``podman ps` để xem hình ảnh đang chạy của chúng ta.
Sau đó, chúng ta có thể chạy hình ảnh Ubuntu của mình bằng cách sử dụng `podman run -dit ubuntu``podman ps` để xem hình ảnh đang chạy của chúng ta.
![](../../Days/Images/Day48_Containers2.png)

View File

@ -34,7 +34,7 @@ Là một phần của danh sách dài các ứng dụng có sẵn trong arkade,
![](../../Days/Images/Day51_Kubernetes3.png)
Chúng tôi cũng sẽ cần kubectl như một phần của các công cụ, vì vậy bạn cũng có thể cài đặt nó thông qua arkade hoặc tôi tin rằng theo như tài liệu của minikube, nó cũng được cài đặt thông qua câu lệnh curl ở bên trên. Chúng ta sẽ nói về kubectl ở phần sau của bài viết.
Chúng ta cũng sẽ cần kubectl như một phần của các công cụ, vì vậy bạn cũng có thể cài đặt nó thông qua arkade hoặc tôi tin rằng theo như tài liệu của minikube, nó cũng được cài đặt thông qua câu lệnh curl ở bên trên. Chúng ta sẽ nói về kubectl ở phần sau của bài viết.
### Bắt đầu và chạy Kubernetes cluster

View File

@ -76,7 +76,7 @@ Bây giờ chúng ta đã có các nodes hoặc máy ảo sẵn sàng, sau đó
![](../../Days/Images/Day53_Kubernetes10.png)
Chúng tôi sẽ chọn "custom" vì chúng ta không sử dụng một trong các nền tảng được tích hợp. Trang mở đầu là nơi bạn xác định tên cluster của mình (có ghi local ở dưới nhưng bạn không thể sử dụng local, cluster của chúng ta là vagrant). Bạn có thể xác định các phiên bản Kubernetes tại đây, nhà cung cấp mạng và một số tuỳ chọn cấu hình khác để khởi động và chạy cụm Kubernetes của bạn.
Chúng ta sẽ chọn "custom" vì chúng ta không sử dụng một trong các nền tảng được tích hợp. Trang mở đầu là nơi bạn xác định tên cluster của mình (có ghi local ở dưới nhưng bạn không thể sử dụng local, cluster của chúng ta là vagrant). Bạn có thể xác định các phiên bản Kubernetes tại đây, nhà cung cấp mạng và một số tuỳ chọn cấu hình khác để khởi động và chạy cụm Kubernetes của bạn.
![](../../Days/Images/Day53_Kubernetes11.png)
@ -100,7 +100,7 @@ sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kube
![](../../Days/Images/Day53_Kubernetes14.png)
Trong 3 ngày vừa qua, chúng ta đã sử dụng một số cách khác nhau để thiết lập và chạy với Kubernetes cluster, trong những ngày còn lại, chúng tôi sẽ xem xét khía cạnh ứng dụng của nền tảng và nó được cho là phần quan trọng nhất. Chúng ta sẽ xem xét các dịch vụ và khả năng cung cấp cũng như sử dụng dịch vụ của chúng ta trong Kubernetes.
Trong 3 ngày vừa qua, chúng ta đã sử dụng một số cách khác nhau để thiết lập và chạy với Kubernetes cluster, trong những ngày còn lại, chúng ta sẽ xem xét khía cạnh ứng dụng của nền tảng và nó được cho là phần quan trọng nhất. Chúng ta sẽ xem xét các dịch vụ và khả năng cung cấp cũng như sử dụng dịch vụ của chúng ta trong Kubernetes.
Tôi đã được nói rằng các yêu cầu xung quanh việc khởi động các rancher node yêu cầu các máy ảo phải có 4GB ram nếu không chúng sẽ gặp sự cố, tôi đã cập nhật vì các worker nodes của chúng ta chỉ có 2GB.

View File

@ -33,7 +33,7 @@ Khi nói đến StatefulSets hoặc ứng dụng có trạng thái, những đi
Bạn có thể thấy một số thứ trong demo của chúng ta ngay sau đây về việc mỗi pods có một định danh riêng. Với ứng dụng phi trạng thái, bạn sẽ thấy các tên ngẫu nhiên, ví dụ: `app-7469bbb6d7-9mhxd` trong khi ứng dụng có trạng thái sẽ được sắp xếp nghiêm chỉnh hơn với `mongo-0` và khi được mở rộng quy mô, nó sẽ ạo một pod mới có tên là `mongo-1`.
Các pods này được tạo từ cùng một cấu hình, nhưng chúng không thể hoán đổi cho nhau. Mỗi nhóm StatefulSet có một mã định danh cố định trong mọi lần lập lịch lại. Điều này là cần thiết bởi vì khi chúng ta yêu cầu các workloads có trạng thái ví dụ như cơ sở dữ liệu nơi chúng ta có các yêu cầu ghi và đọc, chúng ta không thể có hai pods cùng ghi một lúc mà không biết về việc này vì chúng sẽ khiến dữ liệu mất đi tính nhất quán. Chúng ta cần đảm bảo rằng chỉ một trong số các pods của chúng ta ghi vào cơ sở dữ liệu tại bất kỳ thời điểm nào, tuy nhiên, chúng tôi có thể có nhiều pods đọc dữ liệu đó.
Các pods này được tạo từ cùng một cấu hình, nhưng chúng không thể hoán đổi cho nhau. Mỗi nhóm StatefulSet có một mã định danh cố định trong mọi lần lập lịch lại. Điều này là cần thiết bởi vì khi chúng ta yêu cầu các workloads có trạng thái ví dụ như cơ sở dữ liệu nơi chúng ta có các yêu cầu ghi và đọc, chúng ta không thể có hai pods cùng ghi một lúc mà không biết về việc này vì chúng sẽ khiến dữ liệu mất đi tính nhất quán. Chúng ta cần đảm bảo rằng chỉ một trong số các pods của chúng ta ghi vào cơ sở dữ liệu tại bất kỳ thời điểm nào, tuy nhiên, chúng ta có thể có nhiều pods đọc dữ liệu đó.
Mỗi pod trong StatefulSet sẽ có quyền truy cập vào persistent volume và một bản sao của cơ sở dữ liệu để đọc từ đó, và nó sẽ được cập nhật liên tự từ bản gốc. Một điều thú vị khác cần lưu ý là mỗi pod cũng sẽ lưu trữ trạng thái pod của nó trong persistent volume này, nếu sau đó `mongo-0` bị chết thì một pod mới sẽ được cung cấp và nó sẽ tiếp quản trạng thái pod được lưu trong bộ lưu trữ.

View File

@ -78,7 +78,7 @@ resource "aws_instance" "90daysofdevops" {
}
```
Từ ví dụ trên, bạn có thể thấy chúng tôi cũng đang chạy lệnh `yum update` và cài đặt `httpd` vào máy chủ EC2 của chúng tôi.
Từ ví dụ trên, bạn có thể thấy chúng ta cũng đang chạy lệnh `yum update` và cài đặt `httpd` vào máy chủ EC2.
Nếu chúng ta nhìn vào toàn bộ tệp main.tf, nó có thể trông giống như sau:

View File

@ -38,7 +38,7 @@ Trước khi chúng ta bắt đầu xem xét việc kiểm soát các node khác
![](../../Days/Images/Day64_config2.png)
Hoặc cách sử dụng thực tế cho một module có thể là `ansible webservers -m service -a "name=httpd state=started"` điều này sẽ cho chúng tôi biết liệu tất cả máy chủ web của chúng tôi có dịch vụ httpd đang chạy hay không. Thuật ngữ máy chủ web được sử dụng trong lệnh đó.
Hoặc cách sử dụng thực tế cho một module có thể là `ansible webservers -m service -a "name=httpd state=started"` điều này sẽ cho chúng ta biết liệu tất cả máy chủ web có dịch vụ httpd đang chạy hay không. Thuật ngữ máy chủ web được sử dụng trong lệnh đó.
### hosts
@ -50,11 +50,11 @@ Cách tôi sử dụng máy chủ cục bộ ở trên để chạy module ping
![](../../Days/Images/Day64_config4.png)
Tệp chúng tôi muốn chỉnh sửa là tệp hosts, sử dụng trình soạn thảo văn bản, chúng ta có thể định nghĩa máy chủ của mình. Tệp hosts chứa nhiều hướng dẫn về cách sử dụng và sửa đổi tệp. Chúng ta sẽ cuộn xuống dưới cùng và sẽ tạo một nhóm mới có tên là [windows] và thêm địa chỉ IP `10.0.0.1` của chúng ta cho máy chủ lưu đó và lưu lại tệp.
Tệp chúng ta muốn chỉnh sửa là tệp hosts, sử dụng trình soạn thảo văn bản, chúng ta có thể định nghĩa máy chủ của mình. Tệp hosts chứa nhiều hướng dẫn về cách sử dụng và sửa đổi tệp. Chúng ta sẽ cuộn xuống dưới cùng và sẽ tạo một nhóm mới có tên là [windows] và thêm địa chỉ IP `10.0.0.1` của chúng ta cho máy chủ lưu đó và lưu lại tệp.
![](../../Days/Images/Day64_config5.png)
Tuy nhiên, hãy nhớ rằng tôi đã nói rằng bạn sẽ cần có sẵn SSH để cho phép Ansible kết nối với hệ thống của bạn. Như bạn có thể thấy bên dưới khi tôi chạy `ansible windows -m ping`, chúng tôi không thể truy cập được vì mọi thứ không kết nối được qua SSH.
Tuy nhiên, hãy nhớ rằng tôi đã nói rằng bạn sẽ cần có sẵn SSH để cho phép Ansible kết nối với hệ thống của bạn. Như bạn có thể thấy bên dưới khi tôi chạy `ansible windows -m ping`, chúng ta không thể truy cập được vì mọi thứ không kết nối được qua SSH.
![](../../Days/Images/Day64_config6.png)

View File

@ -46,7 +46,7 @@ Bây giờ, nếu chúng ta muốn chỉ muốn nhắm tới proxy, chúng ta c
![](../../Days/Images/Day68_config2.png)
tags cũng có thể được thêm vào task để chúng ta có thể biết được chi tiết về nơi mà điều mà bạn muốn thực hiện. Đó có thể là các thẻ phân loại theo ứng dụng, chẳng hạn như chúng tôi có thể xem qua các tasks và gắn thẻ cho chúng dựa trên cài đặt (installation), cấu hình (configuration) hoặc xoá (removal). Một thẻ rất hữu ích khác mà bạn có thể sử dụng là `tag: always`, nó sẽ đảm bảo bất kể --tags bạn sử dụng trong lệnh của mình, lệnh ansible-playbook sẽ luôn được chạy khi có tags này.
tags cũng có thể được thêm vào task để chúng ta có thể biết được chi tiết về nơi mà điều mà bạn muốn thực hiện. Đó có thể là các thẻ phân loại theo ứng dụng, chẳng hạn như chúng ta có thể xem qua các tasks và gắn thẻ cho chúng dựa trên cài đặt (installation), cấu hình (configuration) hoặc xoá (removal). Một thẻ rất hữu ích khác mà bạn có thể sử dụng là `tag: always`, nó sẽ đảm bảo bất kể --tags bạn sử dụng trong lệnh của mình, lệnh ansible-playbook sẽ luôn được chạy khi có tags này.
Chúng ta cũng có thể sử dụng nhiều tags với nhau và nếu chúng ta chạy `ansible-playbook playbook5.yml --tags proxy,web` thì nó sẽ chạy tất cả các thành phần có các tags đó. Rõ ràng, trong trường hợp của chúng ta, điều đó có nghãi giống như chạy toàn bộ playbook, nhưng nó sẽ trở nên có ích nếu chúng ta có thêm các plays mới được bổ sung.

View File

@ -28,7 +28,7 @@ Dự án AWX hay viết tắt là AWX là một dự án cộng đồng mã ngu
Nếu bạn đang tìm kiếm một giải pháp cho doanh nghiệp thì bạn nên xem xét Automation Controller hoặc bạn có thể đã nghe tới cái tên Ansible Tower. Ansible Automation Controller là control plan cho nền tảng tự động của Ansible (Ansible Automation Platform).
Cả AWX và Automation Controller có những tính năng sau trong tất cả những tính năng khác mà chúng tôi đã đề cập trong loạt bài viết này cho tới thời điểm hiện tại.
Cả AWX và Automation Controller có những tính năng sau trong tất cả những tính năng khác mà chúng ta đã đề cập trong loạt bài viết này cho tới thời điểm hiện tại.
- Giao diện người dùng
- Kiểm soát truy cập dựa trên role (Role-Based Access Control)
@ -138,6 +138,6 @@ Bây giờ, chúng ta đã từng sử dụng `ansible-galaxy` để tạo một
Playlist cuối cùng được liệt kê ở trên có rất nhiều đoạn mã và ý tưởng cho bài viết này, nó là một video hướng dẫn tuyệt vời.
Bài đăng này kết thúc phần về quản lý cấu hình, tiếp theo chúng ta sẽ chuyển qua phần về CI/CD Pipelines và một số công cụ và quy trình mà chúng tôi có thể thấy và sử dụng để đạt được quy trình làm việc cho quá trình phát triển và phát hành ứng dụng.
Bài đăng này kết thúc phần về quản lý cấu hình, tiếp theo chúng ta sẽ chuyển qua phần về CI/CD Pipelines và một số công cụ và quy trình mà chúng ta có thể thấy và sử dụng để đạt được quy trình làm việc cho quá trình phát triển và phát hành ứng dụng.
Hẹn gặp lại vào [ngày 70](day70.md)

View File

@ -52,7 +52,7 @@ Như bạn mong đợi, Jenkins có nhiều đặc điểm bảo phủ nhiều l
### Jenkins Pipeline
Bạn sẽ thấy pipeline này nhưng được sử dụng ở phạm vi rộng hơn và ở đây chúng tôi đề cập tới các công cụ cụ thể.
Bạn sẽ thấy pipeline này nhưng được sử dụng ở phạm vi rộng hơn và ở đây chúng ta đề cập tới các công cụ cụ thể.
Bạn commit mã nguồn tới Jenkins, nơi sau đó sẽ xây dựng ứng dụng của bạn, với tất cả bài kiểm thử tự động, nó sẽ phát hành và triển khai mã nguồn đó khi mỗi bước được hoàn thành. Jenkins sẽ tự động hoá quá trình này.

View File

@ -112,7 +112,7 @@ jobs:
```
**github/super-linter**
Bạn có thể thấy phía trên rằng đối với một trong các bước của chúng tôi, chúng tôi có một action được gọi là `GitHub/super-linter` và điều này đang tham chiếu đến một step đã được cộng đồng viết trước đó. Bạn có thể tìm hiểu thêm về nó tại đây [Super-Linter](https://github.com/github/super-linter)
Bạn có thể thấy phía trên rằng đối với một trong các bước, chúng ta có một action được gọi là `GitHub/super-linter` và điều này đang tham chiếu đến một step đã được cộng đồng viết trước đó. Bạn có thể tìm hiểu thêm về nó tại đây [Super-Linter](https://github.com/github/super-linter)
"Kho lưu trữ này dành cho GitHub Action để chạy Super-Linter. Đây là một sự kết hợp đơn giản của các trình kiểm tra mã nguồn khác nhau, được viết bằng bash, để giúp xác minh mã nguồn của bạn."
@ -122,7 +122,7 @@ Cũng trong đoạn mã ở trên có đề cập đến GITHUB_TOKEN, nên tôi
Đoạn in đậm trên là điều quan trọng cần lưu ý ở giai đoạn này. Chúng ta đang sử dụng nó nhưng không cần phải thiết lập bất kỳ biến môi trường nào trong kho lưu trữ của chúng ta.
Chúng ta sẽ sử dụng kho lưu trữ mà chúng tôi đã sử dụng trong bài thực hành Jenkins để kiểm tra.[Jenkins-HelloWorld](https://github.com/MichaelCade/Jenkins-HelloWorld)
Chúng ta sẽ sử dụng kho lưu trữ mà chúng ta đã sử dụng trong bài thực hành Jenkins để kiểm tra.[Jenkins-HelloWorld](https://github.com/MichaelCade/Jenkins-HelloWorld)
Dưới đây là kho lưu trữ của chúng ta sau khi chúng ta kết thúc trong các buổi thực hành về Jenkins.
@ -161,7 +161,7 @@ Bây giờ nếu chúng ta giải quyết lỗi trong commit trên với mã c
![](../../Days/Images/Day75_CICD8.png)
Nếu bạn nhấp vào nút **new workflow** được đánh dấu ở trên, điều này sẽ mở ra cửa sổ cho một loạt lớn các action. Một điều bạn có thể đã nhận thấy trong suốt thử thách này là chúng tôi không muốn phải tạo lại mọi thứ, chúng tôi muốn đứng trên vai những người khổng lồ và chia sẻ mã nguồn, tự động hóa và kỹ năng của mình rộng rãi để làm cuộc sống dễ dàng hơn.
Nếu bạn nhấp vào nút **new workflow** được đánh dấu ở trên, điều này sẽ mở ra cửa sổ cho một loạt lớn các action. Một điều bạn có thể đã nhận thấy trong suốt thử thách này là chúng ta không muốn phải tạo lại mọi thứ, chúng ta muốn đứng trên vai những người khổng lồ và chia sẻ mã nguồn, tự động hóa và kỹ năng của mình rộng rãi để làm cuộc sống dễ dàng hơn.
![](../../Days/Images/Day75_CICD9.png)

83
2022/vi/Days/day77.md Normal file
View File

@ -0,0 +1,83 @@
---
title: '#90DaysOfDevOps - Bức tranh toàn cảnh: Giám sát - Ngày 77'
published: false
description: 90DaysOfDevOps - Bức tranh toàn cảnh: Giám sát
tags: 'devops, 90daysofdevops, learning'
cover_image: null
canonical_url: null
id: 1048715
---
## Bức tranh toàn cảnh: Giám sát
Trong tuần này chúng ta sẽ nói về giám sát, nó là gì và tại sao chúng ta cần nó?
### Giám sát là gì?
Giám sát là quá trình theo dõi chặt chẽ toàn bộ cơ sở hạ tầng
### và tại sao chúng ta cần nó?
Giả sử chúng ta đang quản lý một nghìn máy chủ, bao gồm nhiều loại máy chủ chuyên dụng như máy chủ ứng dụng, máy chủ cơ sở dữ liệu và máy chủ web. Chúng ta cũng có thể có các dịch vụ bổ sung và các nền tảng khác, bao gồm cả dịch vụ đám mây công cộng và Kubernetes.
![](Images/Day77_Monitoring1.png)
Chúng ta chịu trách nhiệm đảm bảo rằng tất cả các dịch vụ, ứng dụng và tài nguyên trên máy chủ đều hoạt động bình thường.
![](Images/Day77_Monitoring2.png)
Chúng ta làm điều đó như thế nào? có ba cách:
- Đăng nhập thủ công vào tất cả các máy chủ và kiểm tra tất cả dữ liệu về processes và tài nguyên, dịch vụ.
- Viết script đăng nhập vào máy chủ và kiểm tra dữ liệu.
Cả hai lựa chọn này đều tạo ra một khối lượng công việc đáng cho chúng ta
Tùy chọn thứ ba dễ dàng hơn, chúng ta có thể sử dụng giải pháp giám sát có sẵn trên thị trường.
Nagios và Zabbix là những giải pháp sẵn có, chúng cho phép chúng ta nâng cấp cơ sở hạ tầng giám sát của mình để quản lý nhiều máy chủ như chúng ta muốn.
### Nagios
Nagios là một công cụ giám sát cơ sở hạ tầng được phát triển bởi một công ty cùng tên. Phiên bản mã nguồn mở của công cụ này được gọi là Nagios core trong khi phiên bản thương mại có tên là Nagios XI. [Trang web của Nagios](https://www.nagios.org/)
Công cụ này cho phép chúng ta giám sát các máy chủ của mình và xem liệu chúng có đang được sử dụng hiệu quả hoặc có bất kỳ tasks lỗi nào cần giải quyết hay không.
![](Images/Day77_Monitoring3.png)
Về cơ bản, việc giám sát cho phép chúng ta đạt được hai mục tiêu này, kiểm tra trạng thái máy chủ và dịch vụ cũng như xác định tình trạng cơ sở hạ tầng. Nó cũng cung cấp cho chúng ta cái nhìn high-level về cơ sở hạ tầng hoàn chỉnh để xem liệu máy chủ có hoạt động hay không nếu các ứng dụng hoạt động hoạt động bình thường và các máy chủ web có thể truy cập được hay không.
Nó sẽ cho chúng ta biết rằng ổ đĩa của chúng ta đã tăng 10 phần trăm trong 10 tuần qua trên một máy chủ cụ thể, rằng nó sẽ cạn kiệt hoàn toàn trong vòng bốn hoặc năm ngày tới và nếu chúng ta không phản hồi sớm, nó sẽ cảnh báo khi đĩa hoặc máy chủ đang ở trạng thái nguy hiểm để chúng ta có thể thực hiện các hành động thích hợp nhằm tránh những sự cố ngừng hoạt động có thể xảy ra.
Trong trường hợp này, chúng ta có thể giải phóng một số dung lượng ổ đĩa và đảm bảo rằng máy chủ của chúng ta không bị lỗi và người dùng không bị ảnh hưởng.
Một câu hỏi khó đối với hầu hết các kỹ sư giám sát là chúng ta sẽ giám sát những gì? và có thể là chúng ta không giám sát những gì?
Mỗi hệ thống đều có một số tài nguyên, trong đó chúng ta nên theo dõi chặt chẽ tài nguyên nào và tài nguyên nào và chúng ta có thể nhắm mắt làm ngơ. Chẳng hạn như có cần thiết phải giám sát việc sử dụng CPU không, câu trả lời là rõ ràng là có, tuy nhiên đó vẫn là một quyết định cần phải được đưa ra. Có cần thiết phải theo dõi số lượng cổng mở trong hệ thống hay không, điều đó tùy thuộc vào tình huống. Nếu đó là một máy chủ đa năng thì chúng ta có thể sẽ không phải làm vậy, nhưng nếu đó là máy chủ web thì chúng ta nên làm điều đó.
### Giám sát liên tục
Giám sát không phải là một khái niệm mới và thậm chí giám sát liên tục đã được nhiều doanh nghiệp áp dụng trong nhiều năm qua.
Có ba lĩnh vực trọng tâm chính khi nói đến giám sát.
- Giám sát cơ sở hạ tầng
- Giám sát ứng dụng
- Giám sát mạng
Điều cần lưu ý là có rất nhiều công cụ có sẵn, chúng ta đã đề cập đến hai hệ thống và công cụ chung trong phần này nhưng còn rất nhiều công cụ khác. Lợi ích thực sự của một giải pháp giám sát thể hiện bạn dành thời gian để trả lời câu hỏi chúng ta nên giám sát những gì và không nên giám sát những gì?
Chúng ta có thể bật giải pháp giám sát trên bất kỳ nền tảng nào của chúng ta và nó sẽ bắt đầu lấy thông tin nhưng nếu thông tin đó quá nhiều thì bạn sẽ gặp khó khăn trong việc thấy các lợi ích từ giải pháp đó, bạn phải dành thời gian để định cấu hình nó.
Trong phần tiếp theo, chúng ta sẽ thực hành với một công cụ giám sát và xem chúng ta có thể bắt đầu giám sát những gì.
## Tài liệu tham khảo
- [The Importance of Monitoring in DevOps](https://www.devopsonline.co.uk/the-importance-of-monitoring-in-devops/)
- [Understanding Continuous Monitoring in DevOps?](https://medium.com/devopscurry/understanding-continuous-monitoring-in-devops-f6695b004e3b)
- [DevOps Monitoring Tools](https://www.youtube.com/watch?v=Zu53QQuYqJ0)
- [Top 5 - DevOps Monitoring Tools](https://www.youtube.com/watch?v=4t71iv_9t_4)
- [How Prometheus Monitoring works](https://www.youtube.com/watch?v=h4Sl21AKiDg)
- [Introduction to Prometheus monitoring](https://www.youtube.com/watch?v=5o37CGlNLr8)
Hẹn gặp lại vào [ngày 78](day78.md)

97
2022/vi/Days/day78.md Normal file
View File

@ -0,0 +1,97 @@
---
title: '#90DaysOfDevOps - Thực hành với công cụ giám sát - Ngày 78'
published: false
description: 90DaysOfDevOps - Thực hành với công cụ giám sát
tags: 'devops, 90daysofdevops, learning'
cover_image: null
canonical_url: null
id: 1049056
---
## Thực hành với công cụ giám sát
Hôm nay tôi sẽ nói về Prometheus, tôi đã thấy ngày càng nhiều hệ thống sử dụng Prometheus cho Cloud-Native nhưng nó cũng có thể được sử dụng để quản lý các tài nguyên vật lý cũng như Kubernetes và những thứ tương tự.
### Prometheus - Giám sát gần như mọi thứ
Trước hết, Prometheus là Mã nguồn mở có thể giúp bạn giám sát các containers và hệ thống micro-services cũng như các máy chủ vật lý, ảo hoá và các dịch vụ khác. Có một cộng đồng lớn đằng sau Prometheus.
Prometheus có rất nhiều [integrations and exporters](https://prometheus.io/docs/instrumenting/exporters/) Điều quan trọng là có thể export các metrics hiện có dưới dạng Prometheus metrics. Trên hết, nó còn hỗ trợ nhiều ngôn ngữ lập trình.
Phương thức pull - Nếu bạn đang nói chuyện với hàng nghìn micro-services hoặc hệ thống và dịch vụ thì các bạn sẽ thấy dịch vụ đẩy tới hệ thống giám sát bằng phương thức push. Điều này mang đến một số thách thức xung quanh việc làm quá tải hệ thống mạng, CPU cao và cũng xuất hiện single point of failure. Trong khi đó, phương thức pull mang đến cho chúng ta trải nghiệm tốt hơn nhiều, khi đó Prometheus sẽ lấy dữ liệu từ metrics endpoint trên các dịch vụ.
Một lần nữa chúng ta thấy YAML để cấu hình cho Prometheus.
![](Images/Day78_Monitoring7.png)
Sau này, bạn sẽ thấy điều này trông như thế nào khi được triển khai vào Kubernetes, cụ thể là chúng ta có **PushGateway** lấy metrics từ các jobs/và exporters.
Chúng ta có **AlertManager** giúp đưa ra cảnh báo và đây là nơi chúng ta có thể tích hợp vào các dịch vụ bên ngoài như email, Slack và các công cụ khác.
Sau đó, chúng ta có máy chủ Prometheus quản lý việc truy xuất các pull metrics đó từ PushGateway và gửi các push alerts đó đến AlertManager. Máy chủ Prometheus cũng lưu trữ dữ liệu trên đĩa cục bộ. Mặc dù có thể tận dụng các giải pháp lưu trữ từ xa.
Chúng ta cũng có PromQL, ngôn ngữ được sử dụng để tương tác với các metrics, bạn có thể thấy điều này trong Giao diện người dùng web của Prometheus nhưng ở phần sau trong bài viết này, bạn cũng sẽ thấy cách nó cũng được sử dụng trong các công cụ trực quan hóa dữ liệu như Grafana.
### Các cách triển khai Prometheus
Có nhiều cách cài đặt Prometheus khác nhau, [Trong phần tải xuống](https://prometheus.io/download/) cũng có sẵn docker image.
`docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus`
Nhưng chúng ta sẽ tập trung vào việc triển khai trên Kubernetes. Bản thân việc này cũng có một vài lựa chọn.
- Cấu hình bằng các tệp YAML
- Sử dụng Operator (quản lý tất cả các thành phần của Kubernetes)
- Sử dụng helm chart để triển khai operator
### Triển khai trên Kubernetes
Chúng ta sẽ sử dụng lại minikube cluster cục bộ của mình để cài đặt một cách nhanh chóng và đơn giản. Giống như các tương tác trước đây với minikube, chúng ta sẽ sử dụng heml để triển khai Prometheus heml chart.
`helm repo add prometheus-community https://prometheus-community.github.io/helm-charts`
![](Images/Day78_Monitoring1.png)
Như bạn có thể thấy ở trên, chúng ta cũng đã chạy helm repo update, hiện tại chúng ta đã có thể triển khai Prometheus vào môi trường minikube của mình bằng cách sử dụng lệnh `helm install stable prometheus-community/prometheus`.
![](Images/Day78_Monitoring2.png)
Sau vài phút, bạn sẽ thấy một số pods mới xuất hiện, trong demo này, tôi đã triển khai vào namespace mặc định, nhưng thông thường tôi sẽ triển khai trong namespace của nó.
![](Images/Day78_Monitoring3.png)
Sau khi tất cả các pods đã chạy, chúng ta cũng có thể xem xét tất cả các thành phần đã được triển khai của Prometheus.
![](Images/Day78_Monitoring4.png)
Bây giờ để truy cập vào Giao diện người của dùng máy chủ Prometheus, chúng ta có thể sử dụng lệnh sau để chuyển tiếp cổng.
```Shell
export POD_NAME=$(kubectl get pods --namespace default -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace default port-forward $POD_NAME 9090
```
Khi chúng ta lần đầu tiên mở trình duyệt của mình và truy cập `http://localhost:9090`, chúng ta thấy màn hình trống sau đây.
![](Images/Day78_Monitoring5.png)
Vì chúng ta đã triển khai trên Kubernetes cluster nên sẽ được tự động chọn các metrics từ Kubernetes API để sử dụng PromQL nhằm đảm bảo ít nhất thì chúng ta đang thu tập các metrics `container_cpu_usage_seconds_total`
![](Images/Day78_Monitoring6.png)
Nói ngắn gọn về việc học PromQL và áp dụng nó trong thực tế, điều này khá giống như tôi đã đề cập trước đây trong việc có được các metrics là rất tốt và việc giám sát cũng vậy, nhưng bạn phải biết bạn đang giám sát những gì và lý do cho việc đó, cũng như những gì bạn không theo dõi và lý do cho việc đó!
Tôi muốn nhắc lại về Prometheus nhưng bây giờ, tôi nghĩ chúng ta cần xem xét tới việc Quản lý log và Trực quan hóa dữ liệu để có thể quay lại Prometheus ở các phần sau.
## Tài liệu tham khảo
- [The Importance of Monitoring in DevOps](https://www.devopsonline.co.uk/the-importance-of-monitoring-in-devops/)
- [Understanding Continuous Monitoring in DevOps?](https://medium.com/devopscurry/understanding-continuous-monitoring-in-devops-f6695b004e3b)
- [DevOps Monitoring Tools](https://www.youtube.com/watch?v=Zu53QQuYqJ0)
- [Top 5 - DevOps Monitoring Tools](https://www.youtube.com/watch?v=4t71iv_9t_4)
- [How Prometheus Monitoring works](https://www.youtube.com/watch?v=h4Sl21AKiDg)
- [Introduction to Prometheus monitoring](https://www.youtube.com/watch?v=5o37CGlNLr8)
- [Promql cheat sheet with examples](https://www.containiq.com/post/promql-cheat-sheet-with-examples)
Hẹn gặp lại vào [ngày 79](day79.md)

View File

@ -119,35 +119,35 @@ Cách nhanh nhất để liên lạc với tôi là thông qua Twitter tại [@M
- [✔️] 📜 68 > [Tags, Variables, Inventory & Database Server config](Days/day68.md)
- [✔️] 📜 69 > [Tất cả những thứ còn lại của Ansible - Automation Controller, AWX, Vault](Days/day69.md)
### Tạo CI/CD Pipelines
### CI/CD pipelines
- [✔️] 🔄 70 > [The Big Picture: CI/CD Pipelines](Days/day70.md)
- [✔️] 🔄 71 > [What is Jenkins?](Days/day71.md)
- [✔️] 🔄 72 > [Getting hands on with Jenkins](Days/day72.md)
- [✔️] 🔄 73 > [Building a Jenkins pipeline](Days/day73.md)
- [✔️] 🔄 70 > [Bức tranh toàn cảnh: CI/CD Pipelines](Days/day70.md)
- [✔️] 🔄 71 > [Jenkins là gì?](Days/day71.md)
- [✔️] 🔄 72 > [Làm quen với Jenkins](Days/day72.md)
- [✔️] 🔄 73 > [Xây dựng Jenkins pipeline](Days/day73.md)
- [✔️] 🔄 74 > [Hello World - Jenkinsfile App Pipeline](Days/day74.md)
- [✔️] 🔄 75 > [GitHub Actions Overview](Days/day75.md)
- [✔️] 🔄 76 > [ArgoCD Overview](Days/day76.md)
- [✔️] 🔄 75 > [Tổng quan về GitHub Actions](Days/day75.md)
- [✔️] 🔄 76 > [Tổng quan về ArgoCD](Days/day76.md)
### Giám sát, quản lý logs và trực quan hóa dữ liệu
- [✔️] 📈 77 > [The Big Picture: Monitoring](Days/day77.md)
- [✔️] 📈 78 > [Hands-On Monitoring Tools](Days/day78.md)
- [✔️] 📈 79 > [The Big Picture: Log Management](Days/day79.md)
- [✔️] 📈 77 > [Bức tranh toàn cảnh: Giám sát](Days/day77.md)
- [✔️] 📈 78 > [Thực hành với công cụ giám sát](Days/day78.md)
- [✔️] 📈 79 > [Bức tranh toàn cảnh: Quản lý log](Days/day79.md)
- [✔️] 📈 80 > [ELK Stack](Days/day80.md)
- [✔️] 📈 81 > [Fluentd & FluentBit](Days/day81.md)
- [✔️] 📈 82 > [EFK Stack](Days/day82.md)
- [✔️] 📈 83 > [Data Visualisation - Grafana](Days/day83.md)
- [✔️] 📈 83 > [Trực quan hóa dữ liệu - Grafana](Days/day83.md)
### Lưu trữ & Bảo vệ Dữ liệu
- [✔️] 🗃️ 84 > [The Big Picture: Data Management](Days/day84.md)
- [✔️] 🗃️ 85 > [Data Services](Days/day85.md)
- [✔️] 🗃️ 86 > [Backup all the platforms](Days/day86.md)
- [✔️] 🗃️ 87 > [Hands-On Backup & Recovery](Days/day87.md)
- [✔️] 🗃️ 88 > [Application Focused Backups](Days/day88.md)
- [✔️] 🗃️ 89 > [Disaster Recovery](Days/day89.md)
- [✔️] 🗃️ 90 > [Data & Application Mobility](Days/day90.md)
- [✔️] 🗃️ 84 > [Bức tranh toàn cảnh: Data Management](Days/day84.md)
- [✔️] 🗃️ 85 > [Dịch vụ dữ liệu](Days/day85.md)
- [✔️] 🗃️ 86 > [Sao lưu tất cả các nền tảng](Days/day86.md)
- [✔️] 🗃️ 87 > [Thực hành với sao lưu & phục hồi](Days/day87.md)
- [✔️] 🗃️ 88 > [Sao lưu theo hướng tập trung vào ứng dụng](Days/day88.md)
- [✔️] 🗃️ 89 > [Khắc phục thảm họa (DR)](Days/day89.md)
- [✔️] 🗃️ 90 > [Dữ liệu & ứng dụng: Tính di động](Days/day90.md)
## License

View File

@ -33,7 +33,7 @@ Contributors
</a>
</td>
<td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0">
<a href=https://github.com/qmau94>
<a href=https://github.com/qmauvnt>
<img src=https://avatars.githubusercontent.com/u/10303945?v=4 width="100;" style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Mau Ha Quang/>
<br />
<sub style="font-size:14px"><b>Mau Ha Quang</b></sub>
@ -517,4 +517,4 @@ Contributors
</a>
</td>
</tr>
</table>
</table>