NẾU…CÓ MỘT KHÁI NIỆM NGƯỜI KỸ SƯ MẠNG CẦN PHẢI BIẾT, THÌ ĐÓ CHÍNH LÀ “API”
Về một công cụ lỗi thời – Giao diện dòng lệnh
Tôi là một router, tôi có kết nối láng giềng với switch, firewall để tạo thành một hạ tầng mạng. Từ 25 năm nay, để quản trị và cấu hình tôi, người kỹ sư mạng phải dùng các giao tiếp dòng lệnh chậm chạp gọi là Giao diện dòng lệnh (Command Line Interface – CLI). CLI, ngay ngày đầu, được thiết kế cho giao tiếp giữa người và máy. Khi người kỹ sư telnet/SSH/console đến router, thứ mà họ thường được thấy trước tiên chính là CLI. Các kết quả trả về từ router thông qua CLI không theo một chuẩn mực hay qui tắc nào vì router chúng tôi nghĩ rằng con người sẽ đủ thông minh để hiểu và phân tích được các kết quả này. Dù rằng CLI mang tính tương tác cao nhưng tốc độ gõ bàn phím của một người kỹ sư cho dù có nhanh và chính xác đến mấy thì cũng có lúc bị sai sót.
Tóm tắt: CLI là công cụ giúp người kỹ sư truy cập, xác thực và tương tác với chức năng quản trị của một node mạng như router, switch, firewall. CLI được thiết kế cho giao tiếp giữa người và máy.
Thời thế thay đổi: quá trình chuyển đổi số trong doanh nghiệp, về tự động hóa
Những năm gần đây, các doanh nghiệp chuyển mình. Họ xây dựng các ứng dụng apps để phục vụ nhu cầu kinh doanh thay đổi quá nhanh hàng ngày. Các apps muốn nói chuyện trực tiếp với hạ tầng mạng. Trong các trung tâm dữ liệu datacenter, số lượng thiết bị cần quản trị càng ngày càng lớn. Một người kỹ sư Amazon giờ đây phải quản trị 250 ngàn node (!), so với yêu cầu cách đây 15 năm anh ta chỉ cần quản lý 250 node. Trong thế giới của IoT, làm thế nào chúng ta có thể truy cập và cấu hình xe hơi, đèn, cửa, tủ lạnh, đồ chơi….Rõ ràng, chúng ta cần giao tiếp giữa máy với máy, chúng ta cần network automation!
Do đó, lĩnh vực networking đầy bảo thủ cũng đã bắt đầu cố gắng cải tiến đi theo hướng tự động hóa để đáp ứng nhu cầu thay đổi. Có hai hướng tiếp cận.
Hướng đầu tiên, các người kỹ sư mạng cố gắng tự động hóa các tác vụ quản trị, cấu hình bằng phần mềm nhưng vẫn tận dụng CLI. Họ dùng các Python scripts để cấu hình các thiết bị thông qua CLI trong một phiên telnet/SSH. Ví dụ, một Expect script có thể có dạng tương tác với thiết bị như sau khi cố gắng truy cập vào thiết bị. Script sau đó sẽ cố gắng gửi một tập hợp các lệnh đến CLI sau khi login thành công.
expect "Username: "
send "vnpro"
expect "Password: "
send "vnpro.org"
Cách dùng script dạng này thì cũng hữu dụng. Tuy nhiên nó khó viết, khó phát triển và rất khó để tìm lỗi (troubleshooting). Nếu thiết bị mạng của một hãng cho ra kết quả trả về của một lệnh theo định dạng kiểu khác, người kỹ sư mạng sẽ phải tìm ra sự thay đổi này và sửa đổi các phần script tương ứng. Ngoài ra, nếu trong môi trường hạ tầng gồm nhiều thiết bị của các hãng khác nhau, số script cần viết tăng nhanh tương ứng.
Ở hướng nghiên cứu thứ hai, các kỹ sư mạng tập trung vào việc cải tiến phần giao tiếp giữa các công cụ phần mềm với các thiết bị phần cứng. Phần giao tiếp này có tên gọi là API (Application Programming Interfaces – API). API là một cơ chế giúp phần mềm trên một thiết bị này nói chuyện với phần mềm trên một thiết bị khác. API được dùng rất nhiều trên Internet và trong thế giới của các nhà phát triển ứng dụng, trong thế giới của phần mềm. API hiện diện ở khắp nơi, ngoại trừ trong các thiết bị mạng. Tuy nhiên những năm gần đây, các hãng sản xuất thiết bị mạng viễn thông đều đã chú ý hỗ trợ APIs trong các sản phẩm của mình. Một thiết bị có hỗ trợ giao tiếp APIs sẽ giúp các công cụ phần mềm quản lý truy xuất trực tiếp các thông tin cấu hình, các trạng thái hoạt động và các dòng lưu lượng trên thiết bị.
Tóm tắt: API là giao tiếp giữa phần mềm với phần mềm. Các thiết bị mạng hiện đại hầu hết đều hỗ trợ APIs. API sẽ sớm trở thành một công cụ chủ chốt để cấu hình và quản trị các thiết bị mạng trong một tương lai rất gần. CLI sẽ sớm nghỉ hưu sau hơn 25 năm làm việc.
Một kiểu định nghĩa khác của API
Một router thường có ba chức năng: chức năng tìm đường, định tuyến (control plane), chức năng truyền dữ liệu (data plane) và chức năng quản trị (management plane). Để quản trị router, chúng ta thường telnet/SSH vào router, sau đó dùng CLI. Bên cạnh telnet/SSH, các phần mềm quản trị mạng hiện tại cũng dùng giao thức SNMP để thu thập thông tin về các thành phần của hệ thống mạng. SNMP thật ra cũng được dùng để cấu hình các thiết bị mạng, tuy nhiên tính năng này của SNMP ít được khai thác do khả năng hỗ trợ thay đổi các thông số hoạt động của thiết bị rất hạn chế. Một điểm yếu khác của SNMP là nó không hỗ trợ rollback các đối tượng đã bị thay đổi cấu hình. Hơn nữa, định dạng dữ liệu trả về của SNMP thường rất khó phân tích, phụ thuộc nhiều vào các nhà sản xuất.
Với việc các thiết bị hỗ trợ giao tiếp lập trình API, chúng ta có thêm một cách thức khác để cấu hình, quản trị các thiết bị mạng. Các định dạng kết quả trả về từ việc gọi API đều được chuẩn hóa sao cho các phần mềm và con người đều có thể hiểu được. API giúp cho giao tiếp giữa máy-máy được tốt hơn.
Tóm tắt: API là một bề mặt tương tác mới, là một giao thức mới của management plane, bên cạnh telnet/SSH/SNMP.
Trong mô hình OSI hoặc TCP/IP, lớp ứng dụng thường nằm ở trên cùng. Phần hạ tầng mạng thường nằm ở các lớp thấp nhất. Các ứng dụng ở các tầng trên cao thường dùng TCP/IP để nói chuyện với các thiết bị phần cứng bên dưới. Với việc các thiết bị ngày nay có hỗ trợ giao tiếp API cho phép các ứng dụng kinh doanh nói chuyện trực tiếp với hạ tầng thiết bị, xét về mặt vị trí trong các mô hình mạng, ta có thể mô tả API tựa như một chồng giao thức TCP/IP mới.
Tóm tắt: API là quan trọng ở hiện tại và tương lai, cũng giống như giao thức TCP/IP trong hàng chục năm qua.
Các cách truy cập API trên thiết bị
Có hai cách truy cập API phổ biến trong các thiết bị mạng: dùng http và dùng giao thức NETCONF.
Trong kiểu dùng http, người ta chia thành hai loại con: RESTful API và non-restful. Để giữ bài viết ngắn, chúng ta chỉ cần hiểu rõ loại phổ biến hơn trong lĩnh vực networking là RESTful API.
Đặc điểm của RESTful API là nó hoạt động theo mô hình client-server. Trong mô hình của chúng ta, server là con router hoặc là network controller. Còn client là một chương trình Python scripts, một công cụ như Postman hoặc một ứng dụng WebUI. Vì giao thức http được sử dụng như giao thức lớp truyền dẫn, chúng ta sẽ thực thi các hoạt động truy cập API mà vẫn dùng URL, tựa như khi chúng ta truy cập World Wide Web. Khi chúng ta duyệt web, các hàm http get và http post được thực thi. RESTful API cũng có các hàm chức năng tương tự.
Một đặc tính khác của REST API là REST không có lưu và sử dụng các thông tin trong một phiên truy cập. Nói cách khác, mỗi truy cập REST API không sử dụng kết quả các phiên trước đó, hoạt động theo kiểu stateless. Để so sánh, chúng ta hãy nhớ lại rằng TCP hoạt động theo kiểu stateful. Một kết nối TCP thường dùng các chỉ số tuần tự sequence number và các số ACK# để quản lý dòng chảy của dữ liệu trong một phiên TCP.
Tóm tắt: RESTful API hoạt động theo mô hình client-server và theo kiểu phi trạng thái stateless. Client khi hoạt động trong trạng thái stateless phải gửi hết các dữ liệu cần thiết để máy chủ có thể hiểu và thực thi một tác vụ được yêu cầu trong một lần yêu cầu truy vấn duy nhất.
Kiểu gọi API thứ hai thường thấy trong thiết bị mạng là dùng giao thức NETCONF. Netconf thường hay được so sánh với giao thức SNMP. Netconf cũng được dùng để truy xuất các cấu hình và các dữ liệu trạng thái hoạt động từ các thiết bị mạng. Về phương diện này, NETCONF có ưu điểm hơn SNMP là nó có khả năng tách biệt các dữ liệu dạng cấu hình (là dữ liệu do người kỹ sư nhập vào router) và các dữ liệu hoạt động (là các dữ liệu phát sinh trong quá trình hoạt động của router). NETCONF hoạt động theo mô hình client/server trong đó server là router còn server là trạm quản lý hoặc bộ điều khiển mạng network controller. NETCONF sử dụng các giao thức như SSHv2/TLS để truyền thông điệp giữa client (router) và server (DNA controller). Trong netconf, các dạng dữ liệu kết xuất ra được chuẩn hóa ở dạng XML để cả người và máy đều có thể đọc và hiểu được.
Trong thực tế, để bắt đầu hình trình khám phá các network API trong các thiết bị, chúng ta có thể dùng các công cụ mà không nhất thiết phải biết lập trình. Để truy cập RESTful API, chúng ta có thể dùng các công cụ như cURL hoặc phần mềm Postman. Với netconf, chúng ta có thể thử với Netconf over SSH.
Tóm tắt: RESTful API hoạt động tương tự như giao thức http.NetConf API thì hoạt động trên nền của SSHv2/TLS. API là tính năng quan trọng giúp giao tiếp giữa phần mềm và thiết bị mạng trở nên dễ dàng hơn. Trong tương lai rất gần, thay vì nói "để tôi telnet vào router", chúng ta sẽ nói "Để tôi gọi API của router".
Về một công cụ lỗi thời – Giao diện dòng lệnh
Tôi là một router, tôi có kết nối láng giềng với switch, firewall để tạo thành một hạ tầng mạng. Từ 25 năm nay, để quản trị và cấu hình tôi, người kỹ sư mạng phải dùng các giao tiếp dòng lệnh chậm chạp gọi là Giao diện dòng lệnh (Command Line Interface – CLI). CLI, ngay ngày đầu, được thiết kế cho giao tiếp giữa người và máy. Khi người kỹ sư telnet/SSH/console đến router, thứ mà họ thường được thấy trước tiên chính là CLI. Các kết quả trả về từ router thông qua CLI không theo một chuẩn mực hay qui tắc nào vì router chúng tôi nghĩ rằng con người sẽ đủ thông minh để hiểu và phân tích được các kết quả này. Dù rằng CLI mang tính tương tác cao nhưng tốc độ gõ bàn phím của một người kỹ sư cho dù có nhanh và chính xác đến mấy thì cũng có lúc bị sai sót.
Tóm tắt: CLI là công cụ giúp người kỹ sư truy cập, xác thực và tương tác với chức năng quản trị của một node mạng như router, switch, firewall. CLI được thiết kế cho giao tiếp giữa người và máy.
Thời thế thay đổi: quá trình chuyển đổi số trong doanh nghiệp, về tự động hóa
Những năm gần đây, các doanh nghiệp chuyển mình. Họ xây dựng các ứng dụng apps để phục vụ nhu cầu kinh doanh thay đổi quá nhanh hàng ngày. Các apps muốn nói chuyện trực tiếp với hạ tầng mạng. Trong các trung tâm dữ liệu datacenter, số lượng thiết bị cần quản trị càng ngày càng lớn. Một người kỹ sư Amazon giờ đây phải quản trị 250 ngàn node (!), so với yêu cầu cách đây 15 năm anh ta chỉ cần quản lý 250 node. Trong thế giới của IoT, làm thế nào chúng ta có thể truy cập và cấu hình xe hơi, đèn, cửa, tủ lạnh, đồ chơi….Rõ ràng, chúng ta cần giao tiếp giữa máy với máy, chúng ta cần network automation!
Do đó, lĩnh vực networking đầy bảo thủ cũng đã bắt đầu cố gắng cải tiến đi theo hướng tự động hóa để đáp ứng nhu cầu thay đổi. Có hai hướng tiếp cận.
Hướng đầu tiên, các người kỹ sư mạng cố gắng tự động hóa các tác vụ quản trị, cấu hình bằng phần mềm nhưng vẫn tận dụng CLI. Họ dùng các Python scripts để cấu hình các thiết bị thông qua CLI trong một phiên telnet/SSH. Ví dụ, một Expect script có thể có dạng tương tác với thiết bị như sau khi cố gắng truy cập vào thiết bị. Script sau đó sẽ cố gắng gửi một tập hợp các lệnh đến CLI sau khi login thành công.
expect "Username: "
send "vnpro"
expect "Password: "
send "vnpro.org"
Cách dùng script dạng này thì cũng hữu dụng. Tuy nhiên nó khó viết, khó phát triển và rất khó để tìm lỗi (troubleshooting). Nếu thiết bị mạng của một hãng cho ra kết quả trả về của một lệnh theo định dạng kiểu khác, người kỹ sư mạng sẽ phải tìm ra sự thay đổi này và sửa đổi các phần script tương ứng. Ngoài ra, nếu trong môi trường hạ tầng gồm nhiều thiết bị của các hãng khác nhau, số script cần viết tăng nhanh tương ứng.
Ở hướng nghiên cứu thứ hai, các kỹ sư mạng tập trung vào việc cải tiến phần giao tiếp giữa các công cụ phần mềm với các thiết bị phần cứng. Phần giao tiếp này có tên gọi là API (Application Programming Interfaces – API). API là một cơ chế giúp phần mềm trên một thiết bị này nói chuyện với phần mềm trên một thiết bị khác. API được dùng rất nhiều trên Internet và trong thế giới của các nhà phát triển ứng dụng, trong thế giới của phần mềm. API hiện diện ở khắp nơi, ngoại trừ trong các thiết bị mạng. Tuy nhiên những năm gần đây, các hãng sản xuất thiết bị mạng viễn thông đều đã chú ý hỗ trợ APIs trong các sản phẩm của mình. Một thiết bị có hỗ trợ giao tiếp APIs sẽ giúp các công cụ phần mềm quản lý truy xuất trực tiếp các thông tin cấu hình, các trạng thái hoạt động và các dòng lưu lượng trên thiết bị.
Tóm tắt: API là giao tiếp giữa phần mềm với phần mềm. Các thiết bị mạng hiện đại hầu hết đều hỗ trợ APIs. API sẽ sớm trở thành một công cụ chủ chốt để cấu hình và quản trị các thiết bị mạng trong một tương lai rất gần. CLI sẽ sớm nghỉ hưu sau hơn 25 năm làm việc.
Một kiểu định nghĩa khác của API
Một router thường có ba chức năng: chức năng tìm đường, định tuyến (control plane), chức năng truyền dữ liệu (data plane) và chức năng quản trị (management plane). Để quản trị router, chúng ta thường telnet/SSH vào router, sau đó dùng CLI. Bên cạnh telnet/SSH, các phần mềm quản trị mạng hiện tại cũng dùng giao thức SNMP để thu thập thông tin về các thành phần của hệ thống mạng. SNMP thật ra cũng được dùng để cấu hình các thiết bị mạng, tuy nhiên tính năng này của SNMP ít được khai thác do khả năng hỗ trợ thay đổi các thông số hoạt động của thiết bị rất hạn chế. Một điểm yếu khác của SNMP là nó không hỗ trợ rollback các đối tượng đã bị thay đổi cấu hình. Hơn nữa, định dạng dữ liệu trả về của SNMP thường rất khó phân tích, phụ thuộc nhiều vào các nhà sản xuất.
Với việc các thiết bị hỗ trợ giao tiếp lập trình API, chúng ta có thêm một cách thức khác để cấu hình, quản trị các thiết bị mạng. Các định dạng kết quả trả về từ việc gọi API đều được chuẩn hóa sao cho các phần mềm và con người đều có thể hiểu được. API giúp cho giao tiếp giữa máy-máy được tốt hơn.
Tóm tắt: API là một bề mặt tương tác mới, là một giao thức mới của management plane, bên cạnh telnet/SSH/SNMP.
Trong mô hình OSI hoặc TCP/IP, lớp ứng dụng thường nằm ở trên cùng. Phần hạ tầng mạng thường nằm ở các lớp thấp nhất. Các ứng dụng ở các tầng trên cao thường dùng TCP/IP để nói chuyện với các thiết bị phần cứng bên dưới. Với việc các thiết bị ngày nay có hỗ trợ giao tiếp API cho phép các ứng dụng kinh doanh nói chuyện trực tiếp với hạ tầng thiết bị, xét về mặt vị trí trong các mô hình mạng, ta có thể mô tả API tựa như một chồng giao thức TCP/IP mới.
Tóm tắt: API là quan trọng ở hiện tại và tương lai, cũng giống như giao thức TCP/IP trong hàng chục năm qua.
Các cách truy cập API trên thiết bị
Có hai cách truy cập API phổ biến trong các thiết bị mạng: dùng http và dùng giao thức NETCONF.
Trong kiểu dùng http, người ta chia thành hai loại con: RESTful API và non-restful. Để giữ bài viết ngắn, chúng ta chỉ cần hiểu rõ loại phổ biến hơn trong lĩnh vực networking là RESTful API.
Đặc điểm của RESTful API là nó hoạt động theo mô hình client-server. Trong mô hình của chúng ta, server là con router hoặc là network controller. Còn client là một chương trình Python scripts, một công cụ như Postman hoặc một ứng dụng WebUI. Vì giao thức http được sử dụng như giao thức lớp truyền dẫn, chúng ta sẽ thực thi các hoạt động truy cập API mà vẫn dùng URL, tựa như khi chúng ta truy cập World Wide Web. Khi chúng ta duyệt web, các hàm http get và http post được thực thi. RESTful API cũng có các hàm chức năng tương tự.
Một đặc tính khác của REST API là REST không có lưu và sử dụng các thông tin trong một phiên truy cập. Nói cách khác, mỗi truy cập REST API không sử dụng kết quả các phiên trước đó, hoạt động theo kiểu stateless. Để so sánh, chúng ta hãy nhớ lại rằng TCP hoạt động theo kiểu stateful. Một kết nối TCP thường dùng các chỉ số tuần tự sequence number và các số ACK# để quản lý dòng chảy của dữ liệu trong một phiên TCP.
Tóm tắt: RESTful API hoạt động theo mô hình client-server và theo kiểu phi trạng thái stateless. Client khi hoạt động trong trạng thái stateless phải gửi hết các dữ liệu cần thiết để máy chủ có thể hiểu và thực thi một tác vụ được yêu cầu trong một lần yêu cầu truy vấn duy nhất.
Kiểu gọi API thứ hai thường thấy trong thiết bị mạng là dùng giao thức NETCONF. Netconf thường hay được so sánh với giao thức SNMP. Netconf cũng được dùng để truy xuất các cấu hình và các dữ liệu trạng thái hoạt động từ các thiết bị mạng. Về phương diện này, NETCONF có ưu điểm hơn SNMP là nó có khả năng tách biệt các dữ liệu dạng cấu hình (là dữ liệu do người kỹ sư nhập vào router) và các dữ liệu hoạt động (là các dữ liệu phát sinh trong quá trình hoạt động của router). NETCONF hoạt động theo mô hình client/server trong đó server là router còn server là trạm quản lý hoặc bộ điều khiển mạng network controller. NETCONF sử dụng các giao thức như SSHv2/TLS để truyền thông điệp giữa client (router) và server (DNA controller). Trong netconf, các dạng dữ liệu kết xuất ra được chuẩn hóa ở dạng XML để cả người và máy đều có thể đọc và hiểu được.
Trong thực tế, để bắt đầu hình trình khám phá các network API trong các thiết bị, chúng ta có thể dùng các công cụ mà không nhất thiết phải biết lập trình. Để truy cập RESTful API, chúng ta có thể dùng các công cụ như cURL hoặc phần mềm Postman. Với netconf, chúng ta có thể thử với Netconf over SSH.
Tóm tắt: RESTful API hoạt động tương tự như giao thức http.NetConf API thì hoạt động trên nền của SSHv2/TLS. API là tính năng quan trọng giúp giao tiếp giữa phần mềm và thiết bị mạng trở nên dễ dàng hơn. Trong tương lai rất gần, thay vì nói "để tôi telnet vào router", chúng ta sẽ nói "Để tôi gọi API của router".
Viết cho cộng đồng Quản trị Mạng – DEVNET
Đặng Quang Minh 2/2020
Đặng Quang Minh 2/2020