Merge pull request #421 from vntechies/main

vi added translation d56-63
This commit is contained in:
Michael Cade 2023-06-12 21:16:10 +01:00 committed by GitHub
commit 0e56ca0fed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 1185 additions and 11 deletions

139
2022/vi/Days/day56.md Normal file
View File

@ -0,0 +1,139 @@
---
title: '#90DaysOfDevOps - Bức tranh toàn cảnh: Cơ sở hạ tầng dưới dạng mã (IaC) - Ngày 56'
published: false
description: 90DaysOfDevOps - Bức tranh toàn cảnh: Cơ sở hạ tầng dưới dạng mã (IaC)
tags: 'devops, 90daysofdevops, learning'
cover_image: null
canonical_url: null
id: 1048709
---
## Bức tranh toàn cảnh: Cơ sở hạ tầng dưới dạng mã (IaC)
Con người phạm sai lầm và tự động hoá là đường đi đúng đắn!
Bạn đang làm thế nào để xây dựng hế thống của bạn?
Kế hoạch của bạn là gì nếu bạn mất tất cả mọi thứ hôm nay, các máy chủ vật lý, máy ảo, VMs trên điện toán đám mây, Cloud PaaS...?
Bạn sẽ mất bao lâu để thay đổi mọi thứ?
Cơ sở hạ tầng dưới dạng mã (Infrastructure as Code - IaC) cung cấp giải pháp để có thể thực hiện được việc này, đồng thời có thể kiểm thử chúng, chúng ta không nên nhầm lẫn điều này với sao lưu và phục hồi, xét về cơ sở hạ tầng và môi trường, các nền tảng của bạn sẽ được xử lý và đối xử như cách bạn nuôi thú cưng và gia xúc.
TLDR là chúng ta có thể sử dụng mã để xây dựng lại toàn bộ môi trường của mình.
Nếu chúng ta còn nhớ ngay từ đầu, chúng ta đã nói về DevOps nói chung là một cách phá vỡ các rào cản để triển khai các hệ thống đến production một cách nhanh chóng và an toàn.
Cơ sở hạ tầng dưới dạng mã (IaC) giúp chúng ta triển khai các hạ tầng hệ thống, chúng ta đã nói rất nhiều về quy trình và các công cụ. IaC mang đến cho chúng ta nhiều công cụ để có thể có thể quen thuộc với việc làm điều này trong quy trình triển khai hệ thống.
Chúng ta sẽ tập trung vào Cơ sở hạ tầng dưới dạng mã trong tuần này. Bạn cũng có thể nghe điều này được đề cập với các khái niệm như Cơ sở hạ tầng từ mã hoặc cấu hình dưới dạng mã. Tôi nghĩ thuật ngữ phổ biến nhất vẫn sẽ là "Cơ sở hạ tầng dưới dạng mã - IaC"
### Tính thân thiện
Nếu chúng ta xem xét về thời trước khi có DevOps, nếu chúng ta có yêu cầu xây dựng ứng dụng mới, chúng ta sẽ chuẩn bị phần lớn các máy chủ của mình theo cách thủ công, việc này cũng giống như bạn chăm sóc cho thú cưng của mình.
- Triển khai máy ảo | Trước khi có công nghệ ảo hóa thì sẽ là các máy chủ vật lý và cài đặt hệ điều hành
- Cài đặt, cấu hình mạng
- Cài đặt, cấu hình bảng định tuyến
- Cài đặt các phần mềm, thư viện cần thiết và cập nhật chúng
- Cấu hình phần mềm
- Cài đặt cơ sở dữ liệu
Trước đây, tất cả các tác vụ này đều được thực hiện thủ công bởi chuyên viên quản trị hệ thống SysAdmin. Đối với ứng dụng có quy mô lớn hơn, cần nhiều tài nguyên và máy chủ hơn, đương nhiên sẽ cần nhiều công sức hơn để cài đặt chúng. Do vậy chúng sẽ lấy đi rất nhiều công sức của nhân lực lao động (là chính chúng ta) cũng như thời gian, điều mà các doanh nghiệp sẽ phải chi trả trong toàn bộ quá trình xây dựng môi trường công nghệ thông tin ứng dụng này. Đặc biệt là ngay từ đầu nội dung bài viết tôi đã chia sẻ, việc gặp rủi ro từ cá nhân đều có thể xảy ra khiến chi phí để bù lấp sai lầm này có thể sẽ rất lơn, vì vậy tự động hóa sẽ là sự lựa chọn hàng đầu.
Quay trở lại nội dung chính, tiếp theo sau khi các bước cài đặt ban đầu hoàn thiện, chúng ta vẫn còn cần tiến hành bảo trì, quản lý và vận hành các hệ thống máy chủ nói trên, bao gồm:
- Cập nhật các phiên bản mới
- Triển khai các phiên bản mới này
- Quản lý dữ liệu
- Khôi phục ứng dụng nếu có sự cố
- Loại bỏ, thêm bớt và mở rộng các máy chủ, tài nguyên phần cứng trong trường hợp cần thiết
- Cấu hình mạng
Các bạn hãy tưởng tượng từng đó công việc sẽ được lặp đi lặp lại cho các môi trường phát triển như: dev, test, production ... độ phức tạp vì vậy cũng tăng lên.
Đây là lúc cơ sở hạ tầng dưới dạng mã xuất hiện, ở trên đã có nhiều việc chúng ta chăm sóc những máy chủ này như những thú cưng, mọi người thậm chí còn còn gọi các máy chủ của mình với tên gọi như thú cưng hoặc ít nhất là đặt tên cho chúng vì chúng sẽ ở đó một thời gian và họ hi vọng chúng sẽ trở thành một phần của "gia đình" trong một thời gian.
Với cơ sở hạ tầng dưới dạng mã IaC, chúng ta có thể tự động hoá tất các tác vụ này từ đầu đến cuối. Cơ sở hạ tầng dưới dạng mã là một khái niệm và có một số cung cụ thực hiện việc cung cấp cơ sở hạ tầng một cách tự động, và nếu có điều gì đó xảy ra với máy chủ, bạn sẽ vứt bỏ nó và khởi động lại một cái mới. Quá trình này được tự động hoá và máy chủ sẽ được tại chính xác như những gì được cấu hình trong mã. Tại thời điểm này, chúng ta không quan tâm chúng được gọi là gì, chúng ở đó phục vụ mục đích của chúng ta cho đến khi không còn ở đó nữa và chúng ta sẽ có cái khác để thay thế, có thể do bị lỗi hoặc vì chúng ta đã cập nhật một phần hoặc toàn bộ ứng dụng của mình.
IaC được sử dụng ở hầu hết mọi nền tảng, công nghệ ảo hóa, công nghệ điện toán đám mấy và công nghệ ứng dụng khai thác lợi ích của điện toán đám mây (Cloud Native) như Kubernetes hay containers.
## Khởi tạo cơ sở hạ tầng
Không phải các công cụ IaC sẽ bao gồm tất cả những điều bên dưới, bạn sẽ thấy rằng công cụ chúng ta tìm hiểu ở phần này chỉ thực sự bao gồm 2 lĩnh vực đầu tiên trong danh sách dưới đây. Terraform là công cụ mà chúng ta sẽ cho phép chúng ta bắt đầu từ số không, định nghĩa trong code xem cơ sở hạ tầng của chúng ta sẽ trông như thế nào và sau đó triển khai nó, nó cũng cho phép chúng ta quản lý cơ sở hạ tầng đó và ban đầu cũng có thể triển khai một ứng dụng nhưng sau đó, nó sẽ không quản lý ứng dụng nữa, đây là nơi mà phần tiếp theo sẽ xuất hiện và một công cụ quản lý cấu hình như Ansible sẽ đáp ứng được nhu cầu này một cách tốt hơn.
Các công cụ như `chef`, `puppet``ansible` ngay từ đầu là những công cụ vô cùng phù hợp để giải quyết yêu cầu khởi tạo, cài đặt ứng dụng và quản lý chúng.
Vậy các công việc khởi tạo, cài đặt cấu hình một phần mềm sẽ gồm những gì?
- Khởi tạo máy chủ mới
- Cấu hình mạng máy tính
- Cấu hình bộ cân bằng tải ứng dụng
- Cấu hình ở mức hạ tầng
### Cấu hình cơ sở hạ tầng
- Cài đặt các ứng dụng, phần mềm theo yêu cầu lên máy chủ (các phần mềm để chạy được ứng dụng ví dụ: python, go...)
- Chuẩn bị hàng loạt máy chủ để triển khai ứng dụng (lặp lại các bước trên trên rất nhiều máy chủ)
### Triển khai phần mềm
Sau khi hạ tầng máy chủ đã sẵn sàng chúng ta sẽ triển khai ứng dụng lên các máy chủ này, việc này bao gồm các bước sau:
- Triển khai, quản lý ứng dụng (bao gồm ứng dụng, thư viện hỗ trợ)
- Bảo trì
- Cập nhật phần mềm (cũng có thể là các thư viện phụ thuộc)
- Định lại cấu hình trong trường hợp cần thiết
### Sự khác nhau giữa các công cụ IaC
Khai báo và trình tự thực hiện (Declarative vs procedural)
Trình tự thực hiện
- Các bước trong IaC được làm tuần tự, theo từng bước
- Khởi tạo máy chủ, thêm máy chủ vào hệ thống và thay đổi cấu hình
Khai báo
- Khai báo kết quả mong muốn (VD: tạo 1 hoặc nhiều máy chủ cùng lúc)
- Ví dụ: Khởi tạo 2 máy chủ, hoặc 2 buckets
Tính bất biến (gia súc) và tính khả biến (thú cưng)
Khả biến
- Có thể thay đổi cấu hình thay vì ghi đè hoặc thay thế (ví dụ: thay đổi tên của máy chủ Windows, đổi tagging của s3 bucket)
- Vì có tính khả biến nên vòng đời sẽ lâu hơn.
Bất biến
- Khi muốn thay đổi chúng ta thay thế mới
- Vòng đời ngắn hơn.
Mỗi tài nguyên trong hệ thống đều có thể có một hoặc nhiều tính khả biến và bất biến.
Lấy ví dụ như sau:
- 01 AWS S3 bucket khi đã đặt tên (bucket name) sẽ bắt buộc là duy nhất và không thể thay đổi được tuy nhiên ta hoàn toàn có thể thay đổi nhãn (tag) của chúng mà không cần phải tạo mới bucket
- Ví dụ thứ 2, với một container image, chúng ta sẽ cần nó là bất biến, nghĩa là khi muốn cập nhật mã nguồn chúng ta bắt buộc phải tạo container image mới
Với các ví dụ trên, có rất nhiều lựa chọn cho IaC, tuy nhiên không có công cụ IaC nào có thể định nghĩa cũng như giải quyết được hết các tính chất này, thay vào đó chúng ta phải hiểu được tính chất của từng tài nguyên (resource, infra - hạ tầng)
Cũng trong series này, chúng ta sẽ bắt đầu thực hành với Terraform, công cụ được coi là thích hợp nhất ở thời điểm hiện tại để giúp chúng ta thấy được lợi ích mà IaC mang lại. Việc thực hành cũng là cách tốt nhất để nâng cao khả năng, kỹ năng lập trình.
Tiếp theo, bắt đầu với lý thuyết về Terraform ở mức độ cơ bản (101) sau đó chúng ta sẽ bắt đầu thực hành
## Tài liệu Tham khảo
Tôi đã liệt kê ra rất nhiều nội dung bên dưới đây để chúng ta có thể bắt đầu học và tham khảo, với các nội dung này phần nào có thể giúp chúng ta nhanh chóng nắm được khái niệm và các lý thuyết xung quanh IaC
- [What is Infrastructure as Code? Difference of Infrastructure as Code Tools](https://www.youtube.com/watch?v=POPP2WTJ8es)
- [Terraform Tutorial | Terraform Course Overview 2021](https://www.youtube.com/watch?v=m3cKkYXl-8o)
- [Terraform explained in 15 mins | Terraform Tutorial for Beginners](https://www.youtube.com/watch?v=l5k1ai_GBDE)
- [Terraform Course - From BEGINNER to PRO!](https://www.youtube.com/watch?v=7xngnjfIlK4&list=WL&index=141&t=16s)
- [HashiCorp Terraform Associate Certification Course](https://www.youtube.com/watch?v=V4waklkBC38&list=WL&index=55&t=111s)
- [Terraform Full Course for Beginners](https://www.youtube.com/watch?v=EJ3N-hhiWv0&list=WL&index=39&t=27s)
- [KodeKloud - Terraform for DevOps Beginners + Labs: Complete Step by Step Guide!](https://www.youtube.com/watch?v=YcJ9IeukJL8&list=WL&index=16&t=11s)
- [Terraform Simple Projects](https://terraform.joshuajebaraj.com/)
- [Terraform Tutorial - The Best Project Ideas](https://www.youtube.com/watch?v=oA-pPa0vfks)
- [Awesome Terraform](https://github.com/shuaibiyy/awesome-terraform)
Hẹn gặp lại các bạn ở ngày [ngày 57](day57.md)

96
2022/vi/Days/day57.md Normal file
View File

@ -0,0 +1,96 @@
---
title: '#90DaysOfDevOps - Giới thiệu về Terraform - Ngày 57'
published: false
description: 90DaysOfDevOps - Giới thiệu về Terraform
tags: 'devops, 90daysofdevops, learning'
cover_image: null
canonical_url: null
id: 1048710
---
## Giới thiệu về Terraform
"Terraform là một công cụ để xây dựng, thay đổi và quản lý phiên bản cơ sở hạ tầng một cách an toàn và hiệu quả"
Trích dẫn trên đến từ HashiCorp, công ty đứng đằng sau Terraform.
"Terraform là một công cụ phần mềm cơ sở hạ tầng dưới dạng mã mã nguồn mở cung cấp quy trình làm việc với CLI để quản lý hàng trăm dịch vụ điện toán đám mây. Terraform mã hoá các API của các nhà cung cấp thành các tệp cấu hình khai báo"
HashiCorp có nguồn tài nguyên tuyệt vời tại [HashiCorp Learn](https://learn.hashicorp.com/terraform?utm_source=terraform_io&utm_content=terraform_io_hero) bao gồm tất cả các sản phẩm của họ và cung cấp một số bản demo hướng dẫn rất tốt khi bạn đang cố gắng làm việc với Cơ sở hạ tầng dưới dạng mã.
Tất cả các nhà cung cấp điện toán đám mây và on-prem thường cung cấp cho chúng ta quyền truy cập vào bảng điều khiển quản lý cho phép chúng ta tạo các tài nguyên của mình thông qua giao diệu người dùng, các nền tảng này cũng cung cấp CLI hoặc truy cập API để tạo các tài nguyên đó nhưng với API, chúng ta có thể khởi tạo rất nhanh chóng.
Cơ sở hạ tầng dưới dạng mã cho phép chúng ta kết nối với các API đó để triển khai tài nguyên của mình ở trạng thái mong muốn.
Các công cụ khác cũng được liệt kê ở dưới đây, nếu có công cụ khác, xin các bạn hãy chia sẻ thông qua một PR
| Nhà cung cấp cụ thể | Không phụ thuộc vào nhà cung cấp |
| ------------------------------- | -------------- |
| AWS CloudFormation | Terraform |
| Azure Resource Manager | Pulumi |
| Google Cloud Deployment Manager | |
Đây là một lý do khác tại sao chúng ta đang sử dụng Terraform, chúng ta không muốn bị phụ thuộc vào một nhà cung cấp cụ thể hoặc nền tảng mà chúng ta muốn sử dụng cho các demos của mình cũng như trong thực tế.
## Tổng quan về Terraform
Terraform là một công cụ tập trung vào việc cung cấp hạ tầng, Terraform là một CLI có khả năng khởi tạo, cung cấp các môi trường cơ sở hạ tầng phức tạp. Với Terraform, chúng ta có thể xác định các yêu cầu cơ sở hạ tầng phức tạp tồn tại cục bộ hoặc từ xa (điện toán đám mây) Terraform không chỉ cho phép chúng ta xây dựng mọi thứ từ đầu mà còn duy trì và cập nhật các tài nguyên đó theo suốt vòng đời của chúng.
Chúng ta sẽ đề cập tới high level trong bài viết này, bạn có thể biết thêm chi tiết và tìm hiểu các tài nguyên khác tại trang[terraform.io](https://www.terraform.io/)
### Write
Terraform cho phép chúng ta tạo các tệp cấu hình khai báo để xây dựng môi trường của chúng ta. Các tệp được viết bằng ngôn ngữ cấu hình của HashiCorp (HCL - HashiCorp Configuration Language) cho phép mô tả ngắn gọn các tài nguyên bằng cách sử dụng các khối, đối số và biểu thức. Tất nhiên, chúng ta sẽ xem xét những điều này một cách chi tiết khi triển khai VM, COntainer và Kubernetes.
### Plan
Khả năng kiểm tra xem các tệp cấu hình trên có triển khai những gì chúng ta muốn thấy hay không bằng cách sử dụng các chức năng cụ thể của Terraform CLI trước khi triển khai hoặc thay đổi bất cứ thứ gì. Hãy nhớ rằng Terraform là một công cụ được sử dụng xuyên suốt cho cơ sở hạ tầng của bạn, nếu bạn muốn thay đổi các khía cạnh của cơ sở hạ tầng của mình, bạn nên thực hiện điều đó thông qua Terraform để tất cả mọi thứ được nắm bắt thông qua mã.
### Apply
Khi đã hài lòng, bạn có thể áp dụng cấu hình này cho nhiều providers có sẵn trong Terraform. Bạn có thể thấy danh sách các provider có sẵn tại [đây](https://registry.terraform.io/browse/providers)
Một điều khác cần đề cập là cũng có sẵn các modules, nó tương tự như container images ở chỗ các modules này đã được tạo và chia sẻ công khai, do đó bạn không phải tạo đi tạo lại chúng mà chỉ cần sử dụng lại cách tốt nhất để triển khai một tài nguyên cụ thể theo cùng một cách ở mọi nơi. Bạn có thể tìm thấy các module có sẵn [tại đây](https://registry.terraform.io/browse/modules)
Quy trình làm việc của Terraform trông như thể này: (_lấy từ website của terraform_)
![](../../Days/Images/Day57_IAC3.png)
### Terraform vs Vagrant
Trong thử thách này, chúng ta đã sử dụng Vagrant, một công cụ mã nguồn mở khác của Hashicorp tập trung vào các môi trường phát triển.
- Vagrant là một công cụ tập trung vào việc quản lý môi trường phát triển
- Terraform là một công cụ để xây dựng cơ sở hạ tầng.
Bạn có thể tìm thấy sự so sánh giữa hai công cụ tại đây trên [trang web chính thức của Hashicorp](https://www.vagrantup.com/intro/vs/terraform)
## Cài đặt Terraform
Không có nhiều thứ để nói cho việc cài đặt Terraform.
Terraform hỗ trợ đa nền tảng và bạn có thể thấy bên dưới trên máy tính Linux của tối, chúng ta có một số tuỳ chọn để tải xuống và cài đặt CLI
![](../../Days/Images/Day57_IAC2.png)
Sử dụng `arkade` để cài đặt Terraform, arkade là một công cụ nhỏ, tiện dụng để cài đặt các công cụ, ứng dụng và clis cần thiết vào hệ thống của bạn. Một câu lệnh `arkade get terraform` đơn giản sẽ cho phép cập nhật terraform nếu có hoặc cũng cài đặt Terraform CLI.
![](../../Days/Images/Day57_IAC1.png)
Chúng ta sẽ tìm hiểu thêm về HCL và sau đó bắt đầu sử dụng Terraform để tạo một số tài nguyên cơ sở hạ tầng trên các nền tảng khác nhau.
## Tài liệu tham khảo
- [What is Infrastructure as Code? Difference of Infrastructure as Code Tools](https://www.youtube.com/watch?v=POPP2WTJ8es)
- [Terraform Tutorial | Terraform Course Overview 2021](https://www.youtube.com/watch?v=m3cKkYXl-8o)
- [Terraform explained in 15 mins | Terraform Tutorial for Beginners](https://www.youtube.com/watch?v=l5k1ai_GBDE)
- [Terraform Course - From BEGINNER to PRO!](https://www.youtube.com/watch?v=7xngnjfIlK4&list=WL&index=141&t=16s)
- [HashiCorp Terraform Associate Certification Course](https://www.youtube.com/watch?v=V4waklkBC38&list=WL&index=55&t=111s)
- [Terraform Full Course for Beginners](https://www.youtube.com/watch?v=EJ3N-hhiWv0&list=WL&index=39&t=27s)
- [KodeKloud - Terraform for DevOps Beginners + Labs: Complete Step by Step Guide!](https://www.youtube.com/watch?v=YcJ9IeukJL8&list=WL&index=16&t=11s)
- [Terraform Simple Projects](https://terraform.joshuajebaraj.com/)
- [Terraform Tutorial - The Best Project Ideas](https://www.youtube.com/watch?v=oA-pPa0vfks)
- [Awesome Terraform](https://github.com/shuaibiyy/awesome-terraform)
Hẹn gặp lại vào [ngày 58](day58.md)

226
2022/vi/Days/day58.md Normal file
View File

@ -0,0 +1,226 @@
---
title: '#90DaysOfDevOps - Ngôn ngữ cấu hình HashiCorp (HCL) - ngày 58'
published: false
description: 90DaysOfDevOps - Ngôn ngữ cấu hình HashiCorp (HCL)
tags: 'devops, 90daysofdevops, learning'
cover_image: null
canonical_url: null
id: 1048741
---
## HashiCorp Configuration Language (HCL)
Trước khi chúng ta bắt đầu tạo các thành phần với Terraform, chúng ta cần tìm hiểu một chút về ngôn ngữ cấu hình của HashiCorp (HCL). Cho đến nay, trong thử thách 90 ngày DevOps, chúng ta đã tìm hiểu về một số ngôn ngữ script và lập trình khác nhau, ví dụ như ngôn ngữ lập trình Go, sau đó đến với các tập lệnh bash, thậm chí chúng ta cũng có đề cập đến Python khi làm việc với tự động hóa triển khai mạng máy tính.
Tiếp theo, chúng ta phải tìm hiểu về HashiCorp Configuration Language (HCL). Nếu đây là lần đầu tiên bạn gặp ngôn ngữ này, có thể nó sẽ có vẻ hơi đáng sợ, nhưng nó thực sự rất đơn giản và mạnh mẽ.
Ở phần tiếp theo, chúng ta sẽ sử dụng các ví dụ mà chúng ta có thể chạy trên hệ thống cục bộ, bất kể bạn đang sử dụng hệ điều hành nào. Chúng ta sẽ sử dụng VirtualBox, mặc dù đây không phải là nền tảng hạ tầng thông thường mà bạn thường sử dụng với Terraform. Tuy nhiên, đây là một công cụ miễn phí giúp chúng ta cài đặt và thực hành theo hướng dẫn của bài viết này. Chúng ta cũng có thể mở rộng khái niệm trong bài viết này để áp dụng cho Docker hoặc Kubernetes.
Nhìn chung, bạn nên sử dụng Terraform để triển khai hạ tầng của mình trên các hệ thống điện toán đám công cộng (AWS, Google, Microsoft Azure), cũng như trong môi trường ảo hóa như VMware, Microsoft Hyper-V, Nutanix AHV. Trên đám mây công cộng, Terraform cho phép chúng ta làm nhiều hơn chỉ triển khai tự động máy ảo. Chúng ta có thể tạo ra tất cả các hạ tầng cần thiết như khối công việc PaaS và tài nguyên mạng như VPC và Security Groups.
Có hai khía cạnh quan trọng trong Terraform, chúng ta có mã nguồn mà chúng ta sẽ thảo luận trong bài viết này và sau đó chúng ta còn có trạng thái (state). Cả hai điều này cùng nhau có thể được gọi là lõi của Terraform. Tiếp theo, chúng ta có môi trường mà chúng ta muốn tương tác và triển khai, điều này được thực hiện bằng cách sử dụng các provider của Terraform, đã được đề cập ngắn gọn trong buổi trước, nhưng chúng ta có provider AWS, provider Azure, v.v. Có hàng trăm provider khác nhau.
### Hướng dẫn sử dụng Terraform đơn giản
Hãy xem qua một tệp `.tf` trong Terraform để hiểu hơn về cấu trúc. Ví dụ đầu tiên chúng ta sẽ thảo luận sẽ là mã để triển khai tài nguyên lên AWS. Điều này cũng đòi hỏi bạn đã cài đặt AWS CLI trên hệ thống của bạn và đã cấu hình cho tài khoản của bạn.
### Provider
Ở đầu cấu trúc tệp `.tf`, thông thường được gọi là `main.tf`, ít nhất cho đến khi chúng ta làm các thứ phức tạp hơn, chúng ta sẽ định nghĩa các provider mà chúng ta đã đề cập trước đó. Nguồn của provider AWS như bạn có thể thấy là `hashicorp/aws`, điều này có nghĩa là provider này được duy trì hoặc đã được phát triển bởi chính HashiCorp và cộng đồng sử dụng. Mặc định, bạn sẽ tham chiếu đến các provider có sẵn từ Terraform Registry, bạn cũng có thể viết các provider riêng của bạn và sử dụng chúng cục bộ hoặc tự xuất bản lên Terraform Registry.
```
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.0"
}
}
}
```
Chúng ta cũng có thể thêm khu vực (region) vào đây để xác định khu vực AWS mà chúng ta muốn triển khai, chúng ta có thể làm điều này bằng cách thêm các dòng sau đây:
```
provider "aws" {
region = "ap-southeast-1" //region where resources need to be deployed
}
```
### Tài nguyên trong Terraform
- Một thành phần quan trọng khác của tệp cấu hình Terraform là khối tài nguyên (resource block), nó mô tả một hoặc nhiều đối tượng hạ tầng như EC2, Load Balancer, VPC, v.v.
- Một khối tài nguyên khai báo một tài nguyên thuộc một loại cụ thể (`"aws_instance"`) với một tên giúp truy xuất (`"90daysofdevops"`) cụ thể.
- Loại tài nguyên và tên cùng nhau tạo thành một định danh cho một tài nguyên cụ thể.
```
resource "aws_instance" "90daysofdevops" {
ami = data.aws_ami.instance_id.id
instance_type = "t2.micro"
availability_zone = "us-west-2a"
security_groups = [aws_security_group.allow_web.name]
user_data = <<-EOF
#! /bin/bash
sudo yum update
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
echo "
<h1>Deployed via Terraform</h1>
" | sudo tee /var/www/html/index.html
EOF
tags = {
Name = "Created by Terraform"
}
}
```
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.
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:
```hcl
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.27"
}
}
required_version = ">= 0.14.9"
}
provider "aws" {
profile = "default"
region = "us-west-2"
}
resource "aws_instance" "90daysofdevops" {
ami = "ami-830c94e3"
instance_type = "t2.micro"
availability_zone = "us-west-2a"
user_data = <<-EOF
#! /bin/bash
sudo yum update
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
echo "
<h1>Deployed via Terraform</h1>
" | sudo tee /var/www/html/index.html
EOF
tags = {
Name = "Created by Terraform"
tags = {
Name = "ExampleAppServerInstance"
}
}
```
Mã trên sẽ triển khai một máy chủ web đơn giản dưới dạng một instance EC2 trên AWS. Điều tuyệt vời về mã này và bất kỳ cấu hình nào tương tự là chúng ta có thể lặp lại quy trình này và nhận được kết quả giống nhau mỗi lần. Ngoại trừ khả năng tôi đã làm sai mã, không có sự tương tác của con người với mã trên.
Chúng ta hãy xem một ví dụ siêu đơn giản, một ví dụ mà bạn có thể chẳng bao giờ sử dụng nhưng hãy để chúng ta giả vờ nói về nó. Giống như các ngôn ngữ scripting và lập trình khác, chúng ta nên bắt đầu với một kịch bản hello-world.
```
terraform {
# This module is now only being tested with Terraform 0.13.x. However, to make upgrading easier, we are setting
# 0.12.26 as the minimum version, as that version added support for required_providers with source URLs, making it
# forwards compatible with 0.13.x code.
required_version = ">= 0.12.26"
}
# website::tag::1:: The simplest possible Terraform module: it just outputs "Hello, World!"
output "hello_world" {
value = "Hello, 90DaysOfDevOps from Terraform"
}
```
Bạn sẽ tìm thấy tệp này trong thư mục IAC (Infrastructure as Code) trong thư mục `hello-world`. Tuy nhiên, mặc định, tệp này sẽ không hoạt động ngay lập tức, chúng ta cần chạy một số lệnh để sử dụng mã Terraform của chúng ta.
Trong cửa sổ terminal, hãy điều hướng đến thư mục nơi tệp main.tf đã được tạo, đây có thể là thư mục từ kho lưu trữ này hoặc bạn có thể tạo một thư mục mới bằng mã ở trên.
Khi đã ở trong thư mục đó, chúng ta sẽ chạy lệnh `terraform init`.
Chúng ta cần thực hiện lệnh này trên bất kỳ thư mục nào chứa mã Terraform hoặc trước khi chúng ta chạy bất kỳ mã Terraform nào. Việc khởi tạo một thư mục cấu hình tải xuống và cài đặt các provider đã được định nghĩa trong cấu hình, trong trường hợp này, chúng ta không có provider, nhưng trong ví dụ ở trên, điều này sẽ tải xuống provider AWS cho cấu hình này.
![](../../Days/Images/Day58_IAC1.png)
Lệnh tiếp theo sẽ là terraform plan.
Lệnh terraform plan tạo ra một kế hoạch thực thi, cho phép bạn xem trước các thay đổi mà Terraform dự định thực hiện trên hạ tầng của bạn.
Dưới đây, bạn có thể thấy rằng với ví dụ hello-world của chúng ta, chúng ta sẽ thấy đầu ra nếu đây là một instance EC2 trên AWS, chúng ta sẽ thấy tất cả các bước mà chúng ta sẽ tạo ra.
![](../../Days/Images/Day58_IAC2.png)
Ở điểm này, chúng ta đã khởi tạo kho lưu trữ và đã tải xuống các provider khi cần thiết, chúng ta đã chạy một bước đi kiểm tra để đảm bảo rằng đây là những gì chúng ta muốn thấy, vì vậy bây giờ chúng ta có thể chạy và triển khai mã của chúng ta.
`terraform apply` cho phép chúng ta làm điều này, có một biện pháp an toàn tích hợp trong lệnh này và nó sẽ cung cấp một kế hoạch về những gì sẽ xảy ra, đòi hỏi bạn phản hồi bằng cách nói `"yes"` để tiếp tục.
![](../../Days/Images/Day58_IAC3.png)
Khi chúng ta gõ `"yes"` để xác nhận, mã của chúng ta sẽ được triển khai. Không có gì thú vị nhưng bạn có thể thấy chúng ta có kết quả đầu ra mà chúng ta đã định nghĩa trong mã của mình.
![](../../Days/Images/Day58_IAC4.png)
Hiện tại, chúng ta chưa triển khai bất cứ thứ gì, chúng ta chưa thêm, thay đổi hoặc phá hủy bất cứ thứ gì, nhưng nếu chúng ta đã làm điều đó, chúng ta sẽ thấy điều đó được chỉ ra trong đoạn trên. Tuy nhiên, nếu chúng ta đã triển khai một cái gì đó và muốn loại bỏ tất cả những gì chúng ta đã triển khai, chúng ta có thể sử dụng lệnh `terraform destroy`. Một lần nữa, điều này có tính năng an toàn, bạn phải gõ `"yes"` để xác nhận, mặc dù bạn có thể sử dụng `--auto-approve` ở cuối các lệnh `apply``destroy` để bỏ qua sự can thiệp thủ công đó. Tuy nhiên, tôi khuyên bạn chỉ nên sử dụng lối tắt này khi học và thử nghiệm vì mọi thứ có thể biến mất nhanh hơn cả việc xây dựng.
Từ đó, chúng ta đã tìm hiểu về 4 lệnh trong CLI của Terraform.
`terraform init` = chuẩn bị thư mục dự án với các provider.
`terraform plan` = hiển thị những gì sẽ được tạo ra và thay đổi trong lệnh tiếp theo dựa trên mã của chúng ta.
`terraform apply` = triển khai các tài nguyên được định nghĩa trong mã của chúng ta.
`terraform destroy` = phá hủy các tài nguyên chúng ta đã tạo ra trong dự án của chúng ta.
Chúng ta cũng đã tìm hiểu về hai khía cạnh quan trọng của tệp mã.
Provider = cách Terraform liên lạc với nền tảng cuối thông qua các API.
Tài nguyên (resources) = những gì chúng ta muốn triển khai bằng mã.
Một điều lưu ý khác khi chạy terraform init là xem cây thư mục trước và sau để xem điều gì xảy ra và chúng ta lưu trữ provider và các module ở đâu.
### Trạng Thái Của Terraform - Terraform state
Chúng ta cũng cần nhận thức về tệp trạng thái (state file) được tạo ra trong thư mục của chúng ta và đối với ví dụ `hello world` này, tệp trạng thái của chúng ta rất đơn giản. Đây là một tệp `JSON`, đại diện cho mọi thứ đã được tạo ra bởi Terraform. Tệp trạng thái sẽ hiển thị dữ liệu nhạy cảm của bạn, vì vậy hãy cẩn thận và làm thỏa thuận tốt nhất là đặt các tệp `.tfstate` vào thư mục `.gitignore` trước khi tải lên `GitHub`.
Mặc định, tệp trạng thái, như bạn có thể thấy, được lưu trữ trong cùng thư mục với mã dự án của bạn, nhưng nó cũng có thể được lưu trữ từ xa như một tùy chọn. Trong một môi trường sản xuất, điều này có thể sẽ là một vị trí chia sẻ như một bucket S3.
Một tùy chọn khác có thể là `Terraform Cloud`, đây là một dịch vụ quản lý có phí. (Miễn phí cho tối đa 5 người dùng)
Các lợi ích của việc lưu trữ trạng thái ở một vị trí từ xa là:
- Dữ liệu nhạy cảm được mã hóa
- Dành cho tổ chức, nhóm có số lượng dev, devops đông đảo
- Tự động hóa
- Tuy nhiên, điều này có thể làm tăng độ phức tạp
```JSON
{
"version": 4,
"terraform_version": "1.1.6",
"serial": 1,
"lineage": "a74296e7-670d-0cbb-a048-f332696ca850",
"outputs": {
"hello_world": {
"value": "Hello, 90DaysOfDevOps from Terraform",
"type": "string"
}
},
"resources": []
}
```
## Tài liệu tham khảo
Dưới đây là danh sách nhiều tài nguyên mà tôi đã liệt kê và tôi nghĩ rằng chủ đề này đã được đề cập nhiều lần. Nếu bạn có các tài nguyên bổ sung, hãy tạo một yêu cầu `pull request` với tài nguyên của bạn và tôi sẽ vui lòng xem xét và thêm chúng vào danh sách.
- [What is Infrastructure as Code? Difference of Infrastructure as Code Tools](https://www.youtube.com/watch?v=POPP2WTJ8es)
- [Terraform Tutorial | Terraform Course Overview 2021](https://www.youtube.com/watch?v=m3cKkYXl-8o)
- [Terraform explained in 15 mins | Terraform Tutorial for Beginners](https://www.youtube.com/watch?v=l5k1ai_GBDE)
- [Terraform Course - From BEGINNER to PRO!](https://www.youtube.com/watch?v=7xngnjfIlK4&list=WL&index=141&t=16s)
- [HashiCorp Terraform Associate Certification Course](https://www.youtube.com/watch?v=V4waklkBC38&list=WL&index=55&t=111s)
- [Terraform Full Course for Beginners](https://www.youtube.com/watch?v=EJ3N-hhiWv0&list=WL&index=39&t=27s)
- [KodeKloud - Terraform for DevOps Beginners + Labs: Complete Step by Step Guide!](https://www.youtube.com/watch?v=YcJ9IeukJL8&list=WL&index=16&t=11s)
- [Terraform Simple Projects](https://terraform.joshuajebaraj.com/)
- [Terraform Tutorial - The Best Project Ideas](https://www.youtube.com/watch?v=oA-pPa0vfks)
- [Awesome Terraform](https://github.com/shuaibiyy/awesome-terraform)
Hẹn gặp lại các bạn ở [ngày 59](day59.md)

130
2022/vi/Days/day59.md Normal file
View File

@ -0,0 +1,130 @@
---
title: '#90DaysOfDevOps - Tạo máy ảo với Terraform và biến - Ngày 59'
published: false
description: 90DaysOfDevOps - Tạo máy ảo với Terraform và biến
tags: 'devops, 90daysofdevops, learning'
cover_image: nugayll
canonical_url: null
id: 1049051
---
## Tạo máy ảo với Terraform và biến
Trong bài này, chúng ta sẽ tạo một hoặc hai máy ảo bằng cách sử dụng terraform trong VirtualBox. Điều này không phải là một trường hợp thông thường, VirtualBox là một lựa chọn ảo hóa máy trạm và điều này không phải là một trường hợp sử dụng cho Terraform, nhưng hiện tại tôi đang ở độ cao 36.000ft và dù tôi đã triển khai các tài nguyên trên public cloud, nhưng việc làm điều này trên máy tính xách tay của tôi nhanh hơn nhiều.
Chỉ cho mục đích demo, nhưng khái niệm là tương tự, chúng ta sẽ có mã cấu hình trạng thái mong muốn của chúng ta và sau đó chúng ta sẽ chạy mã đó với nhà cung cấp VirtualBox. Trong quá khứ, chúng ta đã sử dụng `vagrant` ở đây và tôi đã đề cập đến sự khác biệt giữa `vagrant``terraform` ở đầu phần này.
### Tạo máy ảo trong VirtualBox
Điều đầu tiên chúng ta sẽ làm là tạo một thư mục mới được gọi là VirtualBox, sau đó chúng ta có thể tạo một tệp tin VirtualBox.tf và đây sẽ là nơi chúng ta định nghĩa các tài nguyên của chúng ta. Đoạn mã dưới đây, có thể được tìm thấy trong thư mục VirtualBox với tên `VirtualBox.tf`, sẽ tạo 2 máy ảo trong VirtualBox.
Bạn có thể tìm hiểu thêm về nhà cung cấp VirtualBox của cộng đồng tại [đây](https://registry.terraform.io/providers/terra-farm/virtualbox/latest/docs/resources/vm)
```
terraform {
required_providers {
virtualbox = {
source = "terra-farm/virtualbox"
version = "0.2.2-alpha.1"
}
}
}
# There are currently no configuration options for the provider itself.
resource "virtualbox_vm" "node" {
count = 2
name = format("node-%02d", count.index + 1)
image = "https://app.vagrantup.com/ubuntu/boxes/bionic64/versions/20180903.0.0/providers/virtualbox.box"
cpus = 2
memory = "512 mib"
network_adapter {
type = "hostonly"
host_interface = "vboxnet1"
}
}
output "IPAddr" {
value = element(virtualbox_vm.node.*.network_adapter.0.ipv4_address, 1)
}
output "IPAddr_2" {
value = element(virtualbox_vm.node.*.network_adapter.0.ipv4_address, 2)
}
```
Bây giờ sau khi chúng ta đã định nghĩa mã của mình, chúng ta có thể thực hiện lệnh `terraform init` trên thư mục của chúng ta để tải xuống nhà cung cấp cho Virtualbox.
![](../../Days/Images/Day59_IAC1.png)
Bạn cũng cần phải cài đặt VirtualBox trên hệ thống của bạn. Sau đó, chúng ta có thể chạy lệnh `terraform plan` để xem mã của chúng ta sẽ tạo ra gì cho chúng ta. Tiếp theo là `terraform apply`. Hình ảnh dưới đây hiển thị quá trình hoàn thành của bạn.
![](../../Days/Images/Day59_IAC2.png)
Trong Virtualbox, bạn sẽ nhìn thấy 2 máy ảo mới được khởi tạo.
![](../../Days/Images/Day59_IAC3.png)
### Thay đổi cấu hình
Hãy thay đổi cấu hình triển khai để thử nghiệm. Chúng ta chỉ cần thay đổi dòng `count` để hiển thị số lượng nút mới mong muốn của chúng ta. Khi chúng ta chạy `terraform apply`, nó sẽ trông giống như dưới đây.
![](../../Days/Images/Day59_IAC4.png)
Một khi đã hoàn thành, trong VirtualBox bạn sẽ nhìn thấy 3 máy ảo được khởi tạo và chạy.
![](../../Days/Images/Day59_IAC5.png)
Khi mọi thứ đã hoàn thành, chúng ta có thể dọn dẹp bằng cách sử dụng `terraform destroy`, tất cả máy ảo sẽ được xóa bỏ sau đó.
![](../../Days/Images/Day59_IAC6.png)
### Biến và đầu ra
Trong buổi trước, chúng ta đã đề cập đến outputs khi chạy ví dụ `hello-world`. Nhưng chúng ta có thể đi vào chi tiết hơn ở đây.
Tuy nhiên, cũng có nhiều biến số khác mà chúng ta có thể sử dụng, cũng như một số cách khác nhau để định nghĩa biến số.
- Chúng ta có thể nhập biến số bằng tay với lệnh `terraform plan` hoặc `terraform apply`
- Chúng ta có thể định nghĩa chúng trong tệp `.tf` trong khối
- Chúng ta có thể sử dụng biến môi trường trong hệ thống của chúng ta bằng cách sử dụng định dạng `TF_VAR_NAME`.
- Sở thích của tôi là sử dụng tệp `terraform.tfvars` trong thư mục dự án của chúng ta.
- Có tùy chọn tệp `*auto.tfvars`
- Hoặc chúng ta có thể định nghĩa khi chạy lệnh `terraform plan` hoặc `terraform apply` với `-var` hoặc `-var-file`.
Bắt đầu từ dưới lên sẽ là thứ tự các biến số được định nghĩa.
Chúng ta cũng đã đề cập đến việc tệp trạng thái sẽ chứa thông tin nhạy cảm. Chúng ta có thể định nghĩa thông tin nhạy cảm như là một biến số và chúng ta có thể định nghĩa nó như là thông tin nhạy cảm.
```
variable "some resource" {
description = "something important"
type: string
sensitive = true
}
```
## Tài liệu tham khảo
Dưới đây là danh sách nhiều tài nguyên mà tôi đã liệt kê và tôi nghĩ rằng chủ đề này đã được đề cập nhiều lần. Nếu bạn có các tài nguyên bổ sung, hãy tạo một yêu cầu `pull request` với tài nguyên của bạn và tôi sẽ vui lòng xem xét và thêm chúng vào danh sách.
- [What is Infrastructure as Code? Difference of Infrastructure as Code Tools](https://www.youtube.com/watch?v=POPP2WTJ8es)
- [Terraform Tutorial | Terraform Course Overview 2021](https://www.youtube.com/watch?v=m3cKkYXl-8o)
- [Terraform explained in 15 mins | Terraform Tutorial for Beginners](https://www.youtube.com/watch?v=l5k1ai_GBDE)
- [Terraform Course - From BEGINNER to PRO!](https://www.youtube.com/watch?v=7xngnjfIlK4&list=WL&index=141&t=16s)
- [HashiCorp Terraform Associate Certification Course](https://www.youtube.com/watch?v=V4waklkBC38&list=WL&index=55&t=111s)
- [Terraform Full Course for Beginners](https://www.youtube.com/watch?v=EJ3N-hhiWv0&list=WL&index=39&t=27s)
- [KodeKloud - Terraform for DevOps Beginners + Labs: Complete Step by Step Guide!](https://www.youtube.com/watch?v=YcJ9IeukJL8&list=WL&index=16&t=11s)
- [Terraform Simple Projects](https://terraform.joshuajebaraj.com/)
- [Terraform Tutorial - The Best Project Ideas](https://www.youtube.com/watch?v=oA-pPa0vfks)
- [Awesome Terraform](https://github.com/shuaibiyy/awesome-terraform)
Hẹn gặp lại các bạn vào ngày tiếp theo [Ngày 60](day60.md)

193
2022/vi/Days/day60.md Normal file
View File

@ -0,0 +1,193 @@
---
title: '#90DaysOfDevOps - Docker Containers, Provisioners & Modules - Ngày 60'
published: false
description: '90DaysOfDevOps - Docker Containers, Provisioners & Modules'
tags: 'devops, 90daysofdevops, learning'
cover_image: null
canonical_url: null
id: 1049052
---
## Docker Containers, Provisioners & Modules
Trong [ngày 59](day59.md), chúng ta đã cung cấp một máy ảo bằng cách sử dụng Terraform đến môi trường VirtualBox FREE tại máy tính cá nhân. Trong phần này, chúng ta sẽ triển khai một Docker container với một số cấu hình đến môi trường Docker tại máy tính cá nhân của chúng ta.
### Docker Demo
Trước tiên, chúng ta sẽ sử dụng đoạn mã dưới đây, kết quả của đoạn mã này là chúng ta muốn triển khai một ứng dụng web đơn giản vào docker và công bố nó để nó có thể truy cập được từ mạng của chúng ta. Chúng ta sẽ sử dụng nginx và chúng ta sẽ làm cho nó có sẵn từ bên ngoài trên máy tính xách tay của chúng ta qua localhost và cổng 8000. Chúng ta đang sử dụng một nhà cung cấp docker từ cộng đồng và bạn cũng có thể thấy image docker chúng ta đang sử dụng cũng được nêu trong cấu hình của chúng ta.
```
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "2.16.0"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.latest
name = "tutorial"
ports {
internal = 80
external = 8000
}
}
```
Nhiệm vụ đầu tiên là sử dụng lệnh terraform init để tải xuống nhà cung cấp vào máy tính cục bộ của chúng ta.
![](../../Days/Images/Day60_IAC1.png)
Tiếp theo, chúng ta chạy lệnh `terraform apply`, sau đó là `docker ps`, và bạn sẽ thấy chúng ta có một container đang chạy.
![](../../Days/Images/Day60_IAC2.png)
Nếu chúng ta mở trình duyệt và điều hướng đến http://localhost:8000/, bạn sẽ thấy chúng ta có quyền truy cập vào container NGINX của chúng ta.
![](../../Days/Images/Day60_IAC3.png)
Các bạn có thể tìm hiểu thêm về Docker Provider tại đây [Docker Provider](https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs/resources/container)
Phía trên là một ví dụ rất đơn giản về những gì có thể làm được với Terraform và Docker và cách chúng ta có thể quản lý nó dưới trạng thái Terraform. Chúng ta đã bàn về docker-compose trong phần container và có một chút sự chồng chéo theo cách nào đó giữa việc này, cơ sở hạ tầng như mã và sau đó Kubernetes.
Để chứng minh điều này và cho thấy cách Terraform có thể xử lý một chút phức tạp hơn, chúng ta sẽ lấy tệp docker-compose cho WordPress và MySQL mà chúng ta đã tạo bằng docker-compose và đặt nó vào Terraform. Bạn có thể tìm thấy tệp [docker-wordpress.tf](2022/Days/IaC/Docker-WordPress/docker-WordPress.tf)
```
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "2.16.0"
}
}
}
provider "docker" {}
variable wordpress_port {
default = "8080"
}
resource "docker_volume" "db_data" {
name = "db_data"
}
resource "docker_network" "wordpress_net" {
name = "wordpress_net"
}
resource "docker_container" "db" {
name = "db"
image = "mysql:5.7"
restart = "always"
network_mode = "wordpress_net"
env = [
"MYSQL_ROOT_PASSWORD=wordpress",
"MYSQL_PASSWORD=wordpress",
"MYSQL_USER=wordpress",
"MYSQL_DATABASE=wordpress"
]
mounts {
type = "volume"
target = "/var/lib/mysql"
source = "db_data"
}
}
resource "docker_container" "wordpress" {
name = "wordpress"
image = "wordpress:latest"
restart = "always"
network_mode = "wordpress_net"
env = [
"WORDPRESS_DB_HOST=db:3306",
"WORDPRESS_DB_USER=wordpress",
"WORDPRESS_DB_NAME=wordpress",
"WORDPRESS_DB_PASSWORD=wordpress"
]
ports {
internal = "80"
external = "${var.wordpress_port}"
}
}
```
Chúng ta lại tệp vào một thư mục mới và sau đó chạy lệnh `terraform init` để tải về các công cụ cần thiết.
![](../../Days/Images/Day60_IAC4.png)
Sau đó, chúng ta chạy lệnh `terraform apply` và kiểm tra đầu ra của lệnh `docker ps`, chúng ta sẽ thấy các container mới được tạo ra.
![](../../Days/Images/Day60_IAC5.png)
Sau đó, chúng ta có thể truy cập vào giao diện WordPress. Tương tự như khi chúng ta đã thực hiện quá trình này với docker-compose trong phần container, bây giờ chúng ta có thể tiếp tục thiết lập và các bài viết WordPress của chúng ta sẽ được lưu trong cơ sở dữ liệu MySQL.
![](../../Days/Images/Day60_IAC6.png)
Bây giờ chúng ta đã thảo luận khá chi tiết về containers và Kubernetes, chúng ta có thể hiểu rằng việc sử dụng containers một mình chỉ phù hợp cho việc kiểm thử, và nếu bạn đang chạy ứng dụng, bạn sẽ không chỉ sử dụng containers mà còn xem xét sử dụng Kubernetes để đạt được điều này. Tiếp theo, chúng ta sẽ tìm hiểu cách sử dụng Terraform với Kubernetes.
### Provisioners
Provisioners được sử dụng để xử lý những công việc không thể được miêu tả theo cách khai báo, giúp chúng ta triển khai các tác vụ đó.
Nếu không có cách thức khác và việc thêm phức tạp vào mã của bạn là điểm đến cuối cùng, bạn có thể thực hiện điều này bằng cách chạy một đoạn mã tương tự như khối mã sau đây.
```
resource "docker_container" "db" {
# ...
provisioner "local-exec" {
command = "echo The server's IP address is ${self.private_ip}"
}
}
```
Provisioner remote-exec được sử dụng để gọi một script trên tài nguyên từ xa sau khi nó được tạo ra. Điều này có thể được sử dụng cho một số công việc đặc thù của hệ điều hành hoặc có thể được sử dụng để kết hợp với một công cụ quản lý cấu hình. Tuy nhiên, hãy lưu ý rằng một số công việc này đã được bao gồm trong các provisioner tương ứng của chúng.
[Thông tin chi tiết về provisioners](https://www.terraform.io/language/resources/provisioners/syntax)
- file
- local-exec
- remote-exec
- vendor
- ansible
- chef
- puppet
### Modules
Modules là các container chứa nhiều tài nguyên được sử dụng cùng nhau. Một module bao gồm một tập hợp các file `.tf` trong cùng một thư mục.
Modules là một cách tốt để tách biệt các tài nguyên cơ sở hạ tầng của bạn và cũng cho phép bạn sử dụng các module của bên thứ ba đã được tạo trước để không phải phát minh lại bánh xe.
Ví dụ, nếu chúng ta muốn sử dụng cùng một dự án để xây dựng các máy ảo (VMs), mạng riêng ảo (VPCs), nhóm bảo mật (Security Groups) và một cụm Kubernetes, chúng ta có thể muốn chia tách các tài nguyên của chúng thành các module để xác định rõ hơn các tài nguyên và nhóm chúng lại.
Một lợi ích khác của modules là bạn có thể sử dụng chúng cho các dự án khác hoặc chia sẻ chúng công khai để giúp cộng đồng.
Chúng ta đang chia cơ sở hạ tầng thành các thành phần, và các thành phần này được gọi là modules ở đây.
## Tài liệu tham khảo
Dưới đây là danh sách nhiều tài nguyên mà tôi đã liệt kê và tôi nghĩ rằng chủ đề này đã được đề cập nhiều lần. Nếu bạn có các tài nguyên bổ sung, hãy tạo một yêu cầu `pull request` với tài nguyên của bạn và tôi sẽ vui lòng xem xét và thêm chúng vào danh sách.
- [What is Infrastructure as Code? Difference of Infrastructure as Code Tools](https://www.youtube.com/watch?v=POPP2WTJ8es)
- [Terraform Tutorial | Terraform Course Overview 2021](https://www.youtube.com/watch?v=m3cKkYXl-8o)
- [Terraform explained in 15 mins | Terraform Tutorial for Beginners](https://www.youtube.com/watch?v=l5k1ai_GBDE)
- [Terraform Course - From BEGINNER to PRO!](https://www.youtube.com/watch?v=7xngnjfIlK4&list=WL&index=141&t=16s)
- [HashiCorp Terraform Associate Certification Course](https://www.youtube.com/watch?v=V4waklkBC38&list=WL&index=55&t=111s)
- [Terraform Full Course for Beginners](https://www.youtube.com/watch?v=EJ3N-hhiWv0&list=WL&index=39&t=27s)
- [KodeKloud - Terraform for DevOps Beginners + Labs: Complete Step by Step Guide!](https://www.youtube.com/watch?v=YcJ9IeukJL8&list=WL&index=16&t=11s)
- [Terraform Simple Projects](https://terraform.joshuajebaraj.com/)
- [Terraform Tutorial - The Best Project Ideas](https://www.youtube.com/watch?v=oA-pPa0vfks)
- [Awesome Terraform](https://github.com/shuaibiyy/awesome-terraform)
Hẹn gặp lại các bạn vào [Ngày 61](day61.md)

171
2022/vi/Days/day61.md Normal file
View File

@ -0,0 +1,171 @@
---
title: '#90DaysOfDevOps - Kubernetes & Đa môi trường - Ngày 61'
published: false
description: 90DaysOfDevOps - Kubernetes & Đa môi trường
tags: 'devops, 90daysofdevops, learning'
cover_image: null
canonical_url: null
id: 1048743
---
## Kubernetes & Đa môi trường
Cho đến nay, trong phần về Cơ sở hạ tầng mã nguồn, chúng ta đã xem xét triển khai máy ảo, mặc dù chúng ta đã sử dụng VirtualBox, nhưng nguyên tắc là giống nhau, chúng ta xác định bằng mã nguồn những gì chúng ta muốn máy ảo của mình trông như thế nào và sau đó triển khai. Tương tự cho các container Docker và trong buổi học này, chúng ta sẽ xem cách Terraform có thể được sử dụng để tương tác với các tài nguyên được hỗ trợ bởi Kubernetes.
Tôi đã sử dụng Terraform để triển khai các cụm Kubernetes cho mục đích trình diễn trên ba nhà cung cấp đám mây chính và bạn có thể tìm thấy kho lưu trữ tại đây [tf_k8deploy](https://github.com/MichaelCade/tf_k8deploy)
Tuy nhiên, bạn cũng có thể sử dụng Terraform để tương tác với các đối tượng bên trong cụm Kubernetes, điều này có thể được thực hiện bằng cách sử dụng [Kubernetes provider](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs) hoặc [Helm provider](https://registry.terraform.io/providers/hashicorp/helm/latest) để quản lý việc triển kahi trong kubernetes
Bây giờ chúng ta có thể sử dụng `kubectl` như đã được hiển thị trong các phần trước. Tuy nhiên, việc sử dụng Terraform trong môi trường Kubernetes có một số lợi ích.
- Quy trình làm việc thống nhất - nếu bạn đã sử dụng Terraform để triển khai các cụm của mình, bạn có thể sử dụng cùng quy trình làm việc và công cụ để triển khai trong các cụm Kubernetes của bạn.
- Quản lý vòng đời - Terraform không chỉ là một công cụ cung cấp, nó còn cho phép thay đổi, cập nhật và xóa bỏ.
### Ví dụ Kubernetes đơn giản
Tương tự như demo chúng ta đã tạo trong buổi học trước, bây giờ chúng ta có thể triển khai nginx vào cụm Kubernetes của chúng ta. Trong mục này, tôi sẽ sử dụng minikube để làm ví dụ. Chúng ta tạo file Kubernetes.tf và bạn có thể tìm thấy nó tại [đây](2022/Days/IaC/Kubernetes/Kubernetes.tf)
Trong tệp đó, chúng ta sẽ xác định nhà cung cấp Kubernetes, chúng ta sẽ trỏ đến tệp kubeconfig của chúng ta, tạo một namespace có tên là nginx, và sau đó chúng ta sẽ tạo một deployment chứa 2 bản sao và cuối cùng là service.
```
terraform {
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = ">= 2.0.0"
}
}
}
provider "kubernetes" {
config_path = "~/.kube/config"
}
resource "kubernetes_namespace" "test" {
metadata {
name = "nginx"
}
}
resource "kubernetes_deployment" "test" {
metadata {
name = "nginx"
namespace = kubernetes_namespace.test.metadata.0.name
}
spec {
replicas = 2
selector {
match_labels = {
app = "MyTestApp"
}
}
template {
metadata {
labels = {
app = "MyTestApp"
}
}
spec {
container {
image = "nginx"
name = "nginx-container"
port {
container_port = 80
}
}
}
}
}
}
resource "kubernetes_service" "test" {
metadata {
name = "nginx"
namespace = kubernetes_namespace.test.metadata.0.name
}
spec {
selector = {
app = kubernetes_deployment.test.spec.0.template.0.metadata.0.labels.app
}
type = "NodePort"
port {
node_port = 30201
port = 80
target_port = 80
}
}
}
```
Điều đầu tiên chúng ta phải làm trong thư mục dự án mới của chúng ta là chạy lệnh terraform init.
![](../../Days/Images/Day61_IAC1.png)
Và trước khi chúng ta chạy lệnh terraform apply, để tôi cho bạn thấy rằng chúng ta không có bất kỳ `namespace` nào.
![](../../Days/Images/Day61_IAC2.png)
Khi chúng ta chạy lệnh terraform apply, điều này sẽ tạo ra 3 tài nguyên mới đó là namespace, deployment và service trong cụm Kubernetes của chúng ta.
![](../../Days/Images/Day61_IAC3.png)
Bây giờ chúng ta có thể xem các tài nguyên đã triển khai trong cụm của chúng ta.
![](../../Days/Images/Day61_IAC4.png)
Bây giờ, vì chúng ta đang sử dụng minikube như bạn đã thấy trong phần trước, điều này có một số hạn chế khi chúng ta thử nghiệm với mạng docker cho ingress. Nhưng nếu chúng ta chỉ đơn giản sử dụng lệnh `kubectl port-forward -n nginx svc/nginx 30201:80` và mở trình duyệt đến `http://localhost:30201/`, chúng ta sẽ thấy trang NGINX của chúng ta.
![](../../Days/Images/Day61_IAC5.png)
Nếu bạn muốn thử các bài thực hành chi tiết hơn với Terraform và Kubernetes, thì trang web [HashiCorp Learn site](https://learn.hashicorp.com/tutorials/terraform/kubernetes-provider) là một nguồn tuyệt vời để thực hiện.
### Đa môi trường
Nếu chúng ta muốn lấy bất kỳ bài thực hành nào đã được thực hiện nhưng bây giờ muốn có môi trường sản xuất, staging và phát triển cụ thể trông giống nhau và tận dụng mã nguồn này, có hai phương pháp để làm được điều này với Terraform:
- `terraform workspaces`- nhiều phần được đặt tên trong một backend duy nhất
- cấu trúc file - Cấu trúc thư mục cung cấp phân tách, các module cung cấp tái sử dụng.
Tuy nhiên, mỗi phương pháp trên đều có ưu điểm và nhược điểm riêng.
### Terraform workspaces
Ưu điểm
- Dễ bắt đầu: Sử dụng Terraform workspaces giúp bắt đầu một cách dễ dàng, vì bạn có thể tạo các workspace riêng biệt một cách đơn giản và nhanh chóng.
- Tiện lợi khi có `terraform.workspace`
- Giảm thiểu sự trùng lặp code
Nhược điểm
- Dễ mắc lỗi do con người
- Lưu trạng thái trong cùng backend
- Mã nguồn không hiển thị rõ ràng các cấu hình triển khai
### File Structure
Ưu điểm
- Cô lập, tách riêng backend state
- Cải thiện an ninh bảo mật
- Giảm thiểu lỗi cá nhân
- Mã nguồn (code) thể hiện chính xác so với trạng thái triển khai
Nhược điểm
- Phải chạy nhiều lần `terraform apply` để triển khai cho nhiều môi trường
- Gia tăng sự trùng lặp,. nhưng có thể giảm thiểu khi sử dụng module
## Tài liệu tham khảo
- [What is Infrastructure as Code? Difference of Infrastructure as Code Tools](https://www.youtube.com/watch?v=POPP2WTJ8es)
- [Terraform Tutorial | Terraform Course Overview 2021](https://www.youtube.com/watch?v=m3cKkYXl-8o)
- [Terraform explained in 15 mins | Terraform Tutorial for Beginners](https://www.youtube.com/watch?v=l5k1ai_GBDE)
- [Terraform Course - From BEGINNER to PRO!](https://www.youtube.com/watch?v=7xngnjfIlK4&list=WL&index=141&t=16s)
- [HashiCorp Terraform Associate Certification Course](https://www.youtube.com/watch?v=V4waklkBC38&list=WL&index=55&t=111s)
- [Terraform Full Course for Beginners](https://www.youtube.com/watch?v=EJ3N-hhiWv0&list=WL&index=39&t=27s)
- [KodeKloud - Terraform for DevOps Beginners + Labs: Complete Step by Step Guide!](https://www.youtube.com/watch?v=YcJ9IeukJL8&list=WL&index=16&t=11s)
- [Terraform Simple Projects](https://terraform.joshuajebaraj.com/)
- [Terraform Tutorial - The Best Project Ideas](https://www.youtube.com/watch?v=oA-pPa0vfks)
- [Awesome Terraform](https://github.com/shuaibiyy/awesome-terraform)
Hẹn gặp lại các bạn vào [Ngày 62](day62.md)

110
2022/vi/Days/day62.md Normal file
View File

@ -0,0 +1,110 @@
---
title: '#90DaysOfDevOps - Testing, Tools & Alternatives - Day 62'
published: false
description: '90DaysOfDevOps - Testing, Tools & Alternatives'
tags: 'devops, 90daysofdevops, learning'
cover_image: null
canonical_url: null
id: 1049053
---
## Kiểm thử, Công cụ và Các phương pháp thay thế
Khi kết thúc phần này về Cơ sở hạ tầng dưới dạng Mã, chúng ta phải đề cập đến việc kiểm thử mã nguồn, các công cụ khác nhau có sẵn và sau đó là một số phương pháp thay thế Terraform để đạt được điều này. Như tôi đã nói ở đầu phần này, tập trung của tôi là Terraform vì nó trước tiên là miễn phí và mã nguồn mở, thứ hai, nó là đa nền tảng và không phụ thuộc vào môi trường. Nhưng cũng có các phương pháp thay thế khác mà cần được xem xét, nhưng mục tiêu chung là làm cho mọi người nhận thức rằng đây là cách triển khai cơ sở hạ tầng của bạn.
### Mã lỗi
Phần đầu tiên mà tôi muốn đề cập trong phiên này là mã lỗi. Khác với mã ứng dụng, cơ sở hạ tầng dưới dạng mã có thể được sử dụng và sau đó không được sử dụng trong một thời gian rất dài. Hãy lấy ví dụ rằng chúng ta sẽ sử dụng Terraform để triển khai môi trường máy ảo trên AWS, hoàn hảo và nó hoạt động lần đầu tiên và chúng ta có môi trường của chúng ta. Nhưng môi trường này không thay đổi quá thường xuyên, vì vậy mã bị bỏ lại trong trạng thái hiện tại, có thể hoặc hy vọng được lưu trữ ở một vị trí trung tâm, nhưng mã không thay đổi.
Điều gì sẽ xảy ra nếu có thay đổi trong cơ sở hạ tầng? Nhưng nó được thực hiện bên ngoài quy trình chính hoặc các yếu tố khác thay đổi trong môi trường của chúng ta.
Các thay đổi bên ngoài quy trình chính
Phiên bản không được gắn kết
Các phụ thuộc đã bị loại bỏ
Các thay đổi chưa được áp dụng
### Kiểm thử
Một lĩnh vực quan trọng khác liên quan đến mã lỗi và nói chung là khả năng kiểm thử IaC và đảm bảo rằng tất cả các phần đều hoạt động theo đúng yêu cầu.
Đầu tiên, chúng ta có thể xem xét một số lệnh kiểm thử tích hợp sẵn:
| Command | Description |
| -------------------- | ------------------------------------------------------------------------------------------ |
| `terraform fmt` | Định dạng lại tệp terraform (.tf), giúp cho việc đọc code dễ dàng hơn |
| `terraform validate` | Xác thực, phát hiện lỗi cú pháp các tệp cấu hình trong một thư mục |
| `terraform plan` | Tạo một kế hoạch thực thi, cho phép xem trước các thay đổi mà Terraform dự định thực hiện. |
| Custom validation | Xác thực lại các biến đầu vào, bảo đảm khớp với những gì mà chúng ta yêu cầu |
Ngoài ra chúng ta cũng có một số công cụ kiểm thử khác không thuộc hệ sinh thái của Hashicorp nhưng hỗ trợ terraform:
- [tflint](https://github.com/terraform-linters/tflint)
- ìm các lỗi có thể xảy ra.
- ảnh báo về cú pháp đã bị loại bỏ và các khai báo không được sử dụng.
- áp dụng các quy ước tốt nhất và quy ước đặt tên.
Công cụ dò quét
- [checkov](https://www.checkov.io/) - dò quét toàn bộ hệ thống hạ tầng, phát hiện và cảnh báo các lỗi cấu hình.
- [tfsec](https://aquasecurity.github.io/tfsec/v1.4.2/) - Phân tích tính bảo mật của hạ tầng dựa vào code.
- [terrascan](https://github.com/accurics/terrascan) - Phân tích hạ tầng.
- [terraform-compliance](https://terraform-compliance.com/) - một framework kiểm thử nhẹ, tập trung vào bảo mật và tuân thủ quy định để kiểm tra terraform, giúp bạn có khả năng kiểm thử phản tác dụng cho cơ sở hạ tầng dưới dạng mã.
- [snyk](https://docs.snyk.io/products/snyk-infrastructure-as-code/scan-terraform-files/scan-and-fix-security-issues-in-terraform-files) -dò quét code phát hiện và cảnh báo các lỗi cấu hình về bảo mật.
Managed Cloud offering
- [Terraform Sentinel](https://www.terraform.io/cloud-docs/sentinel) - embedded policy-as-code framework integrated with the HashiCorp Enterprise products. It enables fine-grained, logic-based policy decisions, and can be extended to use information from external sources.
Công cụ tương tự như unit test cho terraform
- [Terratest](https://terratest.gruntwork.io/) - Terratest là một thư viện Go cung cấp mẫu và hàm kiểm thử cơ sở hạ tầng.
Một số công cụ khác nổi bật - tự động hóa
- [Terraform Cloud](https://cloud.hashicorp.com/products/terraform) - Terraform Cloud là dịch vụ quản lý của HashiCorp. Nó loại bỏ sự cần thiết của các công cụ và tài liệu không cần thiết cho các nhà thực hành, nhóm và tổ chức sử dụng Terraform trong môi trường sản xuất.
- [Terragrunt](https://terragrunt.gruntwork.io/) - Terragrunt is a là lớp bọc bên ngoài, cung cấp tính năng giữ cấu hình và triển khai, tránh việc lặp lại code, làm việc với nhiều module khác nhau.
- [Atlantis](https://www.runatlantis.io/) - Tự động hóa triển khai dựa trên gitops
### Các lựa chọn thay thế
Như đã đề cập ở ngày 57, dưới đây là các công cụ thay thế cho terraform
| Cloud Specific | Cloud Agnostic |
| ------------------------------- | -------------- |
| AWS CloudFormation | Terraform |
| Azure Resource Manager | Pulumi |
| Google Cloud Deployment Manager | |
Tôi đã sử dụng AWS CloudFormation nhiều nhất trong danh sách trên, đặc biệt là trong môi trường AWS, nhưng tôi chưa sử dụng các công cụ khác ngoại trừ Terraform. Như bạn có thể tưởng tượng, các phiên bản dành riêng cho một nhà cung cấp điện toán đám mây cụ thể rất tốt trong đám mây đó, nhưng nếu bạn có nhiều môi trường đám mây khác nhau, bạn sẽ gặp khó khăn trong việc di chuyển các cấu hình đó hoặc bạn sẽ phải sử dụng nhiều mặt phẳng quản lý khác nhau cho các nỗ lực IaC của mình.
Tôi nghĩ bước tiếp theo thú vị đối với tôi là dành thời gian để tìm hiểu thêm về [Pulumi](https://www.pulumi.com/)
Theo so sánh Pulumi trên trang web của họ:
"Cả Terraform và Pulumi đều cung cấp mô hình mã hóa cơ sở hạ tầng dựa trên trạng thái mong muốn, trong đó mã đại diện cho trạng thái hạ tầng mong muốn và bộ triển khai so sánh trạng thái mong muốn này với trạng thái hiện tại của stack và xác định những tài nguyên cần tạo, cập nhật hoặc xóa."
Sự khác biệt lớn nhất mà tôi nhìn thấy là, so với ngôn ngữ cấu hình HashiCorp (HCL), Pulumi cho phép sử dụng ngôn ngữ thông dụng như Python, TypeScript, JavaScript, Go và .NET.
Tôi đã xem qua một video giới thiệu Giới thiệu về Pulumi [Introduction to Pulumi: Modern Infrastructure as Code](https://www.youtube.com/watch?v=QfJTJs24-JM): Cơ sở hạ tầng như mã hiện đại và tôi thích sự dễ dàng và sự lựa chọn mà nó mang lại. Tôi muốn tìm hiểu thêm về Pulumi.
Điều này kết thúc phần về Cơ sở hạ tầng như mã (Infrastructure as Code), tiếp theo chúng ta sẽ di chuyển đến một phần chồng chéo nhỏ với quản lý cấu hình cụ thể, đặc biệt là khi chúng ta vượt qua cái nhìn tổng quan về quản lý cấu hình lớn, chúng ta sẽ sử dụng Ansible cho một số tác vụ và bài thực hành.
## Tài liệu tham khảo
- [What is Infrastructure as Code? Difference of Infrastructure as Code Tools](https://www.youtube.com/watch?v=POPP2WTJ8es)
- [Terraform Tutorial | Terraform Course Overview 2021](https://www.youtube.com/watch?v=m3cKkYXl-8o)
- [Terraform explained in 15 mins | Terraform Tutorial for Beginners](https://www.youtube.com/watch?v=l5k1ai_GBDE)
- [Terraform Course - From BEGINNER to PRO!](https://www.youtube.com/watch?v=7xngnjfIlK4&list=WL&index=141&t=16s)
- [HashiCorp Terraform Associate Certification Course](https://www.youtube.com/watch?v=V4waklkBC38&list=WL&index=55&t=111s)
- [Terraform Full Course for Beginners](https://www.youtube.com/watch?v=EJ3N-hhiWv0&list=WL&index=39&t=27s)
- [KodeKloud - Terraform for DevOps Beginners + Labs: Complete Step by Step Guide!](https://www.youtube.com/watch?v=YcJ9IeukJL8&list=WL&index=16&t=11s)
- [Terraform Simple Projects](https://terraform.joshuajebaraj.com/)
- [Terraform Tutorial - The Best Project Ideas](https://www.youtube.com/watch?v=oA-pPa0vfks)
- [Awesome Terraform](https://github.com/shuaibiyy/awesome-terraform)
- [Pulumi - IaC in your favorite programming language!](https://www.youtube.com/watch?v=vIjeiDcsR3Q&t=51s)
Hẹn gặp lại các bạn ở [Ngày 63](day63.md)

109
2022/vi/Days/day63.md Normal file
View File

@ -0,0 +1,109 @@
---
title: '#90DaysOfDevOps - Bức tranh toàn cảnh: Quản lý cấu hình - Ngày 63'
published: false
description: 90DaysOfDevOps - The Big Picture Configuration Management
tags: 'devops, 90daysofdevops, learning'
cover_image: null
canonical_url: null
id: 1048711
---
## Bức tranh toàn cảnh: Quản lý cấu hình
Ngay sau phần nói về Cơ sở hạ tầng dưới dạng mã, có nhiều khả năng sẽ có một số điểm giao khi chúng ta nói về Quản lý cấu hình hoặc Quản lý cấu hình ứng dụng.
Quản lý cấu hình là quá trình duy trì các ứng dụng, hệ thống và máy chủ ở trạng thái mong muốn. Sự trùng lặp với Cơ sở hạ tầng dưới dạng mã là IaC sẽ đảm bảo cơ sở hạ tầng của bạn ở trạng thái mong muốn nhưng sau đó, đặc biệt là terraform sẽ không quản lý trạng thái mong muốn của cài đặt hệ điều hành hoặc ứng dụng của bạn, đó là nơi các công cụ quản lý cấu hình xuất hiện đảm bảo rằng hệ thống và ứng dụng hoạt động theo cách được mong đợi khi có thay đổi.
Quản lý cấu hình giúp bạn không thực hiện các thay đổi nhỏ hoặc lớn mà không có sự quản lý bằng tài liệu.
### Tình huống: Tại sao bạn muốn sử dụng Quản lý cấu hình
Kịch bản hoặc lý do bạn muốn sử dụng Quản lý cấu hình, hãy gặp quản trị viên hệ thống của chúng ta, người làm việc trên tất cả các hệ thống - anh ấy tên là Dũng.
Điều gì sẽ xảy ra nếu hệ thống của họ gặp sự cố, nếu có hỏa hoạn, một máy chủ hoạt động không tốt? Dũng biết chính xác phải làm gì anh ấy có thể khắc phục sự cố đó một cách dễ dàng. Tuy nhiên, các vấn đề sẽ trở nên khó khăn với Dũng nếu nhiều máy chủ bắt đầu gặp sự cố, đặc biệt khi bạn có môi trường lớn và ngày càng mở rộng. Đây là lý do tại sao Dũng cần phải có một công cụ quản lý cấu hình. Các công cụ Quản lý Cấu hình có thể giúp Dũng trông giống như một ngôi sao nhạc rock, tất cả những gì anh ấy phải làm là định cấu hình đúng mã cho phép anh ấy đưa ra hướng dẫn về cách thiết lập từng mã các máy chủ một cách hiệu quả và ở quy mô lớn.
### Công cụ quản lý cấu hình
Có sẵn nhiều công cụ quản lý cấu hình và mỗi công cụ đều có các tính năng cụ thể giúp công cụ này hoạt động tốt hơn trong một số tình huống so với các công cụ khác.
![](../../Days/Images/Day63_config1.png)
Ở giai đoạn này, chúng ta sẽ xem nhanh các tùy chọn trong hình trên trước khi đưa ra lựa chọn chúng ta sẽ sử dụng tùy chọn nào.
- **Chef**
- Chef đảm bảo cấu hình được áp dụng nhất quán trong mọi môi trường, ở mọi quy mô lớn với cơ sở hạ tầng tự động hóa.
- Chef là một công cụ mã nguồn mở được phát triển bởi OpsCode được viết bằng Ruby và Erlang.
- Chef phù hợp nhất cho các tổ chức có cơ sở hạ tầng không đồng nhất và đang tìm kiếm các giải pháp hoàn thiện.
- Recipes và Cookbooks xác định mã cấu hình cho hệ thống của bạn.
- Pro - Có sẵn một bộ sưu tập lớn các recipes
- Pro - Tích hợp tốt với Git, cung cấp khả năng kiểm soát phiên bản mạnh mẽ
- Con - Phải học rất nhiều và cần một lượng thời gian đáng kể để làm quen.
- Con - Máy chủ chính không có nhiều quyền kiểm soát.
- Kiến trúc - Server/Client
- Dễ dàng thiết lập - Trung bình
- Language - Procedural - Chỉ định cách thực hiện tác vụ
- **Puppet**
- Puppet là công cụ quản lý cấu hình hỗ trợ triển khai tự động.
- Puppet được xây dựng bằng Ruby và sử dụng DSL để viết bảng kê khai.
- Puppet cũng hoạt động tốt với cơ sở hạ tầng không đồng nhất, nơi tập trung vào khả năng mở rộng.
- Pro - Cộng đồng hỗ trợ lớn.
- Pro - Cơ chế báo cáo được viết rất tốt.
- Con - Các nhiệm vụ nâng cao yêu cầu kiến thức về ngôn ngữ Ruby.
- Con - Máy chủ chính không có nhiều quyền kiểm soát.
- Kiến trúc - Server/Client
- Dễ thiết lập - Trung bình
- Language - Declarative - Chỉ định những việc cần làm
- **Ansible**
- Ansible là một công cụ tự động hóa CNTT giúp tự động hóa việc quản lý cấu hình, triển khai trên đám mây, triển khai và điều phối.
- Cốt lõi của Ansible playbooks được viết bằng YAML (Nên làm một phần về YAML như chúng ta đã thấy điều này một vài lần)
- Ansible hoạt động tốt khi các môi trường tập trung vào việc khởi động và chạy mọi thứ một cách nhanh chóng.
- Hoạt động trên playbook cung cấp hướng dẫn cho máy chủ của bạn.
- Pro - Không agents trên trên các node từ xa.
- Pro - YAML rất dễ học.
- Con - Tốc độ thực hiện thường kém hơn các công cụ khác (Nhanh hơn Dũng tự làm thủ công)
- Con - YAML không mạnh bằng Ruby nhưng học nó dễ dàng hơn Ruby.
- Kiến trúc - client only
- Dễ thiết lập - Rất dễ
- Language - Procedural - Chỉ định cách thực hiện tác vụ
- **SaltStack**
- SaltStack là một công cụ dựa trên CLI giúp tự động hóa việc quản lý cấu hình và thực thi từ xa.
- SaltStack dựa trên Python trong khi các hướng dẫn được viết bằng YAML hoặc DSL của nó.
- Hoàn hảo cho các môi trường ưu tiên khả năng mở rộng và khả năng phục hồi.
- Pro - Dễ sử dụng khi thiết lập và chạy
- Pro - Cơ chế báo cáo tốt
- Con - Giai đoạn thiết lập khó khăn
- Con - Giao diện người dùng web mới kém phát triển hơn nhiều so với các giao diện người dùng khác.
- Kiến trúc - Server/Client
- Dễ thiết lập - Trung bình
- Language - Declarative - Chỉ định những việc cần làm
### Ansible vs Terraform
Công cụ mà chúng ta sẽ sử dụng cho phần này sẽ là Ansible (Dễ sử dụng và yêu cầu cơ bản về ngôn ngữ dễ dàng hơn).
Tôi nghĩ rằng điều quan trọng là phải đề cập đến một số khác biệt giữa Ansible và Terraform trước khi chúng ta tìm hiểu sâu hơn về công cụ này.
| | Ansible | Terraform |
| -------------- | ------------------------------------------------------------ | ---------------------------------------------------------------- |
| Loại | Ansible là công cụ quản lý cấu hình | Terraform là công cụ điều phối |
| Cơ sở hạ tầng | Ansible cung cấp hỗ trợ cho cơ sở hạ tầng có thể thay đổi (mutable) | Terraform cung cấp hỗ trợ cho cơ sở hạ tầng không thể thay đổi (immutable) |
| Ngôn ngữ | Ansible tuân theo ngôn ngữ thủ tục | Terraform tuân theo ngôn ngữ khai báo |
| Cung cấp | Ansible cung cấp cung cấp một phần (VM, Mạng, Lưu trữ) | Terraform cung cấp cung cấp rộng rãi (VM, Mạng, Lưu trữ) |
| Đóng gói | Ansible cung cấp hỗ trợ đầy đủ cho việc đóng gói & tạo template | Terraform cung cấp hỗ trợ một phần cho đóng gói & tạo template |
| Quản lý vòng đời | Ansible không có quản lý vòng đời | Terraform phụ thuộc nhiều vào vòng đời và quản lý trạng thái |
## Tài liệu tham khảo
- [What is Ansible](https://www.youtube.com/watch?v=1id6ERvfozo)
- [Ansible 101 - Episode 1 - Introduction to Ansible](https://www.youtube.com/watch?v=goclfp6a2IQ)
- [NetworkChuck - You need to learn Ansible right now!](https://www.youtube.com/watch?v=5hycyr-8EKs&t=955s)
Hẹn gặp lại vào [ngày 64](day64.md)

View File

@ -101,23 +101,23 @@ Cách nhanh nhất để liên lạc với tôi là thông qua Twitter tại [@M
### Học cơ sở hạ tầng dưới dạng mã (Infrastructure as Code)
- [✔️] 🤖 56 > [The Big Picture: IaC](Days/day56.md)
- [✔️] 🤖 57 > [An intro to Terraform](Days/day57.md)
- [✔️] 🤖 58 > [HashiCorp Configuration Language (HCL)](Days/day58.md)
- [✔️] 🤖 59 > [Create a VM with Terraform & Variables](Days/day59.md)
- [✔️] 🤖 60 > [Docker Containers, Provisioners & Modules](Days/day60.md)
- [✔️] 🤖 61 > [Kubernetes & Multiple Environments](Days/day61.md)
- [✔️] 🤖 56 > [Bức tranh toàn cảnh: Cơ sở hạ tầng dưới dạng mã (IaC)](Days/day56.md)
- [✔️] 🤖 57 > [Giới thiệu về Terraform](Days/day57.md)
- [✔️] 🤖 58 > [Ngôn ngữ cấu hình HashiCorp (HCL)](Days/day58.md)
- [✔️] 🤖 59 > [Tạo VM với Terraform & Biến](Days/day59.md)
- [✔️] 🤖 60 > [Docker Container, Providers & Modules](Days/day60.md)
- [✔️] 🤖 61 > [Kubernetes & Đa môi trường](Days/day61.md)
- [✔️] 🤖 62 > [Testing, Tools & Alternatives](Days/day62.md)
### Tự động hóa quản lý cấu hình
- [✔️] 📜 63 > [The Big Picture: Configuration Management](Days/day63.md)
- [✔️] 📜 64 > [Ansible: Getting Started](Days/day64.md)
- [✔️] 📜 63 > [Bức tranh toàn cảnh: Quản lý cấu hình](Days/day63.md)
- [✔️] 📜 64 > [Ansible: Bắt đầu](Days/day64.md)
- [✔️] 📜 65 > [Ansible Playbooks](Days/day65.md)
- [✔️] 📜 66 > [Ansible Playbooks Continued...](Days/day66.md)
- [✔️] 📜 67 > [Using Roles & Deploying a Loadbalancer](Days/day67.md)
- [✔️] 📜 66 > [Tiếp tục với Ansible Playbooks...](Days/day66.md)
- [✔️] 📜 67 > [Sử dụng Role & Triển khai Loadbalancer](Days/day67.md)
- [✔️] 📜 68 > [Tags, Variables, Inventory & Database Server config](Days/day68.md)
- [✔️] 📜 69 > [All other things Ansible - Automation Controller, AWX, Vault](Days/day69.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