NETCONFを転用して、 設定ファイルエディターをつくる話 / Config Editor Implementation with NETCONF or YANG

NETCONFを転用して、 設定ファイルエディターをつくる話 / Config Editor Implementation with NETCONF or YANG

JANOG43 の発表スライドです。

NETCONFを使えば、ネットワークデバイスから様々な情報を取得できます。設定データのスキーマ(文法) もそのひとつです。

このトークでは、NETCONFのスキーマ定義からCLI文法の抽象構文木を構築し、ネットワークデバイス向けの設定ファイルエディターをつくる方法を紹介します。

今回選んだスキーマは 100MB / 230万行におよびますが、このように作成することで細やかなキーワード補完 / 文法チェック / シンタックスハイライト が可能です。
NETCONF本来の目的とは違った方向への転用ですが、非常に便利です。

また、サンプルとしてLanguage Serverを実装しました。Visual Studio Codeによる実装ですが、vimやemacsなど多種多様なエディターをサポートできる可能性についても言及します。

デモ: https://www.youtube.com/watch?v=ZAonHbRVtz8

A31d1c25ddaa3692377a488f0b64ef2b?s=128

Shintaro Kojima

January 21, 2019
Tweet

Transcript

  1. /&5$0/'Λస༻ͯ͠ɺ ઃఆϑΝΠϧΤσΟλʔΛͭ͘Δ࿩ גࣜձࣾίʔμϯε 4IJOUBSP,PKJNB!DPEFPVU

  2. ʮΤσΟλʔ͕͋ͬͨΒʜʯͬͯࢥͬͨ͜ͱ͋Γ·ͤΜ͔ʁ ɹ࣮ػʹϩάΠϯ͠ͳͯ͘΋ w ิ׬͕ޮ͘ w จ๏νΣοΫͰ͖Δ w l(PUP%FpOJUJPOzͰ͖Δ ɹͦΕɺ/&5$0/':"/(ͰͰ͖·͢ʂʂ ίϯϑΟάɺखͰॻ͍͍ͯ·͔͢ʁ

    !2
  3. /&5$0/'ࣗମ͸9.-31$ɻ ίϚϯυ9.-͸ɺϕϯμʔಠࣗͷ9.-εΩʔϚ 94% Ͱ จ๏νΣοΫ͞ΕΔɻ NETCONF / YANG <?xml version…>

    <rpc/> <xsd:schema …/> NETCONF over SSH !3
  4. :"/(͸/&5$0/'Ͱ࢖ΘΕΔσʔλϞσϧͰ͋Γɺ ʮ9.-εΩʔϚΛڞ௨ݴޠͰهड़ͨ͠΋ͷʯͱݴ͑Δɻ NETCONF / YANG https://www.janog.gr.jp/meeting/janog36/application/files/7714/3662/8399/janog36-netconf-shishio-03.pdf !4

  5. XSD(NETCONF) / YANG vs. CLI <?xml version…> <rpc/> <xsd:schema …/>

    or yang text NETCONF CLI !5
  6. XSD(NETCONF) / YANG vs. CLI <?xml version…> <rpc/> <xsd:schema …/>

    or yang text NETCONF CLI ͜͜ͷߏ଄͕ ࣅ͍ͯΔͨΊ !6
  7. NETCONF / YANG vs. CLI <?xml version…> <rpc/> <xsd:schema …/>

    or yang text NETCONF CLI จ๏ͷ஫ೖ͕Մೳ !7
  8. <xsd:complexType name="interfaces-type"> <xsd:sequence> <xsd:element name="name"> <xsd:complexType> <xsd:simpleContent> <xsd:restriction base="key-attribute-string-type"> <xsd:enumeration

    value="$junos-interface-ifd-name"> </xsd:enumeration> <xsd:enumeration value="interface-name"> </xsd:enumeration> </xsd:restriction> </xsd:simpleContent> </xsd:complexType> </xsd:element> <!-- </name> --> <xsd:element name="unit" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="name"> <xsd:complexType> <xsd:simpleContent> <xsd:restriction base="xsd:anyType"> <xsd:simpleType> <xsd:union memberTypes="xsd:unsignedLong"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="$junos-underlying- interface-unit"> XSD (NETCONF) set interfaces <name> unit <number> CLI +6/04ͷྫ !8 OBNF VOJU
  9. grouping interfaces_type { description "Physical interface"; leaf name { type

    string; } list unit { key name; description "Logical interface"; leaf name { type string; } list unit { key name; description "Logical interface"; leaf name { type string; } YANG set interfaces <name> unit <number> CLI +6/04ͷྫ !9
  10.  94%ͷऔಘ w <get-schema/>ίϚϯυ /&5$0/'   ΋͘͠͸ɺ:"/(Ϟσϧऔಘ w ϕϯμʔ͕ެ։͍ͯ͠Δ

     PSΛύʔεͯ͠ந৅ߏจ໦Λͭ͘Δ w ೚ҙͷ$-*֊૚Ͱɺଓ͘ҰஈԼͷΩʔϫʔυ ࢬ Ϧετ͕औΕΔ w ิ׬ɾจ๏νΣοΫ͕Ͱ͖Δ  ΤσΟλʔΛ࣮૷͢Δ ΤσΟλʔͷ࡞Γ͔ͨ ֓ཁ !10
  11. +VOPTͷࢀߟ࣮૷ WTDPEF֦ு • https://github.com/codeout/vscode-junos • https://marketplace.visualstudio.com/items? itemName=codeout.vscode-junos w lKVOPTzͰݕࡧ!7JTVBM4UVEJP$PEF codeout/vscode-junos

    !11
  12. wWTDPEFKVOPT͸-41Ͱ࣮૷ w WTDPEF্ͷΫϥΠΞϯτ  WTDPEFҎ֎ͱ΋࿩ͤΔݴޠαʔ όʔ w 7JN΍&NBDTͳͲɺଞΤσΟ λʔ΋ରԠՄೳ ͨͿΜ

     w 7JNྗ͕௿͗ͯ͢ͳ͔ͳ͔ਐ·ͳ͍ʜ ༨ஊ-BOHVBHF4FSWFS1SPUPDPM -41 !12
  13. w/&5$0/':"/(Λస༻͢ΔͱɺϢʔβʔଆͰ
 ίϯϑΟάΤσΟλʔΛ࡞ΕΔ wίϯϑΟά࡞੒ίετ͕͔ͳΓԼ͕ͬͨ wΈͳ͞·͕͓࢖͍ͷػثͰ΋ɺͰ͖Δؾ͕͠·ͤΜ͔ʁ wʮ໘നͦ͏ʯʮ΍ͬͯΈΑ͏ʯͱࢥΘΕΔํ͕͍Βͬ ͠ΌΕ͹خ͍͠Ͱ͢ ಈ͍ͨΒੋඇެ։Λʜʂ ·ͱΊ !13