Để loại bỏ các vấn đề liên quan đến cấu hình thủ công, nhiều công ty công nghệ đã chuyển sang các công cụ Cơ sở hạ tầng dưới dạng Mã (IaC) để quản lý mạng của họ. Các công cụ này sử dụng các tập lệnh hoặc tệp cấu hình để tự động hóa việc cung cấp và triển khai mạng. Thị trường IaC rất đông đúc, với nhiều sản phẩm cạnh tranh. Hai trong số các công cụ IaC phổ biến nhất là Terraform của HashiCorp và Ansible của Red Hat . Hướng dẫn này so sánh Ansible và Terraform, với lời giải thích về cách thức hoạt động của từng sản phẩm và mục đích sử dụng của chúng.

Những điều cơ bản của cơ sở hạ tầng dưới dạng mã

Infrastructure as Code là phương pháp quản lý cơ sở hạ tầng thông qua tự động hóa. IaC tăng tốc triển khai Cloud và giảm chi phí vận hành. Nó giúp tránh các lỗi có khả năng gây tốn kém và thực thi tính nhất quán và chuẩn hóa trên toàn Cloud. Infrastructure as Code là cốt lõi của khái niệm DevOps, là liên minh của các nhóm phát triển và vận hành. Các nhóm này làm việc cùng nhau để lập kế hoạch cấu trúc, bố cục và cấu hình của mạng. Giới thiệu về Infrastructure as Code của Linode cung cấp tổng quan toàn diện hơn về chủ đề này.

Một bước quan trọng trong quá trình lập kế hoạch này là quyết định sử dụng công cụ IaC nào. Mặc dù các sản phẩm khác nhau có sự chồng chéo đáng kể, nhưng mỗi sản phẩm đều có những điểm mạnh khác nhau. Một số dễ sử dụng hơn những sản phẩm khác. Một số hướng đến các phương pháp lập trình khác nhau. Một số được tối ưu hóa cho quản lý cấu hình trong khi những sản phẩm khác tốt hơn cho việc điều phối dịch vụ.

Cả Ansible và Terraform đều là các công cụ để triển khai Cơ sở hạ tầng dưới dạng Mã, mặc dù chúng tập trung vào các thành phần khác nhau. Ansible hướng đến quản lý cấu hình trong khi thế mạnh của Terraform nằm ở dịch vụ và phối hợp đám mây. Có sự chồng chéo đáng kể giữa hai ứng dụng cũng như sự khác biệt và nhiều nhóm DevOps có thể sử dụng một trong hai. Cũng có thể có những tình huống mà hai công cụ này được sử dụng tốt nhất cùng nhau. Để hỗ trợ bạn đưa ra quyết định, hướng dẫn này trước tiên giới thiệu Terraform và Ansible, sau đó so sánh và đối chiếu chúng trên một số tiêu chí. Sau đó, hướng dẫn cung cấp bản tóm tắt và cung cấp khuôn khổ để đưa ra quyết định.

Giới thiệu về Terraform

Terraform là một công cụ IaC nguồn mở rất dễ sử dụng. Mục đích chính của nó là xây dựng và mở rộng các dịch vụ Đám mây và quản lý trạng thái của mạng. Terraform không chuyên về cấu hình phần mềm và không cài đặt và quản lý phần mềm trên các thiết bị hiện có. Thay vào đó, nó hướng đến việc tạo, sửa đổi và hủy các máy chủ và các tài nguyên Đám mây khác. Điều này có nghĩa là nó thường được tìm thấy nhất trong các trung tâm dữ liệu và trong các môi trường mạng được xác định bằng phần mềm (SDN). Nó hoạt động hiệu quả với cả các thành phần cấp thấp hơn, bao gồm các thiết bị lưu trữ và mạng, và các mục nhập Phần mềm dưới dạng Dịch vụ (SaSS) cấp cao hơn . Về mặt quản lý trạng thái, nó ánh xạ các tài nguyên thực tế trở lại cấu hình, lưu trữ siêu dữ liệu và cải thiện hiệu suất mạng.

Những công dụng chính của Terraform

Terraform có thể quản lý các nhà cung cấp dịch vụ bên ngoài, bao gồm mạng lưới đám mây và các giải pháp nội bộ. Nó đặc biệt hữu ích cho các ứng dụng đa tầng hoặc N tầng, chẳng hạn như máy chủ web sử dụng lớp cơ sở dữ liệu. Vì Terraform mô hình hóa các mối phụ thuộc giữa các ứng dụng và tiện ích bổ sung, nên nó đảm bảo lớp cơ sở dữ liệu đã sẵn sàng trước khi bất kỳ máy chủ web nào được khởi chạy. Terraform không phụ thuộc vào đám mây và có thể quản lý nhiều đám mây để tăng khả năng chịu lỗi. Một tệp cấu hình duy nhất có thể giám sát nhiều nhà cung cấp và xử lý các mối phụ thuộc giữa các đám mây. Terraform rất hiệu quả cho các bản demo hoặc các môi trường dùng một lần khác do dễ dàng tạo mạng trên nhà cung cấp đám mây. Nó giúp quản lý các môi trường song song, do đó, đây là lựa chọn tốt để thử nghiệm, xác thực các bản sửa lỗi và chấp nhận chính thức.

Terraform hoạt động như thế nào

Terraform theo phương pháp khai báo. Điều này có nghĩa là nó mô tả trạng thái cuối của hệ thống mà không chỉ định các bước cần thiết để đạt được trạng thái đó. Terraform hoạt động ở mức độ trừu tượng cao để mô tả những tài nguyên và dịch vụ đám mây nào cần được tạo và kết hợp. Nó không tập trung vào lập trình cấp thấp. Trạng thái cuối được chỉ định trong Ngôn ngữ cấu hình HashiCorp (HCL) hoặc JSON, với HCL được ưu tiên. HCL là một ngôn ngữ rất đơn giản và không cần kinh nghiệm lập trình để sử dụng nó.

HCL được sử dụng để khai báo các nhà cung cấp dịch vụ và tài nguyên trong mạng. Mỗi tài nguyên mô tả một mục cơ sở hạ tầng cụ thể, ví dụ, một mạng ảo. HCL cung cấp các khối, đối số và biểu thức để đơn giản hóa cấu hình. Các khối có thể được sử dụng để nhóm các tác vụ một cách hợp lý và để xử lý lỗi. Các đối số được sử dụng để gán giá trị tĩnh hoặc kết quả của một biểu thức cho một mã định danh. Tuy nhiên, HCL không có bất kỳ dữ liệu phức tạp hoặc cấu trúc điều khiển nào.

Terraform sử dụng các nhà cung cấp để thực hiện cấu hình thực tế. Các nhà cung cấp, có thể là chính thức hoặc do cộng đồng phát triển, giống như các plug-in. Các API này khai báo một tập hợp các loại tài nguyên và nguồn dữ liệu, và cho phép Terraform quản lý các thiết bị khác nhau. Người dùng phải chỉ định các nhà cung cấp cần thiết ban đầu để Terraform có thể cài đặt chúng. Hầu hết các nhà cung cấp đều được liên kết với một nền tảng cơ sở hạ tầng cụ thể, chẳng hạn như nhà cung cấp đám mây, nhưng một số là tiện ích chung. Tất cả các nhà cung cấp, bao gồm cả Nhà cung cấp Linode , có thể được truy cập thông qua Terraform Registry . Người dùng cũng có thể tạo các mô-đun của riêng họ. Các tệp Terraform có .tfphần mở rộng và thường chứa cả khối nhà cung cấp và khối tài nguyên.

Sau đây là ví dụ về cách Terraform có thể hoạt động với nhà cung cấp Linode:

provider "linode" {
  token = "YOUR_LINODE_API_TOKEN"
}

resource "linode_instance" "terraform-web" {
        image = "linode/ubuntu20.04"
        label = "Terraform-Web-Example"
        group = "Terraform"
        region = "us-east"
        type = "g6-standard-1"
        authorized_keys = [ "YOUR_PUBLIC_SSH_KEY" ]
        root_pass = "YOUR_ROOT_PASSWORD"
}

Quy trình làm việc của Terraform

Quy trình làm việc cơ bản của Terraform bao gồm một số bước cơ bản:

  1. Viết – Đầu tiên hãy viết các tệp cấu hình trong HCL bằng bất kỳ trình soạn thảo văn bản nào. Các tệp này mô tả các thành phần cần thiết và chỉ ra trạng thái cuối cùng của hệ thống.
  2. Plan – Thực hiện terraform planlệnh để Terraform xem xét các tệp dự án và tạo kế hoạch hành động. Kế hoạch này cung cấp biểu đồ phụ thuộc, cho phép cấu hình song song các phần không phụ thuộc và hiển thị chính xác những gì Terraform dự định thực hiện. Bước này cho phép các kỹ thuật viên xem xét kế hoạch và xác định xem nó có đáp ứng chính xác nhu cầu của họ hay cần điều chỉnh thêm không.
  3. Áp dụng – Khi kế hoạch được hoàn thiện, sử dụng terraform applyđể đẩy cấu hình ra tất cả các thiết bị.

Người vận hành thường di chuyển qua lại giữa các giai đoạn viết và lập kế hoạch khi họ xác thực và tinh chỉnh cấu hình. Khi áp dụng, Terraform sử dụng các hành động tạo, đọc, cập nhật và xóa (CRUD) để di chuyển các thành phần mục tiêu vào trạng thái mong muốn của chúng. Nếu các tệp cấu hình thay đổi, Terraform có thể xác định chính xác những gì đã thay đổi và tạo một kế hoạch gia tăng giúp giảm thiểu sự gián đoạn. Lệnh terraform initđược sử dụng để phân bổ trước các nhà cung cấp cần thiết, trong khi terraform destroyphá hủy mạng.

Terraform và các sản phẩm khác

Mặc dù Terraform không phải là công cụ quản lý cấu hình, nhưng nó có thể được sử dụng với một công cụ để có giải pháp toàn diện hơn. Terraform có thể cung cấp khả năng trừu tượng hóa mạng ở cấp độ cao hơn, trong khi ứng dụng quản lý cấu hình có thể được sử dụng trên từng thiết bị. Terraform cũng có thể được sử dụng để khởi động phần mềm quản lý cấu hình. Terraform Cloud là ứng dụng thương mại giúp hợp lý hóa quy trình và cung cấp khả năng không gian làm việc. Nó rất tiện dụng cho các nhóm làm việc cùng nhau trên cùng một mạng.

Linode có một bộ sưu tập hướng dẫn Terraform phong phú . Những hướng dẫn này bao gồm các tình huống cụ thể và giải thích cách cài đặt và sử dụng Terraform.

Giới thiệu về Ansible

Mục đích chính của Ansible của Red Hat là tự động hóa CNTT. Ansible tự động hóa việc cung cấp phần mềm, quản lý cấu hình, triển khai ứng dụng và các đường ống tích hợp liên tục (CI). Nó có thể tích hợp với các mạng đám mây và cung cấp hỗ trợ cho Linode. Ansible chạy trên hầu hết các bản phân phối Linux và có thể cung cấp cả thiết bị chạy Linux và Windows. Mục tiêu thiết kế của Ansible là tối giản, nhất quán, an toàn, đáng tin cậy và dễ học. Nó dễ cài đặt và không nhất thiết phải có kỹ năng lập trình đặc biệt để sử dụng.

Những công dụng chính của Ansible

Ansible xử lý mọi loại nền tảng cơ sở hạ tầng, bao gồm bare metal, thiết bị ảo hóa như hypervisor và mạng đám mây. Nó tích hợp tốt với các ứng dụng cũ và các tập lệnh tự động hiện có, và được thiết kế để quản lý các tiện ích phức tạp, đa diện có trong các doanh nghiệp lớn. Ansible hỗ trợ hành vi idempotent, nghĩa là nó có thể đặt nút vào cùng một trạng thái mọi lúc. Điều này là cần thiết để có được sự nhất quán và hành vi chuẩn hóa.

Ansible hoạt động như thế nào

Ansible không sử dụng tác nhân và không phải chạy trên nút đích. Thay vào đó, nó kết nối bằng SSH hoặc phương thức xác thực khác và cài đặt tạm thời các mô-đun Python trên mục tiêu bằng JSON. Các mô-đun này là các chương trình đơn giản chạy trên mục tiêu. Ansible thực thi các mô-đun này và sau đó xóa chúng khi chúng hoàn tất. Chiến lược này đảm bảo tài nguyên không được sử dụng trên mục tiêu khi mục tiêu không được quản lý. Python phải được cài đặt trên cả nút điều khiển và nút đích. Tuy nhiên, Ansible không yêu cầu máy chủ trung tâm để phối hợp. Bất kỳ máy nào đã cài đặt Ansible đều có thể cấu hình một nút khác. Có thể sử dụng khóa ủy quyền để kiểm soát máy nào có thể truy cập vào mục tiêu nào. Ansible dựa trên văn bản và không yêu cầu bất kỳ cơ sở dữ liệu, daemon hoặc máy chủ bên ngoài nào. Chiến lược này tạo điều kiện phục hồi sau lỗi trên diện rộng.

Ansible bao gồm ngôn ngữ khai báo riêng, nhưng nó có thể hoạt động ở chế độ khai báo hoặc chế độ thủ tục. Nói cách khác, một hệ thống có thể được mô tả theo trạng thái cuối cùng của nó hoặc bằng cách sử dụng hướng dẫn về cách đạt đến trạng thái đó. Ansible sử dụng các tệp kiểm kê có thể chỉnh sửa, có phiên bản , được viết theo định dạng INI hoặc YAML, để lưu trữ thông tin cơ sở hạ tầng dưới dạng văn bản thuần túy. Các tệp này xác định các nút mục tiêu cần quản lý, được liệt kê theo tên máy chủ hoặc địa chỉ IP. Nhiều tệp kiểm kê có thể được sử dụng cùng nhau và các kiểm kê có thể được kéo động từ một hệ thống hoặc vị trí khác. Trong một tệp kiểm kê, các nút có thể được nhóm lại với nhau và lồng vào nhau để quản lý dễ dàng hơn. Các phạm vi, biến và bí danh đều có thể được sử dụng để đơn giản hóa danh sách. Một tệp kiểm kê thông thường ở định dạng INI có thể tương tự như sau:

mail.example.com

[webservers]
web1.example.com
web2.example.com

[dbservers]
dbone.example.com
dbtwo.example.com
dbthree.example.com

Nhiệm vụ, Mô-đun và Sổ tay hướng dẫn của Ansible

Các hoạt động cấu hình chính trong Ansible được thể hiện dưới dạng các tác vụ. Đây là các hoạt động diễn ra trên mục tiêu. Một tác vụ có thể là một lệnh ad hoc một lần hoặc một lệnh gọi đến một mô-đun . Các mô-đun là các tệp tập lệnh độc lập thường được viết bằng Python, mặc dù Perl và Ruby cũng có thể được sử dụng. Một mô-đun thường có một mục đích cụ thể, ví dụ, quản lý một ứng dụng cụ thể. Chúng thường được nhóm lại với nhau thành các bộ sưu tập để dễ truy cập hơn. Ansible đi kèm với nhiều mô-đun mặc định và để triển khai Linode của bạn dễ dàng, cũng có một mô-đun Linode Ansible .

Ansible Playbook nhóm các tác vụ liên quan lại với nhau, cùng với các biến liên quan, để triển khai dễ dàng hơn. Playbook thường được viết bằng ngôn ngữ dễ hiểu, mô tả, dễ đọc như YAML hoặc bằng mẫu Jinja. Chúng có thể chứa bố cục mong muốn của mạng, cấu hình, chi tiết triển khai, ID người dùng và thông tin đăng nhập. Playbook có thể ánh xạ các máy chủ từ các tệp kiểm kê đến các vai trò, đây là một loại playbook độc lập đặc biệt bao gồm các hàm Ansible. Một playbook chạy theo thứ tự tuần tự, nhưng có thể chứa các vòng lặp, toán tử điều khiển và trình xử lý sự kiện. Nó cho phép quản trị viên nhắc nhập giá trị, đặt biến và mặc định, và sử dụng kết quả lệnh để xác định luồng cấu hình. Playbook có chế độ để thử nghiệm chạy thử.

Sau đây là ví dụ về đoạn trích từ sổ tay hướng dẫn cập nhật máy chủ Apache:

- name: update web servers
  hosts: webservers
  remote_user: root

  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache configuration file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf

Ansible và các sản phẩm khác

Ansible có thể được sử dụng theo một trong nhiều cách. Nó có thể hoạt động theo cách rất đơn giản, sử dụng các lệnh ad-hoc. Tuy nhiên, chạy Ansible Playbooks phổ biến hơn, cho phép kết hợp nhiều hướng dẫn hơn. Cuối cùng, có sản phẩm Ansible Tower thương mại. Tower cung cấp các tính năng bao gồm REST API, bảng điều khiển dịch vụ web, hoạt động lập lịch, danh sách kiểm soát truy cập (ACL) và thực thi một nút. Tower giúp Ansible dễ sử dụng hơn và có thể đóng vai trò là trung tâm tự động hóa. Các sản phẩm thương mại khác bao gồm Ansible Galaxy, kho lưu trữ các vai trò sẵn sàng sử dụng và Ansible Vault, để kích hoạt mã hóa.

Linode có một số hướng dẫn giúp bạn cài đặt Ansible và bắt đầu sử dụng nó để chạy các lệnh tùy ý và triển khai Linode.

So sánh giữa Ansible và Terraform

Terraform là một công cụ điều phối dịch vụ được tối ưu hóa cho các mạng đám mây và đa đám mây. Nó đảm bảo môi trường ở trạng thái mong muốn, lưu trữ trạng thái này và khôi phục hệ thống sau khi tải lại. Nó không tập trung vào quản lý cấu hình.

Ansible là một công cụ quản lý cấu hình. Nó nổi trội trong việc cung cấp phần mềm và thiết bị, và triển khai các ứng dụng chạy trên cơ sở hạ tầng. Nó hoạt động trên một thiết bị cụ thể tách biệt với mạng và đảm bảo thiết bị đó hoạt động bình thường.

Có một số điểm trùng lặp giữa các công cụ vì Ansible có thể thực hiện một số điều phối dịch vụ. Playbook của nó có thể được mở rộng để triển khai các ứng dụng trên đám mây và nó có các mô-đun cho hầu hết các nhà cung cấp đám mây lớn. Nhưng nó không tốt trong việc điều phối các dịch vụ và các ứng dụng phụ thuộc, được kết nối với nhau.

Một số thuộc tính cơ bản thường được sử dụng để phân biệt các công cụ IaC khác nhau. Terraform và Ansible có thể được đánh giá thêm bằng các chỉ số này.

Nguồn mở so với tính khả dụng thương mại

Cả Ansible và Terraform đều là các công cụ mã nguồn mở miễn phí. Tuy nhiên, cả hai đều cung cấp các phiên bản doanh nghiệp hoặc tiện ích mở rộng nâng cao hơn với chi phí. Ansible có Ansible Tower, bổ sung thêm nhiều tính năng hơn và được tối ưu hóa cho tự động hóa. Terraform Cloud hợp lý hóa và cải thiện quy trình cấu hình và được tiếp thị cho các công ty lớn hơn. Một số tính năng của Cloud là miễn phí, nhưng một số tính năng khác chỉ khả dụng cho các tài khoản trả phí.

Công nghệ sử dụng

Terraform được viết bằng ngôn ngữ Go và chấp nhận các tệp cấu hình bằng ngôn ngữ TCL của riêng nó hoặc bằng JSON. Ansible được viết bằng Python và sử dụng ngôn ngữ này để cấu hình nút mục tiêu. Nó cho phép các mô-đun được viết bằng Python, Perl hoặc Ruby. Tuy nhiên, các tệp cấu hình khai báo được tạo ở định dạng YAML hoặc INI. Cả Terraform và Ansible đều không sử dụng tác nhân.

Cách tiếp cận mang tính tuyên bố so với cách tiếp cận mang tính mệnh lệnh

Terraform chỉ là một công cụ khai báo. Nó chấp nhận mô tả về trạng thái cuối cùng của hệ thống và tự đưa ra quyết định về cách xây dựng cấu hình. Ansible cũng cho phép sử dụng phương pháp khai báo, nhưng nó cho phép các quy trình bắt buộc với các hướng dẫn và lệnh cụ thể bên trong các mô-đun được lập trình. Phương pháp này tăng thêm tính linh hoạt, nhưng cũng làm tăng tính phức tạp. Trạng thái cuối cùng của mạng không được ghi lại ở bất kỳ đâu bên trong Ansible.

Cấu hình có thể thay đổi so với cấu hình không thể thay đổi

Nếu một cấu hình có thể thay đổi, thì nó có thể được thay đổi. Với cấu hình không thể thay đổi, thì mục tiêu phải được khởi động lại hoặc hủy rồi mới được tạo lại. Không thể thay đổi được. Cả hai công cụ đều hỗ trợ khả năng thay đổi, nhưng cách tiếp cận này phù hợp hơn với Ansible. Ansible có thể nhập lại và có thể dễ dàng sửa chữa hoặc sửa đổi cấu hình. Trên thực tế, đây là một trong những điểm mạnh của nó. Vì hoạt động trong môi trường đám mây, Terraform hoạt động tốt nhất khi sử dụng cách tiếp cận không thể thay đổi. Thường thì việc phá bỏ một tài nguyên đám mây và xây dựng lại bằng một cấu hình mới dễ hơn là cấu hình lại.

Phân phối đẩy và kéo

Cả Ansible và Terraform đều sử dụng phân phối đẩy. Chúng chủ động cấu hình các thiết bị mục tiêu.

Tài nguyên bên ngoài

Terraform có thư viện mô-đun phát triển và trưởng thành hơn. Ansible cung cấp kho lưu trữ Galaxy, nhưng điều này đòi hỏi nhiều sự can thiệp thủ công hơn. Cả hai ứng dụng đều có cộng đồng người dùng lớn và năng động.

Tính khả dụng của GUI

Không công cụ nào có GUI tuyệt vời. Ansible cung cấp GUI cơ bản trong ứng dụng Ansible Tower dành cho doanh nghiệp, nhưng có một số hạn chế. Terraform không có GUI gốc.

Đưa ra quyết định giữa Terraform và Ansible

Mỗi công cụ đều có điểm mạnh riêng. Terraform rất thân thiện với người dùng và có khả năng lập lịch tốt. Nó tích hợp tốt với Docker, vì Docker xử lý nhiều chức năng quản lý cấu hình mà Terraform không có. Tuy nhiên, Terraform có nhiều chi phí chung và có thể không rõ ràng về hành vi. Không rõ các thiết bị mục tiêu được đưa vào trạng thái cuối cùng như thế nào và ngay cả cấu hình cuối cùng cũng không phải lúc nào cũng rõ ràng.

Ansible có chính sách bảo mật và chức năng ACL tốt hơn. Nhìn chung, đây là một công cụ trưởng thành hơn và phù hợp hơn với các khuôn khổ tự động hóa truyền thống. Nó nhẹ về mặt mã hóa và trực quan và đơn giản hơn trong các hoạt động của nó. Thật không may, nó không thành công trong việc sắp xếp các dịch vụ, các ứng dụng được kết nối và các phụ thuộc logic.

Mặc dù có sự khác biệt, nhưng có sự chồng chéo đáng kể giữa Terraform và Ansible. Trong nhiều trường hợp, có thể sử dụng cả hai. Ansible và Terraform không loại trừ lẫn nhau và hoàn toàn có thể sử dụng cả hai trong cùng một mạng. Tuy nhiên, một số bố cục phù hợp hơn cho một trong hai.

Lựa chọn đúng đắn phụ thuộc vào hoàn cảnh của bạn. Bạn có nhiều khả năng đưa ra quyết định đúng đắn hơn nếu bạn hiểu mạng hiện tại của mình và mục tiêu bạn đang cố gắng đạt được. Nếu bạn đang sử dụng giải pháp chứa trong container để cung cấp phần mềm trong mạng đám mây, thì Terraform có thể đáp ứng hầu hết các nhu cầu của bạn. Tuy nhiên, Ansible cung cấp nhiều tính linh hoạt và khả năng kiểm soát hơn cho các mạng kế thừa hỗn hợp chạy nhiều ứng dụng khác nhau. Nó rất tiện lợi cho những người muốn duy trì một số quyền kiểm soát đối với các thiết bị của mình và có thể tìm ra cách khác để triển khai các dịch vụ cơ bản. Vì cả hai công cụ đều tiếp tục phát triển, nên có khả năng chúng có thể hội tụ hoặc cung cấp các giải pháp toàn diện hơn trong tương lai. Câu trả lời đúng đắn cho mạng của bạn có thể khá khác nhau trong một hoặc hai năm.

Thông tin thêm

Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.