Upload
kenta-hattori
View
496
Download
3
Embed Size (px)
Citation preview
ネットワーク機器運用自動化の傾向と対策
( 株 ) フィックスポイント服部健太
1NetOpsCoding#4 発表資料
フィックスポイントについて
• 事業内容– システム運用自動化ツール
「 Kompira 」の開発– 運用自動化導入サービス– コンサルティングサービス
• 所在:東京都渋谷区• 設立:2013年4月• 社員数:9名(役員含む)
http://www.fixpoint.co.jp
2NetOpsCoding#4 発表資料
Kompira の概要
3
• 運用自動化のためのプラットフォーム– オペレータはサーバに対するコマンド実行手順をジョブフローとして記述し、
それを Kompira サーバ上で実行する– Bash や Ruby 、 Python 、 Expect など各種スクリプトファイルを登録して、
ジョブフローから呼び出すこともできる– 簡単な入力フォームなども Kompira 上に作成できる
NetOpsCoding#4 発表資料
NW 運用部隊に対する様々な作業依頼
4
PUSH 配信システム間通信のために、FW の穴あけ作業お願いします
○○ 拠点の機器入れ替えに伴って、ルーティング変更作業お願いします
開発サーバリプレースのため、NAT の設定変更お願いします
シンクライアント端末への接続ユーザを変更するため、FW ポリシールールの変更お願いします
新規にサーバ構築するので、LB 、 FW の設定追加お願いします
リプレースに伴いサーバ追加するので、LB の既存 pool にノード追加してください
SSL サーバ証明書の更新作業お願いします
NetOpsCoding#4 発表資料
従来の運用
5
作業実施
作業依頼メールを受け取ると、依頼内容にもとづいて Excelで作業手順書を作成し、承認
を受ける
作業当日、承認済みの作業手順書にもとづいて、NW 機器にアクセスし、手作業で設定変更を行う
作業準備
NetOpsCoding#4 発表資料
そうだ!自動化しよう!
6
• いちいち詳細な Excel の作業手順書を書くくらいなら、設定変更のスクリプト書いて、自動実行した方が楽なのでは?
⇒ 現場の作業担当者はノンプログラマーなので、スクリプトを書くのは無理っぽい。。。
⇒ 責任者もノンプログラマーなので、スクリプトを見せられても、承認していいか分からん。。。
ノンプログラマーが読み書きできて、プログラムからも自動実行できるような手順書が無いものか。。。
NetOpsCoding#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 発表資料
YAML 手順書の細かな工夫
8
• 日本語のキーワードを使うことで可読性アップ– TargetDevice ⇒ 対象機器– CreateVirtualServer ⇒ 仮想サーバ作成– AddPolicy ⇒ ポリシー追加– …
• キーワードの表記ゆれに対応することで、より気楽に記述可能(だいたい合ってりゃ OK )– 仮想サーバ作成– 仮想サーバー作成– バーチャルサーバ作成– バーチャルサーバー作成– …
NetOpsCoding#4 発表資料
Kompira による自動運用
9
作業実施
作業準備 作業依頼メールを受け取ると、依頼内容にもとづいて YAML手順書を作成し、 Kompira
サーバに登録し、承認を受ける
作業予定時刻になると、Kompira が YAML 手順書にしたがって、設定変更
作業を自動実行
NetOpsCoding#4 発表資料
Kompira 上に作成した登録画面
NetOpsCoding#4 発表資料 10
YAML 手順書を入力
設定変更の実行日時を指定
YAML 手順書から設定変更までの流れ
NetOpsCoding#4 発表資料 11
現時点では、Juniper SSG
F5 BIG-IPに対応
入力された YAML 手順書の内容が意味的に正しいかどうか、現在の設定情報をもとにチェック
ネットワーク機器運用自動化の壁
12
• CLI の壁– SSG は API が無いので、設定情報の取得や変更を CLI経由で行う必要あ
り– BIG-IP は、良くできた( SOAP ) API が提供されている。😊
• bigsuds ( https://github.com/F5Networks/bigsuds)を使用
• Telnet の壁– 機器によっては、 Telnet でしかアクセスできないので Expect で何とかす
る必要あり– 踏み台ルータ経由によるアクセス
• 冗長構成( Active-Standby )の壁– 冗長構成を組んでいる場合、設定投入はアクティブ側に対してのみ行う必要あり
• 設定リカバリ(切り戻し)の壁– コンフィグファイルのアップロードによるリカバリは、数分間の通信断
が発生するため最終手段とする– 投入したコマンドの逆コマンドを実行して切り戻す必要がある
NetOpsCoding#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
必要な設定情報の辞書データ:…
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 をパースして構文木を作成
②構文木を辿って設定コマンド文字列を生成
Telnet の壁
NetOpsCoding#4 発表資料 15
コマンドの実行結果とプロンプトを分離したい
プロンプトが途中で変わる場合がある
コマンドの実行失敗に対処する必要がある
単純なプロンプトマッチに失敗する例
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->
コマンドの実行結果にプロンプトがマッチしてしまう!
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:]]+\))?->
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"}・・・
秘伝のタレ化する 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 機器の設定コマンドをパラメータとして渡して実行できるように整備
冗長構成の壁
NetOpsCoding#4 発表資料 20
• SSG の場合:– NSRP がアクティブで、かつ、設定同期モードが有効な場合
は、アクティブ側でのみ設定コマンドを実行– 設定同期モードの確認
• get nsrp コマンドの実行結果を解析
– アクティブ側の判定• get nsrp vsd-group コマンドの実行結果を解析
• BIG-IP の場合:– アクティブ側にのみ設定変更の API を呼び出し、最後に設定同期の API を呼び出して設定を同期させる
– アクティブ側の判定• System::Failover::get_failover_state
– 設定の同期• System::ConfigSync::synchronize_configuration
別解として、プロンプトでアクティブかスタンバイかの判定もできるが、設定同期モードは判断できない
設定リカバリの壁
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”
設定差分からのコマンド生成
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
生成されたリカバリコマンド:
まとめ
23
• Kompira を用いた NW 機器の運用自動化システムについてご紹介– 現在は、 SSG 、 BIG-IP のみに対応しているが、今後も対応機種を拡張していく予定
• 実際の現場で用いるには、レガシー機器対応、 Telnet や踏み台経由の接続、冗長構成、切り戻し手順などの、細かな要求に対応していく必要がある– そして、それらの実装はとても面倒くさい– NW 機器の運用自動化は一筋縄ではいかない
• 今のところ「銀の弾丸」は無さそう– Expect や Python などを使って、地道にコーディング
• とはいえ、自動化することで手作業よりも、工数削減、設定ミスの防止は確実にできるので、チャレンジする価値はある
NetOpsCoding#4 発表資料
ご清聴ありがとうございました
24
• 技術者絶賛募集中!
• ( 株 ) フィックスポイントでは、世界中のシステム運用を自動化していくための基盤ソフト作りに協力してくれるメンバーを募集しています。
• ご興味ある方は会場内の弊社社員にお声掛けを
NetOpsCoding#4 発表資料