Netconf/YANG protocol

YANG chỉ là bản thiết kế, XML là dữ liệu cấu hình, NETCONF gửi dữ liệu đi, Python giúp tự động hóa quá trình này.

Thành phầnVai trò cụ thể
YANGChỉ là mô hình dữ liệu – giúp trực quan hóa thông tin sẽ cấu hình (không thực hiện lệnh).
XMLCách thể hiện dữ liệu dựa trên YANG khi gửi qua NETCONF.
NETCONFGiao thức giúp truyền XML giữa client và thiết bị mạng.
PythonCông cụ giúp tự động hóa việc gửi XML qua NETCONF.

Giả sử ta cần cấu hình VLAN trên switch

Viết mô hình YANG (Chỉ là bản thiết kế, không có tác dụng tự cấu hình)

module vlan-config {
  namespace "urn:example:vlan";
  prefix "vlan";

  container vlans {
    list vlan {
      key "id";
      leaf id {
        type uint16;
      }
      leaf name {
        type string;
      }
      leaf-list interfaces {
        type string;
      }
    }
  }
}

Định nghĩa rằng VLAN có: id, name, danh sách các interface thuộc VLAN đó.

YANG không thực hiện gì cả, chỉ mô tả mô hình dữ liệu.

Biểu diễn dữ liệu bằng XML (Thực sự gửi đi)

Bây giờ, ta muốn cấu hình VLAN 100 trên FastEthernet0/6, ta dùng XML dựa trên mô hình YANG:

<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <edit-config>
    <target>
      <running/>
    </target>
    <config>
      <vlans xmlns="urn:example:vlan">
        <vlan>
          <id>100</id>
          <name>VLAN_100</name>
          <interfaces>FastEthernet0/6</interfaces>
        </vlan>
      </vlans>
    </config>
  </edit-config>
</rpc>

XML chính là nội dung yêu cầu cấu hình thiết bị.

Gửi XML bằng Python qua NETCONF

Thay vì nhập XML thủ công, ta dùng Python để gửi lệnh NETCONF đến thiết bị.

from ncclient import manager

# Kết nối đến switch hỗ trợ NETCONF
m = manager.connect(
    host="192.168.1.1",  # IP thiết bị
    port=830,  # Cổng NETCONF
    username="admin",
    password="admin",
    hostkey_verify=False
)

# XML chứa cấu hình VLAN cần gửi
vlan_config = """<rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <edit-config>
    <target>
      <running/>
    </target>
    <config>
      <vlans xmlns="urn:example:vlan">
        <vlan>
          <id>100</id>
          <name>VLAN_100</name>
          <interfaces>FastEthernet0/6</interfaces>
        </vlan>
      </vlans>
    </config>
  </edit-config>
</rpc>"""

# Gửi cấu hình VLAN qua NETCONF
response = m.edit_config(target="running", config=vlan_config)

print(response)

Python gửi XML đến thiết bị qua NETCONF. Thiết bị nhận lệnh và áp dụng cấu hình VLAN.

Python chỉ giúp tự động hóa việc gửi XML, không thay đổi cách NETCONF hoạt động.

Kiểm tra cấu hình VLAN bằng NETCONF

Sau khi gửi lệnh, ta cần kiểm tra VLAN đã được cấu hình chưa.

  • Yêu cầu kiểm tra VLAN bằng (XML):
<rpc message-id="102" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <get-config>
    <source>
      <running/>
    </source>
    <filter type="subtree">
      <vlans xmlns="urn:example:vlan"/>
    </filter>
  </get-config>
</rpc>

  • Thiết bị sẽ phản hồi bằng XML nếu VLAN đã được cấu hình:
<rpc-reply message-id="102" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <data>
    <vlans xmlns="urn:example:vlan">
      <vlan>
        <id>100</id>
        <name>VLAN_100</name>
        <interfaces>FastEthernet0/6</interfaces>
      </vlan>
    </vlans>
  </data>
</rpc-reply>