Slide 1

Slide 1 text

0 network_cli プラグイン と Playbookで指定できる文字について の話 Ansible Night in Tokyo 2019.07

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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]?[¥w@+¥-¥.:¥/¥[¥]]+[>#%] ?$"), ] terminal_stdout_re = [ re.compile(br"[¥r¥n]?[¥w+¥-¥.:¥/¥[¥]]+(?:¥([^¥)]+¥)){,3}(?:>|#) ?$"), re.compile(br"¥@[¥w¥-¥.]+:¥S+?[>#¥$] ?$") ] ios junos vyos

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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から指定 「期待するプロンプト」 が出力されるまで受信

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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