24
ネネネネネネネネネネネネネネネネネネネ ( ネ ) ネネネネネネネネネ ネネネネ 1 NetOpsCoding#4 発発発発

Net opscoding#4発表資料

Embed Size (px)

Citation preview

Page 1: Net opscoding#4発表資料

ネットワーク機器運用自動化の傾向と対策

( 株 ) フィックスポイント服部健太

1NetOpsCoding#4 発表資料

Page 2: Net opscoding#4発表資料

フィックスポイントについて

• 事業内容– システム運用自動化ツール

「 Kompira 」の開発– 運用自動化導入サービス– コンサルティングサービス

• 所在:東京都渋谷区• 設立:2013年4月• 社員数:9名(役員含む)

http://www.fixpoint.co.jp

2NetOpsCoding#4 発表資料

Page 3: Net opscoding#4発表資料

Kompira の概要

3

• 運用自動化のためのプラットフォーム– オペレータはサーバに対するコマンド実行手順をジョブフローとして記述し、

それを Kompira サーバ上で実行する– Bash や Ruby 、 Python 、 Expect など各種スクリプトファイルを登録して、

ジョブフローから呼び出すこともできる– 簡単な入力フォームなども Kompira 上に作成できる

NetOpsCoding#4 発表資料

Page 4: Net opscoding#4発表資料

NW 運用部隊に対する様々な作業依頼

4

PUSH 配信システム間通信のために、FW の穴あけ作業お願いします

○○ 拠点の機器入れ替えに伴って、ルーティング変更作業お願いします

開発サーバリプレースのため、NAT の設定変更お願いします

シンクライアント端末への接続ユーザを変更するため、FW ポリシールールの変更お願いします

新規にサーバ構築するので、LB 、 FW の設定追加お願いします

リプレースに伴いサーバ追加するので、LB の既存 pool にノード追加してください

SSL サーバ証明書の更新作業お願いします

NetOpsCoding#4 発表資料

Page 5: Net opscoding#4発表資料

従来の運用

5

作業実施

作業依頼メールを受け取ると、依頼内容にもとづいて Excelで作業手順書を作成し、承認

を受ける

作業当日、承認済みの作業手順書にもとづいて、NW 機器にアクセスし、手作業で設定変更を行う

作業準備

NetOpsCoding#4 発表資料

Page 6: Net opscoding#4発表資料

そうだ!自動化しよう!

6

• いちいち詳細な Excel の作業手順書を書くくらいなら、設定変更のスクリプト書いて、自動実行した方が楽なのでは?

⇒ 現場の作業担当者はノンプログラマーなので、スクリプトを書くのは無理っぽい。。。

⇒ 責任者もノンプログラマーなので、スクリプトを見せられても、承認していいか分からん。。。

ノンプログラマーが読み書きできて、プログラムからも自動実行できるような手順書が無いものか。。。

NetOpsCoding#4 発表資料

Page 7: Net opscoding#4発表資料

Excel 手順書から YAML 手順書へ

7

対象機器 : - FP-TEST-SSG5-1設定手順 : - アドレス作成 : ゾーン : Untrust 名前 : TEST_ADDR1 アドレス : 1.2.3.4/32 - アドレス作成 : ゾーン : Untrust 名前 : TEST_ADDR2 アドレス : 192.168.1.0/24 - アドレスグループ作成 : ゾーン : Untrust 名前 : TEST_ADDR_GRP アドレス : - TEST_ADDR1 - TEST_ADDR2 - ポリシー追加 : FROM ゾーン : Untrust TO ゾーン : Trust サービス : ANY 送信元アドレス : TEST_ADDR_GRP アクション : 許可 送信元 NAT:

NetOpsCoding#4 発表資料

Page 8: Net opscoding#4発表資料

YAML 手順書の細かな工夫

8

• 日本語のキーワードを使うことで可読性アップ– TargetDevice ⇒ 対象機器– CreateVirtualServer ⇒ 仮想サーバ作成– AddPolicy ⇒ ポリシー追加– …

• キーワードの表記ゆれに対応することで、より気楽に記述可能(だいたい合ってりゃ OK )– 仮想サーバ作成– 仮想サーバー作成– バーチャルサーバ作成– バーチャルサーバー作成– …

NetOpsCoding#4 発表資料

Page 9: Net opscoding#4発表資料

Kompira による自動運用

9

作業実施

作業準備 作業依頼メールを受け取ると、依頼内容にもとづいて YAML手順書を作成し、 Kompira

サーバに登録し、承認を受ける

作業予定時刻になると、Kompira が YAML 手順書にしたがって、設定変更

作業を自動実行

NetOpsCoding#4 発表資料

Page 10: Net opscoding#4発表資料

Kompira 上に作成した登録画面

NetOpsCoding#4 発表資料 10

YAML 手順書を入力

設定変更の実行日時を指定

Page 11: Net opscoding#4発表資料

YAML 手順書から設定変更までの流れ

NetOpsCoding#4 発表資料 11

現時点では、Juniper SSG

F5 BIG-IPに対応

入力された YAML 手順書の内容が意味的に正しいかどうか、現在の設定情報をもとにチェック

Page 12: Net opscoding#4発表資料

ネットワーク機器運用自動化の壁

12

• CLI の壁– SSG は API が無いので、設定情報の取得や変更を CLI経由で行う必要あ

り– BIG-IP は、良くできた( SOAP ) API が提供されている。😊

• bigsuds ( https://github.com/F5Networks/bigsuds)を使用

• Telnet の壁– 機器によっては、 Telnet でしかアクセスできないので Expect で何とかす

る必要あり– 踏み台ルータ経由によるアクセス

• 冗長構成( Active-Standby )の壁– 冗長構成を組んでいる場合、設定投入はアクティブ側に対してのみ行う必要あり

• 設定リカバリ(切り戻し)の壁– コンフィグファイルのアップロードによるリカバリは、数分間の通信断

が発生するため最終手段とする– 投入したコマンドの逆コマンドを実行して切り戻す必要がある

NetOpsCoding#4 発表資料

Page 13: Net opscoding#4発表資料

CLI の壁(設定情報取得編)

NetOpsCoding#4 発表資料 13

• get config コマンドで取得した情報をパースして、設定情報の辞書データを構築

• SSG のコマンドリファレンスとにらめっこしながら Python で頑張って実装– コマンドの基本的な字句解析処理は shlex ライブラリを利用

unset key protection enableset clock timezone 0set vrouter trust-vr sharableset vrouter "untrust-vr"exitset vrouter "trust-vr"unset auto-route-exportexitunset auto-route-exportset preference nhrp 100set preference ospf-e2 254exitset alg appleichat enableunset alg appleichat re-assembly enableset alg sctp enable・・・

get config 実行結果:Zones

Trust

Untrust

DMZ

FixpointManage

Interfaces

eth0/1• 0.0.0.0• Trust

eth0/2• 10.1.2.0/24• FixpointManage

bgroup0• 192.168.1.0/24• DMZ

vlan1• 11.22.33.0/24• VLAN

Policies

Id1• Trust Untrust⇒• HTTP• Deny

Id2• Untrust Untrust⇒• FTP• Permit

Id3• Untrust Untrust⇒• SSH• Permit

Id4• Untrust Trust⇒• SSH• Reject

必要な設定情報の辞書データ:…

Page 14: Net opscoding#4発表資料

CLI の壁(コマンド生成編)

NetOpsCoding#4 発表資料 14

• YAML の手順書から SSG の設定コマンドを生成対象機器 :

- FP-TEST-SSG5-1設定手順 : - アドレス作成 : ゾーン : Untrust 名前 : TEST_ADDR1 アドレス : 1.2.3.4/32 - アドレス作成 : ゾーン : Untrust 名前 : TEST_ADDR2 アドレス : 192.168.1.0/24 - アドレスグループ作成 : ゾーン : Untrust 名前 : TEST_ADDR_GRP アドレス : - TEST_ADDR1 - TEST_ADDR2 - ポリシー追加 : FROM ゾーン : Untrust TO ゾーン : Trust サービス : ANY 送信元アドレス : TEST_ADDR_GRP アクション : 許可 送信元 NAT:

set address "Untrust" "TEST_ADDR1" 1.2.3.4/32set address "Untrust" "TEST_ADDR2" 192.168.1.0/24set group address "Untrust" "TEST_ADDR_GRP"set group address "Untrust" "TEST_ADDR_GRP" add "TEST_ADDR1"set group address "Untrust" "TEST_ADDR_GRP" add "TEST_ADDR2“set policy id 1 from “Untrust” to “Trust” “TEST_ADDR_GRP”     "Any" "ANY" nat src permit

OperationStep

CreateAddress CreateAddress CreateAddrGroup

Zone Name

AddPolicy

Untrust TEST_ADDR1

Address

192.168.1.0/24

・・・ ・・・ ・・・

①YAML をパースして構文木を作成

②構文木を辿って設定コマンド文字列を生成

Page 15: Net opscoding#4発表資料

Telnet の壁

NetOpsCoding#4 発表資料 15

コマンドの実行結果とプロンプトを分離したい

プロンプトが途中で変わる場合がある

コマンドの実行失敗に対処する必要がある

Page 16: Net opscoding#4発表資料

単純なプロンプトマッチに失敗する例

NetOpsCoding#4 発表資料 16

ssg5-isdn-> get route

IPv4 Dest-Routes for <untrust-vr> (0 entries)----------------------------------------------------------H: Host C: Connected S: Static A: Auto-ExportedI: Imported R: RIP/RIPng P: Permanent D: Auto-DiscoveredN: NHRPiB: IBGP eB: EBGP O: OSPF/OSPFv3 E1: OSPF external type 1E2: OSPF/OSPFv3 external type 2 trailing B: backup route

...

IPv4 Dest-Routes for <-TEST-> (0 entries)----------------------------------------------------------ssg5-isdn->

コマンドの実行結果にプロンプトがマッチしてしまう!

Page 17: Net opscoding#4発表資料

Expect で頑張る

NetOpsCoding#4 発表資料 17

• ログイン直後に表示されるプロンプトを元にプロンプトの正規表現パターンを構築

expect { ... # netscreen でプロンプトが途中で変わる場合の対応 -re {((?:\w|-|\.)+)((\((M|B)\))?)->} { set prompt $expect_out(0,string) set mb_char $expect_out(2,string) string trim mb_char "()“ set prompt_regex_alt "" set prompt_mb "" if {$mb_char != ""} { append prompt_mb {\(} $mb_char {\)} } append prompt_regex_alt $expect_out(1,string) \ {(\([[:print:]]+\))?} $prompt_mb {->} }

ssg5-isdn-> ssg5-isdn(\([[:print:]]+\))?->

Page 18: Net opscoding#4発表資料

Expect で頑張る (2)

NetOpsCoding#4 発表資料 18

• エラーメッセージを丁寧にハンドリングし、コマンドの実行に失敗したら、処理を中止する

## detect command error (juniper)#-re {\^--.*\n} { abort "Invalid command: $command"}-ex "\nunknown command." { abort "Invalid command: $command"}-ex "\nsyntax error(,|.)" { abort "Invalid command: $command"}-ex "\nmissing argument." { abort "Invalid command: $command"}・・・

Page 19: Net opscoding#4発表資料

秘伝のタレ化する Expect スクリプト

19

• 踏み台経由のログイン対応– 踏み台にログイン後、あらためて telnet コ

マンドを実行し、ターゲット機器にログイン

• 「 ---more--- 」対策– 実行結果の出力行数が大きい場合 more が

表示されてハングしないように対処する– set console page 0 で良いという話も

NetOpsCoding#4 発表資料

$ expect telnet.expUsage: telnet.exp hostname username password [options...] <command1> ... <commandN>options: --enable=<password> --timeout=n --proxy=<username>:<password>@<hostname>

# detect more (netscreen)-ex "\n--- more --- " { send " " exp_continue}

for {set i 0} {$i < $arrsz} {incr i} { set pxy_host $pxy_arr($i,host) set pxy_uname $pxy_arr($i,uname) set pxy_passwd $pxy_arr($i,passwd) if {$i == 0} { spawn telnet $pxy_host } else { send "telnet $pxy_host\n" }

NW 機器の設定コマンドをパラメータとして渡して実行できるように整備

Page 20: Net opscoding#4発表資料

冗長構成の壁

NetOpsCoding#4 発表資料 20

• SSG の場合:– NSRP がアクティブで、かつ、設定同期モードが有効な場合

は、アクティブ側でのみ設定コマンドを実行– 設定同期モードの確認

• get nsrp コマンドの実行結果を解析

– アクティブ側の判定• get nsrp vsd-group コマンドの実行結果を解析

• BIG-IP の場合:– アクティブ側にのみ設定変更の API を呼び出し、最後に設定同期の API を呼び出して設定を同期させる

– アクティブ側の判定• System::Failover::get_failover_state

– 設定の同期• System::ConfigSync::synchronize_configuration

別解として、プロンプトでアクティブかスタンバイかの判定もできるが、設定同期モードは判断できない

Page 21: Net opscoding#4発表資料

設定リカバリの壁

21

• 設定を誤投入してしまった時など、元の状態に戻したい– ただし、保存しておいた Config ファイルのアップロードによるリカバリは避け

たい(機器のリブートにより数分間通信断となるため)• 投入したコマンドと逆のコマンドを実行して元に戻す!?

– 例 :

• 投入したコマンドから逆コマンドが特定できるとは限らない– 例 :

NetOpsCoding#4 発表資料

set address "Untrust" "TEST_ADDR2" 192.168.1.0/24

unset address "Untrust" "TEST_ADDR2”

set address "Untrust" "TEST_ADDR2" ???????

unset address "Untrust" "TEST_ADDR2”

Page 22: Net opscoding#4発表資料

設定差分からのコマンド生成

NetOpsCoding#4 発表資料 22

• 現在の設定データと元に戻したい設定データの差分から、設定を元に戻すためのコマンドを計算する

• 単純にdiff取れば良いわけではない– 2つの設定データの構造を比較し、差分を埋め合わせるためのコマンド生成処理をPythonで頑張って実装(すべてのケースをカバーできている訳ではない)

...set address "Untrust" "TEST_ADDR1" 1.2.3.4/32set address "Untrust" "TEST_ADDR2" 192.168.1.0/24...set policy id 4 from "Trust" to "Trust" "Any" "TEST_ADDR2" "FTP" nat src dip-id 4 permitset policy id 4exitset policy id 2 from "Untrust" to "Trust" "Any" "Any" "ANY" nat src permitset policy id 2exit...

...set address "Untrust" "TEST_ADDR1" 1.2.3.4/32...set policy id 2 from "Untrust" to "Trust" "Any" "Any" "ANY" nat src permitset policy id 2exit...

変更前の設定データ: 現在の設定データ:

set address "Untrust" "TEST_ADDR2" 192.168.1.0/24set policy id 4 from "Trust" to "Trust" "Any" "TEST_ADDR2" "FTP" nat src dip-id 4 permitset policy move 4 before 2

生成されたリカバリコマンド:

Page 23: Net opscoding#4発表資料

まとめ

23

• Kompira を用いた NW 機器の運用自動化システムについてご紹介– 現在は、 SSG 、 BIG-IP のみに対応しているが、今後も対応機種を拡張していく予定

• 実際の現場で用いるには、レガシー機器対応、 Telnet や踏み台経由の接続、冗長構成、切り戻し手順などの、細かな要求に対応していく必要がある– そして、それらの実装はとても面倒くさい– NW 機器の運用自動化は一筋縄ではいかない

• 今のところ「銀の弾丸」は無さそう– Expect や Python などを使って、地道にコーディング

• とはいえ、自動化することで手作業よりも、工数削減、設定ミスの防止は確実にできるので、チャレンジする価値はある

NetOpsCoding#4 発表資料

Page 24: Net opscoding#4発表資料

ご清聴ありがとうございました

24

• 技術者絶賛募集中!

• ( 株 ) フィックスポイントでは、世界中のシステム運用を自動化していくための基盤ソフト作りに協力してくれるメンバーを募集しています。

• ご興味ある方は会場内の弊社社員にお声掛けを

NetOpsCoding#4 発表資料