Tất tật những điều bạn cần biết về Infrastructure as code !!!!
I. Overview
Trong thời kì DevOps thịnh hành như hiện nay, chắc hẳn ai trong chúng ta cũng từng ít nhiều nghe đến khái niệm: IaC (infrastructure as code).
Vậy thì IaC là gì? IaC liên quan gì đến Infrastructure Provisioning, Configurations management? Nếu bạn còn mông lung về các khái niệm này, thì đây chính là bài viết dành cho bạn.
So, cùng nhau tìm hiểu nhé!
II. IaC là gì?
Trước tiên, chúng ta cần nắm rõ một vài khái niệm thông dụng từ góc nhìn của một ITer đã:
- Infrastructure (cơ sở hạ tầng) : bao gồm các thành phần software, hardware (ví dụ như server, storage, network devices, firewall devices, routes) để tạo nên một môi trường IT.
- Provisioning (cấp phát) : là quá trình khởi tạo Infrastructure và cung cấp cho người sử dụng
- Configuration: là việc cấu hình cơ sở hạ tầng đã được cấp phát
Ngày trước, khi chưa có sự hiện diện của IaC, IT Infrastructure được cấp phát bằng cơm. Nhân sự quản trị hạ tầng sẽ phải dựng máy ảo, cấu hình mạng, cài đặt phần mềm, ... một cách thủ công, do đó những yêu cầu cấp phát thường mất hàng ngày, hàng tuần để thực hiện.
Nhưng với sự phát triển của cloud computing, việc cấp phát cơ sở hạ tầng trở nên dễ dàng hơn bao giờ hết, bởi phần lớn các thao tác phức tạp đã được trừu tượng hóa bởi các nhà cung cấp dịch vụ Cloud bằng các công nghệ như: Virtualization, SDN (software-defined networking). Bạn có thể được cung cấp VMs, network, storage trong vòng vài nốt nhạc.
Và điều tuyệt vời nhất, là mọi thao tác đều có APIs. Các nhà cung cấp dịch vụ cloud đều "khoe ra" các APIs tương tác với platform của họ để cấp phát hạ tầng. Với APIs, bạn có thể sử dụng bất kì ngôn ngữ nào để tương tác, quản trị cơ sở hạ tầng của mình. Tất cả đều sử dụng code.
Khi bạn dùng code để cấp phát và cấu hình cơ sở hạ tầng, bạn đang áp dụng Infrastructure as code (IaC).
Và do cùng là code, bạn hoàn toàn có thể áp dụng workflow phát triển phần mềm cho việc phát triển IaC. Cụ thể hơn là đánh version, chạy unit tests, integration tests, deploy IaC, ...
Qua thời gian, nhiều công cụ đã được tạo ra nhằm đơn giản hóa IaC, bạn không cần code quá nhiều nữa. Các công cụ này trừu tượng hóa tối đa những phân đoạn code phức tạp bằng cách sử dụng "ngôn ngữ" riêng của chúng, hay DSL (domain-specific languages). Đằng sau đó, chúng call đến cloud APIs để cấp phát và quản trị tài nguyên. Điều này giúp ích rất nhiều cho SysAdmin, Engineers, bởi ta sẽ không cần kĩ năng code quá bá đạo để nắm được IaC.
III. Một vài công cụ IaC
Hiện nay, các công cụ IaC phổ biến nhất phải kể đến: Terraform, Pulumi, Ansible, Chef. ngoài ra còn một số công cụ mà các Cloud providers cung cấp riêng như: Cloudformation, AWS CDK, ...
Ta có thể chia các công cụ này ra thành hai nhóm:
- Nhóm cấp phát hạ tầng (Infrastructure Provisioning), bao gồm: Terraform, Cloudformation
- Nhóm quản lý cấu hình (Configurations management), bao gồm: Ansible, Chef, Puppet
Sự khác biệt giữa Infrastructure Provisioning với Configurations management?
Để minh họa rõ sự khác biệt giữa Infrastructure Provisioning với Configurations management, ta có thể tham khảo ví dụ dưới:
Cụ thể ở đây:
- Infrastructure provisioning tool được sử dụng để khởi tạo và cấp phát servers, network
- Configuration management tool chịu trách nhiệm cấu hình các ứng dụng bên trong server được cấp phát.
Có thể thấy, trong quá trình quản trị hạ tầng hai nhiệm vụ này luôn đi kèm với nhau. Có những công cụ có thể thực hiện cả hai chức năng, tuy nhiên để tối ưu thì người ta vẫn thường sử dụng kết hợp nhiều công cụ để tận dụng được thế mạnh của chúng.
Mục tiêu chính của các công cụ IaC là giữ cho các hành phần cơ sở hạ tầng ở đúng trạng thái mà người dùng định nghĩa. Nếu tài nguyên tạo bởi IaC của bạn bị ai đó tác động thay đổi, bạn hoàn toàn có thể chạy lại code để đưa nó về trạng thái ban đầu.
Một khi bạn hoàn thiện đoạn code IaC, bạn có thể sử dụng nó để tái tạo, nhân bản môi trường bất cứ khi nào bạn muốn mà không gặp trở ngại. Nếu cần tùy chỉnh, chỉ cần thay đổi tham số truyền vào, và code template vẫn giữ nguyên. Phần lớn các công cụ IaC open source có thể sử dụng cả trên các nền tảng cloud và on-prem, do đó bạn không cần lo về khả năng tích hợp.
Đặc tính Idempotency
Đặc tính nổi bật nhất của công cụ IaC là "idempotency". Nghĩa là, không cần biết bạn chạy Infrastructure code bao nhiêu lần, nếu cấu hình hạ tầng vẫn còn đó, nó sẽ không tác động.
Ví dụ, bạn tạo ra 2 server với Terraform. Nếu bạn chạy lại Terraform code, nó sẽ không tác động gì đến hai server hiện tại. Cơ mà nếu bạn xóa một server và chạy lại, nó sẽ tạo một server mới và giữ nguyên server kia, và đảm bảo trang thái hai server luôn giống với định nghĩa trong code.
IV. CI/CD cho IaC
Như đã đề cập ở phần trước, IaC hoàn toàn có thể được áp dụng development workflow như software code, đồng nghĩa với việc ta có thể áp dụng CI/CD cho IaC.
Dưới đây là một ví dụ thực tế về CI/CD pipeline cho IaC, cấp phát tài nguyên AWS cloud:
Cụ thể:
- (1) DevOps Engineer phát triển IaC
- (2) Commit code tới Git
- (3) CI/CD server nhận biết commit mới, pull code về chạy pipeline
- (4) Testing infrastructure code
- (5),(6),(7) Đây là quá trình deploy IaC, hay chính xác hơn là cấp phát và cấu hình tài nguyên.
V. Kết luận
Trong bài viết này, mình đã chia sẻ với mọi người về khái niệm IaC, làm rõ các chức năng IaC: Infrastructure Provisioning và Configuration Management.
Hy vọng kiến thức này hữu ích. Nếu thấy hay đừng tiếc 1 vote để mình có thêm động lực ra các bài tiếp theo nhé. Thanks for your time!
All rights reserved