netmiko使用時のtextFSM参照に関して

コメント

16件のコメント

  • 正式なコメント
    Permanently deleted user

    弊社側でも確認してみますので、どのような手順で netmiko や textFSM をインストールされたのか、具体的なコマンドレベルでご教示いただけますでしょうか?

    コメントアクション パーマリンク
  • Aki

    申し訳ございません。どのような手順で netmiko や textFSM をインストールしたのかは
    明確ではないのですが、既にインストールされているのは確認しています。
    netmiko自体は正常に作動するので、環境変数のNET_TEXTFSMの指定の仕方に
    問題があるのではと思っています。

    インストールの確認
    # /opt/kompira/bin/pip list | grep netmiko
    netmiko                3.4.0
    # /opt/kompira/bin/pip list | grep text
    textfsm                1.1.3
    textile                4.0.2

    以上よろしくお願いいたします。

    0
    コメントアクション パーマリンク
  • Permanently deleted user

    環境変数 NET_TEXTFSM はどのように指定しましたでしょうか?

    Kompira の Library オブジェクトで定義した関数は、Kompira エンジンプロセスの実行時の環境変数を引き継ぎますので、通常は、NET_TEXTFSM は未定義の状態になるかと思います。

    Libraryオブジェクトの関数の中で、呼び出された直後に、os.environ にで明示的に環境変数をセットする必要があるかと思います。

    なお、Kompira から netmiko を利用したNW機器設定の自動化については、

    https://support.kompira.jp/column/use_netmiko/

    のコラムが参考になるかと思います。

    0
    コメントアクション パーマリンク
  • Aki

    環境変数 NET_TEXTFSM はテンプレートが入っているLinuxの所定のフォルダを指定しています。
    確認のコマンドは下記になります。

    設定の確認
    # echo $NET_TEXTFSM

    このように設定していますが、Libraryにてos.environ で明示的に環境変数をセットする必要があるということでしょうか?

    以上よろしくお願いいたします。

    0
    コメントアクション パーマリンク
  • Permanently deleted user

    ログインユーザのシェルで設定された環境変数と、Kompiraエンジンプロセス上の環境変数は別々のものですので、互いに影響はしません。

    Libraryの関数中にos.environでセットするか、(推奨しないやり方ですが)Kompiraエンジンの起動時に環境変数をセットしてやる必要があります。

    0
    コメントアクション パーマリンク
  • Aki

    os.environでセットしましたが、やはりエラーが出てしまいました。
    Librayのコードを共有しますので原因を教えていただければと思います。
    (セキュリティ上非公開の部分は~になっています。)

    from netmiko import Netmiko 
    import os

    def main():
        #ログイン・コマンドの投入
        result = execute()

        return result

    def execute():
      os.environ["NET_TEXTFSM"] = "/~/~/cisco_nxos_show_interface.textfsm"
        remoteDevice = {
          "username" : "~",
          "password" : "~",
          "ip" : "~",
          "port" : ~,
            "device_type" : "cisco_nxos",
            'auth_timeout': 60
        }
        #機器への接続
        connection = Netmiko(**remoteDevice) 
        #コマンドの実行
      output = "#show interface \n"
        output += connection.send_command("show interface",use_textfsm=True)
        #切断
        connection.disconnect()
        
        return output

    エラーメッセージは

    ValueError: 
    Directory containing TextFSM index file not found.

     

    以上よろしくお願いいたします。

    0
    コメントアクション パーマリンク
  • Permanently deleted user

    NET_TEXTFSM 環境変数にはテンプレートが含まれるディレクトリをセットする必要がありそうですが、直接テンプレートのファイルパスを指定しているのがエラーの原因ではないでしょうか?

     

    0
    コメントアクション パーマリンク
  • Aki

    NET_TEXTFSM 環境変数にはテンプレートが含まれるディレクトリをセットしましたが、同じようなエラーが発生してしまいました。お手数をおかけしますが、原因を教えていただければと思います。

    以上よろしくお願いいたします。

    0
    コメントアクション パーマリンク
  • Permanently deleted user

    弊社側で共有頂いた Library コードを元に作成して確認してみましたが、問題無く実行できたので、何かしら環境の問題があるのかもしれません。

    以下をご確認いただけますでしょうか

    • NET_TEXTFSM の指定先のディレクトリは KE本体 をインストールしたLinuxサーバ上に存在しているか
    • 上記ディレクトリは、KEをインストールした Linux サーバ上の kompiraユーザーからアクセス可能なように権限が許可されているか

    また、お使いのKEのバージョンはいくつになりますでしょうか?

    0
    コメントアクション パーマリンク
  • Aki

    Kompiraのバージョンは1.6.7post1になっております。

    以上よろしくお願いいたします。

    0
    コメントアクション パーマリンク
  • Permanently deleted user

    バージョンのご確認ありがとうございます。

    弊社側で確認したバージョンは 1.6.8.post1 になりますが、今回の動作に関連しそうなライブラリオブジェクトの変更はございませんので、バージョンは関係ないかと思います。

    やはり、Kompiraエンジンプロセスから、NET_TEXTFSM に指定したパスにアクセスできていない可能性が高いため、パスやパーミッションをご確認いただけますでしょうか?

    0
    コメントアクション パーマリンク
  • Aki

    申し訳ございません。パスやパーミッションを確認しましたが正常に作動しませんでした。
    もしその他に思い当たる要因がありましたら、ご連絡お願いします。

    0
    コメントアクション パーマリンク
  • Permanently deleted user

    まずは、Kompiraエンジンプロセスからテンプレートファイルを読み込めるかどうかを確認して、問題の切り分けをした方が良いかと思います。

    以下のような Python の関数を定義したライブラリ型オブジェクトを作成して、ジョブフローから呼び出してみて、正しく内容が取得できるかご確認できますでしょうか?

    def check_template():
    with open("/~/~/cisco_nxos_show_interface.textfsm") as f:
    text = f.read()
    return text

     

    0
    コメントアクション パーマリンク
  • Aki

    ご確認ありがとうございます。
    以下の結果が表示されましたので、内容は正しく取得できているかと思われます。

    Value Required INTERFACE (\S+)
    Value LINK_STATUS (.+?)
    Value ADMIN_STATE (.+?)
    Value HARDWARE_TYPE (.*)
    Value ADDRESS ([a-zA-Z0-9]+.[a-zA-Z0-9]+.[a-zA-Z0-9]+)
    Value BIA ([a-zA-Z0-9]+.[a-zA-Z0-9]+.[a-zA-Z0-9]+)
    Value DESCRIPTION (.*)
    Value IP_ADDRESS (\d+\.\d+\.\d+\.\d+\/\d+)
    Value MTU (\d+)
    Value MODE (\S+)
    Value DUPLEX (.+duplex?)
    Value SPEED (.+?)
    Value INPUT_PACKETS (\d+)
    Value OUTPUT_PACKETS (\d+)
    Value INPUT_ERRORS (\d+)
    Value OUTPUT_ERRORS (\d+)
    Value BANDWIDTH (\d+\s+\w+)
    Value DELAY (\d+\s+\w+)
    Value ENCAPSULATION (\w+)
    Value LAST_LINK_FLAPPED (.+?)
    
    Start
      ^\S+\s+is.+ -> Continue.Record
      ^${INTERFACE}\s+is\s+${LINK_STATUS},\sline\sprotocol\sis\s${ADMIN_STATE}$$
      ^${INTERFACE}\s+is\s+${LINK_STATUS}$$
      ^admin\s+state\s+is\s+${ADMIN_STATE},
      ^\s+Hardware(:|\s+is)\s+${HARDWARE_TYPE},\s+address(:|\s+is)\s+${ADDRESS}(.*bia\s+${BIA})*
      ^\s+Description:\s+${DESCRIPTION}
      ^\s+Internet\s+Address\s+is\s+${IP_ADDRESS}
      ^\s+Port\s+mode\s+is\s+${MODE}
      ^\s+${DUPLEX}, ${SPEED}(,|$$)
      ^\s+MTU\s+${MTU}.*BW\s+${BANDWIDTH}.*DLY\s+${DELAY}
      ^\s+Encapsulation\s+${ENCAPSULATION}
      ^\s+${INPUT_PACKETS}\s+input\s+packets\s+\d+\s+bytes\s*$$
      ^\s+${INPUT_ERRORS}\s+input\s+error\s+\d+\s+short\s+frame\s+\d+\s+overrun\s+\d+\s+underrun\s+\d+\s+ignored\s*$$
      ^\s+${OUTPUT_PACKETS}\s+output\s+packets\s+\d+\s+bytes\s*$$
      ^\s+${OUTPUT_ERRORS}\s+output\s+error\s+\d+\s+collision\s+\d+\s+deferred\s+\d+\s+late\s+collision\s*$$
      ^\s+Last\s+link\s+flapped\s+${LAST_LINK_FLAPPED}\s*$$
    0
    コメントアクション パーマリンク
  • Permanently deleted user

    弊社側であらためて以下の手順で再度確認してみたところ、問題無く取得できましたので、御社の環境でも同じて手順で実施して上手くいくかどうか試してみていただけますでしょうか?

    (1) KEにrootユーザでSSHログインして、/tmp に ntc-templates をgit クローンする

    # cd /tmp
    # git clone https://github.com/networktocode/ntc-templates

    (2) 以下のライブラリオブジェクトを /root/net という名前で作成する(ユーザ名とパスワード、IPアドレスは適宜置き換えてください)

    from netmiko import Netmiko
    import os

    def execute():
        os.environ["NET_TEXTFSM"] = "/tmp/ntc-templates/ntc_templates/templates"
        remoteDevice = {
          "username" : "<ユーザ名>",
          "password" : "<パスワード>",
          "ip" : "<IPアドレス>",
            "port" : 22,
            "device_type" : "cisco_nxos",
            'auth_timeout': 60
        }
        #機器への接続
        connection = Netmiko(**remoteDevice)
        #コマンドの実行
        output = "{host}#show interface \n"
        ret = connection.send_command("show interface", use_textfsm=True)
        #切断
        connection.disconnect()
        return ret

    (3) netオブジェクトと同じディレクトリの場所に、以下のジョブフロー(/root/job)を作成する

    [./net.execute] ->
    [result = $RESULT] ->
    print(result) ->
    return(result)

    (4) (3)で作成したジョブフロー(/root/job) を実行する

    以下のような結果がコンソールに出力されました

    [{'interface': 'BRI0', 'link_status': 'administratively down', 'admin_state': ...

     

    0
    コメントアクション パーマリンク
  • Aki

    解決しました。ありがとうございます!

    0
    コメントアクション パーマリンク

サインインしてコメントを残してください。