Upgrade to Pro — share decks privately, control downloads, hide ads and more …

network_cli_and_playbook

 network_cli_and_playbook

Ansible Night in Tokyo 2019-07 のLT資料

naka-shin1

July 29, 2019
Tweet

More Decks by naka-shin1

Other Decks in Technology

Transcript

  1. 0
    network_cli プラグイン

    Playbookで指定できる文字について
    の話
    Ansible Night in Tokyo 2019.07

    View Slide

  2. 1
    自己紹介
    1
    名前 :中山 真一 ( @naka_shin1 )
    所属 :セイコーソリューションズ株式会社
    職種 :S/W 開発(担当製品のNW機器開発)
    興味 :運用自動化、外部API(Ansible、Netconf、RestAPI)など
    自社製品の運用自動化対応をテーマに活動しています。

    View Slide

  3. 2
    背景
    先日 担当製品について、Ansible に対応しました!
    Ansible コミュニティから発信される情報にはたくさん助けて頂きました!
    今回は開発中に得た情報について共有させて頂ければと思います。

    View Slide

  4. 3
    内容
    ◆コンソールサーバについて 今日は割愛
    ◆network_cli プラグインについて Ansible内部の動作について(やや技術的)
    ◆Playbook で指定できる文字について 開発時に得たノウハウの共有
    ネットワーク 初心者向け Playbookまわり
    ※事前に展開されていた
    Ansible Nightで寄せられた取り上げてほしいコンテンツ一覧(2018年~2019年前半)
    https://rheb.hatenablog.com/entry/ansiblenight_survey_2018-2019
    のカテゴリで言うと
    を意識した内容となります。

    View Slide

  5. 4
    network_cli プラグインについて
    Ansible Night in Tokyo 2019.07

    View Slide

  6. 5
    network_cli プラグインについて
    ①Ansibleホストから、SSHを介してNW機器に接続する
    - ansible_network_os で指定された情報から 参照するプラグイン(NW機器ベンダー)を判別
    - 接続後、「期待するプロンプト」を待つ
    - NWベンダー毎に定義された初期コマンドを実行(terminal length 0 とか)
    ②Playbookで指定されたコマンドを CLI で実行
    - コマンド実行後、NW機器ベンダー毎に異なる「期待するプロンプト」が返ってくるまで受信する
    - コマンド実行結果がエラーかどうかは 「エラー定義」に含まれる文字列をチェック
    ③コマンド実行結果を stdout(stdout_lines)に格納して返す
    SSH接続
    (network_cli)

    View Slide

  7. 6
    network_cli プラグインについて
    NWベンダー毎に異なる「期待するプロンプト」とは?
    各ベンダー毎のプラグイン内で期待するプロンプト情報が正規表現で定義されている。
    そのままだと分かりずらいので、正規表現の可視化サイトなどで確認すると人間に優しくなります。
    ansible
    plugins
    terminal
    modules
    ios.py
    junos.py
    vyos.py
    terminal_stdout_re = [
    re.compile(br"[¥r¥n]?[¥w¥+¥-¥.:¥/¥[¥]]+(?:¥([^¥)]+¥)){0,3}(?:[>#]) ?$")
    ]
    terminal_stdout_re = [
    re.compile(br"[¥r¥n]?[¥[email protected]+¥-¥.:¥/¥[¥]]+[>#%] ?$"),
    ]
    terminal_stdout_re = [
    re.compile(br"[¥r¥n]?[¥w+¥-¥.:¥/¥[¥]]+(?:¥([^¥)]+¥)){,3}(?:>|#) ?$"),
    re.compile(br"¥@[¥w¥-¥.]+:¥S+?[>#¥$] ?$")
    ]
    ios
    junos
    vyos

    View Slide

  8. 7
    network_cli プラグインについて
    NWベンダー毎に異なる「エラー定義」とは?
    各ベンダー毎のプラグイン内でエラー判定する文字列が正規表現で定義されている。
    ansible
    plugins
    terminal
    modules
    ios.py
    junos.py
    vyos.py
    terminal_stderr_re = [
    re.compile(br"% ?Error"),
    re.compile(br"% ?Bad secret"),
    re.compile(br"[¥r¥n%] Bad passwords"),
    re.compile(br"invalid input", re.I),
    re.compile(br"(?:incomplete|ambiguous) command", re.I),
    re.compile(br"connection timed out", re.I),
    re.compile(br"[^¥r¥n]+ not found"),
    re.compile(br"'[^']' +returned error code: ?¥d+"),
    re.compile(br"Bad mask", re.I),
    re.compile(br"% ?(¥S+) ?overlaps with ?(¥S+)", re.I),
    re.compile(br"[%¥S] ?Error: ?[¥s]+", re.I),
    re.compile(br"[%¥S] ?Informational: ?[¥s]+", re.I),
    re.compile(br"Command authorization failed")
    ]
    terminal_stderr_re = [
    re.compile(br"¥n¥s*Invalid command:"),
    re.compile(br"¥nCommit failed"),
    re.compile(br"¥n¥s+Set failed"),
    ]
    ios
    vyos

    View Slide

  9. 8
    network_cli プラグインについて
    smartcs_command:
    commands:
    - show version
    Playbook
    (0)NS-2250> show version
    System : System Software Ver 2.0
    Boot Status : Reboot (05:80:00)
    System Up Time : 2019/07/11 14:48:14
    Local MAC Address : 08:00:83:ff:4c:ac
    Number of MAC Address : 2
    Model : NS-2250-48 (48 port)
    Serial No. : 00000003
    BootROM : Ver 1.0
    Main Board CPU : e500v2 (533.333328MHz)
    Main Memory : 1025264 KBytes
    Boot System : main (Ver 2.0)
    Boot Config : external startup1
    Main System : Ver 2.0
    Backup System : Ver 2.0
    (0)NS-2250>
    SSHログイン後、CLI実行
    赤字部分が、コマンド実行結果として
    stdout(stdout_lines)に格納され、
    返される。
    「エラー定義文字列」を検出したら
    エラー(failed)となる。
    Playbookから指定
    「期待するプロンプト」
    が出力されるまで受信

    View Slide

  10. 9
    Playbookで指定できる文字について
    Ansible Night in Tokyo 2019.07

    View Slide

  11. 10
    Playbook で指定できる文字について
    network_cli プラグインを使った処理における、エラーの考え方
    SSH接続
    (network_cli)
    NW機器
    Playbookのエラー、network_cli のエラー
    Playbook
    Playbook
    読み込み
    ・期待したプロンプトが戻らない
    ・受信結果にエラー定義が含まれている
    - CLIコマンドがそもそも間違っている
    - 表示コマンドのエラー
    - 範囲ミス、構文ミス
    - 設定コマンドのエラー
    - 範囲ミス、構文ミス、登録済み、など
    ・モジュールが判断するエラー
    ・YAMLの文法ミス
    「ERROR! Syntax Error while loading YAML.」
    Error Error
    今から話す部分

    View Slide

  12. 11
    Playbook で指定できる文字について
    ・担当製品のCLIコマンドが、Playbook経由で全て実行できるかを確認したい。
    ・そもそも Playbook 経由で 全ての文字種が送れるのかどうかを知りたい。
    調査のきっかけ
    調査文字種
    0x20~0x7E までの、いわゆる可視化文字
    ※Ctrl+C 等の制御文字は、Playbook経由では送信できない。
    SPACE ! “ # $ % & ‘ ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ¥ ] ^ _ `
    a b c d e f g h I j k l m n o p q r s t u v w x y z { | } ~
    調査環境
    ・Ansible 2.7.10
    ・Python 3.6.8

    View Slide

  13. 12
    Playbook で指定できる文字について
    smartcs_command:
    commands:
    - !#"$%&'()*+,-./0123456789:;<=>[email protected] BCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghIjklmnopqrstuvwxyz{|}~
    送信文字列
    Playbook
    !#"$%&'()*+,-./0123456789:;<=>[email protected] BCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghIjklmnopqrstuvwxyz{|}~
    smartcs_command:
    commands:
    - ‘!#"$%&'()*+,-./0123456789:;<=>[email protected] BCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghIjklmnopqrstuvwxyz{|}~’
    smartcs_command:
    commands:
    - “!#"$%&'()*+,-./0123456789:;<=>[email protected] BCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghIjklmnopqrstuvwxyz{|}~”
    そのまま
    ダブルクォーテーション囲み
    シングルクォーテーション囲み
    SPACE

    View Slide

  14. 13
    Playbook で指定できる文字について
    結果
    smartcs_command:
    commands:
    - ‘!#"$%&''()*+,-./0123456789:;<=>[email protected] BCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghIjklmnopqrstuvwxyz{|}~’
    - “!#¥"$%&'()*+,-./0123456789:;<=>[email protected] BCDEFGHIJKLMNOPQRSTUVWXYZ[¥¥]^_`abcdefghIjklmnopqrstuvwxyz{|}~”
    ダブルクォーテーション(0x22)には
    エスケープ(バックスラッシュ)が必要
    指定方法 ポイント
    そのまま指定 色々送れない
    シングルコーテーション囲み シングルクォーテーションで囲んだ場合、シングルクォーテーションは送れない
    シングルクォーテーションにエスケープ必要(シングルクォーテーション)
    ダブルコーテーション囲み ダブルクォーテーションにエスケープ必要(バックスラッシュ)
    バックスラッシュにエスケープ必要(バックスラッシュ)
    バックスラッシュ(0x5c)には
    エスケープ(バックスラッシュ)が必要
    シングルクォーテーション(0x27)には
    エスケープ(シングルクォーテーション)が必要
    ・ダブルクォーテーション もしくは、シングルクォーテーション で囲む事で送信可能。
    ※ただしエスケープが必要な文字が異なる。
    弊社調べ

    View Slide

  15. 14
    network_cli プラグインについて
    - OSを指定するだけで、中のプラグインが頑張ってくれています。
    - 処理を読み解くには正規表現が読めるようになる事が大事です。
    Playbookで指定できる文字について
    - 奥が深い 今回は jinja2 の領域までは踏み込みませんでした。
    - 間違ってたらスイマセン。
    Ansible Night in Tokyo 2019.07
    まとめ
    ご清聴ありがとうございました。

    View Slide