Skip to content

Commit 9c6357c

Browse files
hungranqmauvnt
andcommitted
Translate to Vietnamese (VN): Day 59-62
Co-Authored-By: Mau Ha Quang <mau@qmau.me>
1 parent 4facd58 commit 9c6357c

4 files changed

Lines changed: 567 additions & 0 deletions

File tree

2022/vi/Days/day59.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
## Tạo máy ảo với Terraform và biến
2+
3+
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.
4+
5+
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.
6+
7+
### Tạo máy ảo trong VirtualBox
8+
9+
Đ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.
10+
11+
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)
12+
13+
```
14+
terraform {
15+
required_providers {
16+
virtualbox = {
17+
source = "terra-farm/virtualbox"
18+
version = "0.2.2-alpha.1"
19+
}
20+
}
21+
}
22+
23+
# There are currently no configuration options for the provider itself.
24+
25+
resource "virtualbox_vm" "node" {
26+
count = 2
27+
name = format("node-%02d", count.index + 1)
28+
image = "https://app.vagrantup.com/ubuntu/boxes/bionic64/versions/20180903.0.0/providers/virtualbox.box"
29+
cpus = 2
30+
memory = "512 mib"
31+
32+
network_adapter {
33+
type = "hostonly"
34+
host_interface = "vboxnet1"
35+
}
36+
}
37+
38+
output "IPAddr" {
39+
value = element(virtualbox_vm.node.*.network_adapter.0.ipv4_address, 1)
40+
}
41+
42+
output "IPAddr_2" {
43+
value = element(virtualbox_vm.node.*.network_adapter.0.ipv4_address, 2)
44+
}
45+
46+
```
47+
48+
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.
49+
50+
![](Images/Day59_IAC1.png)
51+
52+
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.
53+
54+
![](Images/Day59_IAC2.png)
55+
56+
Trong Virtualbox, bạn sẽ nhìn thấy 2 máy ảo mới được khởi tạo.
57+
58+
![](Images/Day59_IAC3.png)
59+
60+
### Thay đổi cấu hình
61+
62+
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.
63+
64+
![](Images/Day59_IAC4.png)
65+
66+
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.
67+
68+
![](Images/Day59_IAC5.png)
69+
70+
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 đó.
71+
72+
![](Images/Day59_IAC6.png)
73+
74+
### Biến và đầu ra
75+
76+
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.
77+
78+
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ố.
79+
80+
- Chúng ta có thể nhập biến số bằng tay với lệnh `terraform plan` hoặc `terraform apply`
81+
82+
- Chúng ta có thể định nghĩa chúng trong tệp `.tf` trong khối
83+
84+
- 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`.
85+
86+
- 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.
87+
88+
- Có tùy chọn tệp `*auto.tfvars`
89+
90+
- 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`.
91+
92+
Bắt đầu từ dưới lên sẽ là thứ tự các biến số được định nghĩa.
93+
94+
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.
95+
96+
```
97+
variable "some resource" {
98+
description = "something important"
99+
type: string
100+
sensitive = true
101+
102+
}
103+
```
104+
105+
## Tài liệu tham khảo
106+
107+
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.
108+
109+
- [What is Infrastructure as Code? Difference of Infrastructure as Code Tools](https://www.youtube.com/watch?v=POPP2WTJ8es)
110+
- [Terraform Tutorial | Terraform Course Overview 2021](https://www.youtube.com/watch?v=m3cKkYXl-8o)
111+
- [Terraform explained in 15 mins | Terraform Tutorial for Beginners](https://www.youtube.com/watch?v=l5k1ai_GBDE)
112+
- [Terraform Course - From BEGINNER to PRO!](https://www.youtube.com/watch?v=7xngnjfIlK4&list=WL&index=141&t=16s)
113+
- [HashiCorp Terraform Associate Certification Course](https://www.youtube.com/watch?v=V4waklkBC38&list=WL&index=55&t=111s)
114+
- [Terraform Full Course for Beginners](https://www.youtube.com/watch?v=EJ3N-hhiWv0&list=WL&index=39&t=27s)
115+
- [KodeKloud - Terraform for DevOps Beginners + Labs: Complete Step by Step Guide!](https://www.youtube.com/watch?v=YcJ9IeukJL8&list=WL&index=16&t=11s)
116+
- [Terraform Simple Projects](https://terraform.joshuajebaraj.com/)
117+
- [Terraform Tutorial - The Best Project Ideas](https://www.youtube.com/watch?v=oA-pPa0vfks)
118+
- [Awesome Terraform](https://github.com/shuaibiyy/awesome-terraform)
119+
120+
Hẹn gặp lại các bạn vào ngày tiếp theo [Ngày 60](day60.md)

2022/vi/Days/day60.md

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
## Docker Containers, Provisioners & Modules
2+
3+
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.
4+
5+
### Docker Demo
6+
7+
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.
8+
9+
```
10+
terraform {
11+
required_providers {
12+
docker = {
13+
source = "kreuzwerker/docker"
14+
version = "2.16.0"
15+
}
16+
}
17+
}
18+
19+
provider "docker" {}
20+
21+
resource "docker_image" "nginx" {
22+
name = "nginx:latest"
23+
keep_locally = false
24+
}
25+
26+
resource "docker_container" "nginx" {
27+
image = docker_image.nginx.latest
28+
name = "tutorial"
29+
ports {
30+
internal = 80
31+
external = 8000
32+
}
33+
}
34+
```
35+
36+
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.
37+
38+
![](Images/Day60_IAC1.png)
39+
40+
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.
41+
42+
![](Images/Day60_IAC2.png)
43+
44+
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.
45+
46+
![](Images/Day60_IAC3.png)
47+
48+
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)
49+
50+
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.
51+
52+
Để 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)
53+
54+
```
55+
terraform {
56+
required_providers {
57+
docker = {
58+
source = "kreuzwerker/docker"
59+
version = "2.16.0"
60+
}
61+
}
62+
}
63+
64+
provider "docker" {}
65+
66+
variable wordpress_port {
67+
default = "8080"
68+
}
69+
70+
resource "docker_volume" "db_data" {
71+
name = "db_data"
72+
}
73+
74+
resource "docker_network" "wordpress_net" {
75+
name = "wordpress_net"
76+
}
77+
78+
resource "docker_container" "db" {
79+
name = "db"
80+
image = "mysql:5.7"
81+
restart = "always"
82+
network_mode = "wordpress_net"
83+
env = [
84+
"MYSQL_ROOT_PASSWORD=wordpress",
85+
"MYSQL_PASSWORD=wordpress",
86+
"MYSQL_USER=wordpress",
87+
"MYSQL_DATABASE=wordpress"
88+
]
89+
mounts {
90+
type = "volume"
91+
target = "/var/lib/mysql"
92+
source = "db_data"
93+
}
94+
}
95+
96+
resource "docker_container" "wordpress" {
97+
name = "wordpress"
98+
image = "wordpress:latest"
99+
restart = "always"
100+
network_mode = "wordpress_net"
101+
env = [
102+
"WORDPRESS_DB_HOST=db:3306",
103+
"WORDPRESS_DB_USER=wordpress",
104+
"WORDPRESS_DB_NAME=wordpress",
105+
"WORDPRESS_DB_PASSWORD=wordpress"
106+
]
107+
ports {
108+
internal = "80"
109+
external = "${var.wordpress_port}"
110+
}
111+
}
112+
```
113+
114+
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.
115+
116+
![](Images/Day60_IAC4.png)
117+
118+
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.
119+
120+
![](Images/Day60_IAC5.png)
121+
122+
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.
123+
124+
![](Images/Day60_IAC6.png)
125+
126+
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.
127+
128+
### Provisioners
129+
130+
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ụ đó.
131+
132+
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.
133+
134+
```
135+
resource "docker_container" "db" {
136+
# ...
137+
138+
provisioner "local-exec" {
139+
command = "echo The server's IP address is ${self.private_ip}"
140+
}
141+
}
142+
143+
```
144+
145+
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.
146+
147+
[Thông tin chi tiết về provisioners](https://www.terraform.io/language/resources/provisioners/syntax)
148+
149+
- file
150+
- local-exec
151+
- remote-exec
152+
- vendor
153+
- ansible
154+
- chef
155+
- puppet
156+
157+
### Modules
158+
159+
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.
160+
161+
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.
162+
163+
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.
164+
165+
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.
166+
167+
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.
168+
169+
## Tài liệu tham khảo
170+
171+
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.
172+
173+
- [What is Infrastructure as Code? Difference of Infrastructure as Code Tools](https://www.youtube.com/watch?v=POPP2WTJ8es)
174+
- [Terraform Tutorial | Terraform Course Overview 2021](https://www.youtube.com/watch?v=m3cKkYXl-8o)
175+
- [Terraform explained in 15 mins | Terraform Tutorial for Beginners](https://www.youtube.com/watch?v=l5k1ai_GBDE)
176+
- [Terraform Course - From BEGINNER to PRO!](https://www.youtube.com/watch?v=7xngnjfIlK4&list=WL&index=141&t=16s)
177+
- [HashiCorp Terraform Associate Certification Course](https://www.youtube.com/watch?v=V4waklkBC38&list=WL&index=55&t=111s)
178+
- [Terraform Full Course for Beginners](https://www.youtube.com/watch?v=EJ3N-hhiWv0&list=WL&index=39&t=27s)
179+
- [KodeKloud - Terraform for DevOps Beginners + Labs: Complete Step by Step Guide!](https://www.youtube.com/watch?v=YcJ9IeukJL8&list=WL&index=16&t=11s)
180+
- [Terraform Simple Projects](https://terraform.joshuajebaraj.com/)
181+
- [Terraform Tutorial - The Best Project Ideas](https://www.youtube.com/watch?v=oA-pPa0vfks)
182+
- [Awesome Terraform](https://github.com/shuaibiyy/awesome-terraform)
183+
184+
Hẹn gặp lại các bạn vào [Ngày 61](day61.md)

0 commit comments

Comments
 (0)