Tìm hiểu sự tương đồng và khác biệt giữa các công cụ Devops: Ansible, Chef và Terraform, CloudFormation

Hiện nay, việc quản lý các web applications khá là phức tạp, các nhà quản trị có thể phải mất hàng giờ load balancer, web servers, database servers … Đồng thời chúng ta cũng rất tốn thời gian để provisioning và quản lý những hệ thống này.

Infrastructure as Code cho phép người dùng thiết lập/quản lý những stack hệ thống thông qua việc định nghĩa chúng trong 1 file script chẳng hạn thay vì tốn thời gian và công sức setup manual từng thứ (eg: ssh rồi cài cắm package, services, lib nọ kia).

Một loạt các công cụ phổ biến hỗ trợ bởi đông đảo các contributor và có thể sử dụng đa nền tảng (AWS, Azure, GCP) như Ansible, Chef, TerraForm hay CloudFormation. Các công cụ này giống và khác gì nhau? Trong bài viết này chúng ta cùng tìm hiểu mối tương quan và khác biệt của các công cụ này.

1. Configuration Management vs Provisioning

  • Chef, Puppet, Ansible và SaltStack đều là configuration management tool, tức là nó được design để cài đặt và quản lý phần mềm trên những servers có sẵn.
  • CloudFormation và Terraform là provisioning tool, có nghĩa là nó được thiết kế để xây dựng servers (cũng như việc thiết lập load balancers, databases, networking,…) và việc config server sẽ nhường lại cho tool khác

Ví dụ, bạn dùng Docker thì hầu hết phần việc config đã được thực hiện trước đó rồi. Trong Docker images thì hầu hết những phần mềm mà server bạn cần đều đã được cài đặt và config cả rồi. Một khi bạn đã có Docker images rồi thì điều bạn cần làm chỉ là chạy nó mà thôi. Điều bạn thực sự cần làm ở đây là provision những servers để chạy những container này, do vậy Terraform sẽ phù hợp và tốt hơn những configuration management tool khác.

2. Mutable Infrastructure vs Immutable Infrastructure

  • Công cụ như Chef, Puppet, Ansible và SaltStack thường thay đổi một hệ thống đã có sẵn. Ví dụ bạn muốn Chef cài đặt version mới của OpenSSL, nó sẽ chạy lệnh software update trên server của bạn. Qua nhiều lần chạy update thì mỗi server sẽ có những trạng thái thay đổi khác nhau. Điều này dẫn đến vấn đề là kiểm soát về cấu hình.
  • Ngược lại nếu bạn dùng provisioning tool như Terraform thì việc deploy machine image được tạo bởi Docker, mọi thay đổi sẽ tạo một deployment mới. Điều này sẽ làm giảm khả năng configuration drift và dễ dàng biết được trạng thái hiện tại của server. Bạn cũng có thể dễ dàng deploy bất cứ version nào trước đó (rollback).

3. Procedural vs Declarative

  • Chef và Ansible khuyến khích sử dụng procedural style tức là bạn sẽ viết những đoạn code chi tiết, step by step.
  • Terraform, CloudFormation, SaltStack và Puppet thì lại khuyến khích viết theo kiểu declarative style tức là bạn sẽ viết code là state mà bạn cần và chúng sẽ tự tìm cách để setup.

Ví dụ là bạn muốn deploy 10 servers (EC2 instance của AWS chẳng hạn) để chạy version 1 của app gọi là v1. Với Ansible thì bạn viết procedural như sau:

Và declarative với Terraform thì bạn viết đơn giản là:

Không khác nhau lắm và chúng cùng trả về kết quả là 10 EC2 instances.

Giờ thì chúng ta thay đổi một chút. bạn muốn tạo thêm 5 servers nữa (tổng cộng là 15 servers).

  • Với Ansible thì code cũ không còn tác dụng nữa vì nếu bạn sửa số lượng server từ 10 thành 15 và chạy lại đoạn code đó thì nó sẽ tạo ra 15 servers mới nữa. Vì vậy bạn sẽ phải viết/copy đoạn code để thêm 5 server mới nữa:
  • Ngược lại thì với declarative approach thì bạn chỉ cần sửa ở Terraform số lượng servers là 15:

4. Master vs Masterless

Chef, Puppet và SaltStack đều yêu cầu bạn phải chạy trên master server để lưu lại state và update những thay đổi của hệ thống. Mỗi khi bạn muốn update một cái gì đó, bạn cần sử dụng client (UI hoặc CLI) để chạy commands trên master server, master server sẽ đẩy những thay đổi đó cho những servers khác hoặc những servers đó sẽ pull bản update mới nhất từ master server. Việc này có một số vấn đề như sau:

  • Extra infrastructure: bạn sẽ phải deploy 1 sever hoặc nhiều server nữa cho việc high availability và scalability
  • Maintainance: bạn sẽ phải maintain, upgrade, back up, monitor và scale master server
  • Security: bạn cần phải tạo cách thức giao tiếp giữa client-server và master server – servers khác. Nào là mở thêm port, auth system,… điều này có thể tạo thêm cơ hội cho attackers.

Ansible, CloudFormation, Heat và Terraform mặc định đều là masterless, chính xác hơn thì một trong số chúng sẽ dựa vào master server nhưng nó cũng là 1 phần hệ thống bạn đang sử dụng chứ không phải phần bạn cần phải quản lý thêm. Ví dụ thì Terraform sẽ giao tiếp với hệ thống thông qua API cloud provider, có thể hiểu là API server là master server (bạn gần như ko cần quan tâm đến chúng lắm). Ansible thì làm việc thông qua SSH nên bạn không cần phải thông qua extra infrastructure nào.

Tham khảo

Leave a Reply

Your email address will not be published. Required fields are marked *