21/01/2026
Bàn về Tự động hóa trong DevOps Engineering
Khi nghĩ về DevOps, hoặc mới tìm hiểu về DevOps, mình đoán là ai trong chúng ta cũng sẽ nghĩ về CICD đầu tiên. CICD hiểu theo đúng nghĩa của nó là tích hợp liên tục và phân phối/triển khai liên tục, để đạt được điều đó thì chúng ta (là các DevOps Engineer) sẽ phải viết các scripts tự động hóa việc clean, build, test, deploy. Nhưng thực tế, trong DevOps Engineering thì "tự động hóa" được thực hành không chỉ trong CICD mà trong mọi ngóc ngách của toàn bộ vòng đời của hệ thống (SDLC).
CI/CD chủ yếu giải quyết câu hỏi: làm thế nào để đưa code từ tay developer lên production nhanh hơn và ít lỗi hơn. Nhưng khi hệ thống lớn dần, câu hỏi quan trọng hơn lại là: làm thế nào để hệ thống đó tồn tại, tin cậy, mở rộng và tự phục hồi trong thời gian dài mà không tiêu tốn nhiều nỗ lực của con người. Ngay từ bước khởi tạo hạ tầng, Infrastructure as Code (IaC) đã là một hình thức tự động hóa mang tính nền tảng. Việc sử dụng IaC giúp đảm bảo tính tái lập, khả năng audit, rollback và giảm phụ thuộc vào trí nhớ con người. Một hạ tầng mà không thể được tái lập lại một cách xác định thì sớm muộn cũng sẽ trở thành rủi ro vận hành.
Khi hệ thống đi vào vận hành, tự động hóa lúc này sẽ xoay quanh việc quản lý failure. Failure là trạng thái mặc định của distributed system, là DevOps Engineer thì chúng ta phải chấp nhận Failure như một điều bình thường. Tự động hóa lúc này xuất hiện dưới các hình thức như health check, auto-healing, auto-scaling, failover, traffic shifting. Điểm mấu chốt là: con người không nên là thành phần nằm trong critical path của các thao tác lặp đi lặp lại và có thể mô tả bằng logic rõ ràng. Nếu mỗi lần server "oẳng" đều cần con người SSH vào để xử lý và khôi phục thủ công, thì đó không phải là vấn đề kỹ năng, mà là vấn đề thiết kế.
Một tầng sâu hơn nữa của tự động hóa trong DevOps là giảm toil*. Rất nhiều công việc vận hành không khó, nhưng lặp đi lặp lại, không tạo ra giá trị lâu dài và tỷ lệ thuận với quy mô hệ thống: xử lý alert, chạy script, chỉnh config, restart service. Nếu những việc này không được tự động hóa, chúng sẽ âm thầm ăn mòn thời gian, động lực và chất lượng kỹ thuật của đội ngũ. DevOps Engineer lúc này không còn làm “engineering” nữa, mà trông giống như một nhân viên trực tổng đài. Tự động hóa, ở góc nhìn này, là cách để bảo vệ năng lực tư duy dài hạn của con người, chứ không chỉ là tiết kiệm vài phút thao tác.
Tuy nhiên, không phải mọi thứ đều nên được tự động hóa một cách mù quáng. Một bài học lớn từ thực tế là: tự động hóa tệ nguy hiểm hơn làm thủ công. Một script sai chạy trên một máy là sự cố nhỏ; script đó chạy trên toàn bộ production có thể là thảm họa. Vì vậy, DevOps Engineering đòi hỏi tự động hóa phải có kỷ luật: idempotent, có guardrail, có rate limit, có quan sát được trạng thái và có khả năng dừng lại khi mọi thứ đi chệch hướng. Viết automation không phải là “xong là chạy”, mà là thiết kế một hệ thống nhỏ với đầy đủ trách nhiệm như bất kỳ phần mềm production nào khác.
Ở mức độ cao nhất, tự động hóa trong DevOps không còn tồn tại như một tập hợp script bên ngoài hệ thống, mà được nội tại hóa vào chính hệ thống. Hệ thống tự biết khi nào cần scale, khi nào cần reschedule, khi nào cần tự điều chỉnh. Lúc này, DevOps Engineer không còn “chạy automation” nữa, mà tập trung vào việc thiết kế hệ thống sao cho automation trở thành hành vi tự nhiên. Đây là bước chuyển từ automation sang autonomous system (hệ thống tự trị), và cũng là ranh giới giữa vận hành thủ công ở quy mô lớn và vận hành bền vững.
CI/CD chỉ là cánh cửa đầu tiên dẫn vào thế giới tự động hóa của DevOps. Là những DevOps Engineer, chúng ta cần áp dụng tự động hóa xuyên suốt SDLC: từ thiết kế, triển khai, vận hành cho tới tiến hóa hệ thống; dùng phần mềm để quản lý phần mềm, và giải phóng con người khỏi những công việc mà máy móc làm tốt hơn.
(*) toil ở đây là thuật ngữ của Google SRE, chỉ các công việc thủ công, lặp đi lặp lại, có thể tự động hóa được và không mang lại giá trị lâu dài.