Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Net opscoding#4発表資料

924 views

Published on

NetOpsCoding#4 でKompiraを用いたネットワーク機器運用自動化の事例を紹介とそれにまつわる苦労話をさせていただきました。

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Net opscoding#4発表資料

  1. 1. ネットワーク機器運用自動化の傾向と対策 (株)フィックスポイント 服部健太 1NetOpsCoding#4 発表資料
  2. 2. フィックスポイントについて • 事業内容 – システム運用自動化ツール 「Kompira」の開発 – 運用自動化導入サービス – コンサルティングサービス • 所在:東京都渋谷区 • 設立:2013年4月 • 社員数:9名(役員含む) http://www.fixpoint.co.jp 2NetOpsCoding#4 発表資料
  3. 3. Kompiraの概要 3 • 運用自動化のためのプラットフォーム – オペレータはサーバに対するコマンド実行手順をジョブフロー として記述し、それをKompiraサーバ上で実行する – BashやRuby、Python、Expectなど各種スクリプトファイルを 登録して、ジョブフローから呼び出すこともできる – 簡単な入力フォームなどもKompira上に作成できる NetOpsCoding#4 発表資料
  4. 4. NW運用部隊に対する様々な作業依頼 4 PUSH配信システム間通信のために、 FWの穴あけ作業お願いします ○○拠点の機器入れ替えに伴って、 ルーティング変更作業お願いします 開発サーバリプレースのため、 NATの設定変更お願いします シンクライアント端末への接続ユーザを変更するため、 FWポリシールールの変更お願いします 新規にサーバ構築するので、 LB、FWの設定追加お願いします リプレースに伴いサーバ追加するので、 LBの既存poolにノード追加してください SSLサーバ証明書の更新作業お願いします NetOpsCoding#4 発表資料
  5. 5. 従来の運用 5 作業実施 作業依頼メールを受け取ると、 依頼内容にもとづいてExcel で作業手順書を作成し、承認 を受ける 作業当日、承認済みの作 業手順書にもとづいて、 NW機器にアクセスし、 手作業で設定変更を行う 作業準備 NetOpsCoding#4 発表資料
  6. 6. そうだ!自動化しよう! 6 • いちいち詳細なExcelの作業手順書を書くくらい なら、設定変更のスクリプト書いて、自動実行 した方が楽なのでは? ⇒現場の作業担当者はノンプログラマーなので、 スクリプトを書くのは無理っぽい。。。 ⇒責任者もノンプログラマーなので、スクリプト を見せられても、承認していいか分からん。。。 ノンプログラマーが読み書きできて、プログラムから も自動実行できるような手順書が無いものか。。。 NetOpsCoding#4 発表資料
  7. 7. 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 発表資料
  8. 8. YAML手順書の細かな工夫 8 • 日本語のキーワードを使うことで可読性アップ – TargetDevice ⇒ 対象機器 – CreateVirtualServer ⇒ 仮想サーバ作成 – AddPolicy ⇒ ポリシー追加 – … • キーワードの表記ゆれに対応することで、より 気楽に記述可能(だいたい合ってりゃOK) – 仮想サーバ作成 – 仮想サーバー作成 – バーチャルサーバ作成 – バーチャルサーバー作成 – … NetOpsCoding#4 発表資料
  9. 9. Kompiraによる自動運用 9 作業実施 作業準備 作業依頼メールを受け取ると、 依頼内容にもとづいてYAML手 順書を作成し、Kompiraサーバ に登録し、承認を受ける 作業予定時刻になると、 KompiraがYAML手順書に したがって、設定変更作 業を自動実行 NetOpsCoding#4 発表資料
  10. 10. Kompira上に作成した登録画面 NetOpsCoding#4 発表資料 10 YAML手順書 を入力 設定変更の実行 日時を指定
  11. 11. YAML手順書から設定変更までの流れ NetOpsCoding#4 発表資料 11 現時点では、 Juniper SSG F5 BIG-IP に対応 入力されたYAML手順書の内容が 意味的に正しいかどうか、現在の 設定情報をもとにチェック
  12. 12. ネットワーク機器運用自動化の壁 12 • CLIの壁 – SSGはAPIが無いので、設定情報の取得や変更をCLI経由で行う 必要あり – BIG-IPは、良くできた(SOAP)APIが提供されている。😊 • bigsuds(https://github.com/F5Networks/bigsuds)を使用 • Telnetの壁 – 機器によっては、TelnetでしかアクセスできないのでExpectで 何とかする必要あり – 踏み台ルータ経由によるアクセス • 冗長構成(Active-Standby)の壁 – 冗長構成を組んでいる場合、設定投入はアクティブ側に対して のみ行う必要あり • 設定リカバリ(切り戻し)の壁 – コンフィグファイルのアップロードによるリカバリは、数分間 の通信断が発生するため最終手段とする – 投入したコマンドの逆コマンドを実行して切り戻す必要がある NetOpsCoding#4 発表資料
  13. 13. CLIの壁(設定情報取得編) NetOpsCoding#4 発表資料 13 • get config コマンドで取得した情報をパースして、設定情報 の辞書データを構築 • SSGのコマンドリファレンスとにらめっこしながらPythonで 頑張って実装 – コマンドの基本的な字句解析処理はshlex ライブラリを利用 unset key protection enable set clock timezone 0 set vrouter trust-vr sharable set vrouter "untrust-vr" exit set vrouter "trust-vr" unset auto-route-export exit unset auto-route-export set preference nhrp 100 set preference ospf-e2 254 exit set alg appleichat enable unset alg appleichat re-assembly enable set 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 必要な設定情報の辞書データ: …
  14. 14. 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/32 set address "Untrust" "TEST_ADDR2" 192.168.1.0/24 set 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をパースして構文木を作成 ②構文木を辿って設定コマンド文字列を生成
  15. 15. Telnetの壁 NetOpsCoding#4 発表資料 15 コマンドの実行結果と プロンプトを分離したい プロンプトが途中で 変わる場合がある コマンドの実行失敗に 対処する必要がある
  16. 16. 単純なプロンプトマッチに失敗する例 NetOpsCoding#4 発表資料 16 ssg5-isdn-> get route IPv4 Dest-Routes for <untrust-vr> (0 entries) ---------------------------------------------------------- H: Host C: Connected S: Static A: Auto-Exported I: Imported R: RIP/RIPng P: Permanent D: Auto-Discovered N: NHRP iB: IBGP eB: EBGP O: OSPF/OSPFv3 E1: OSPF external type 1 E2: OSPF/OSPFv3 external type 2 trailing B: backup route ... IPv4 Dest-Routes for <-TEST-> (0 entries) ---------------------------------------------------------- ssg5-isdn-> コマンドの実行結果にプロンプト がマッチしてしまう!
  17. 17. 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:]]+))?->
  18. 18. 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" } ・・・
  19. 19. 秘伝のタレ化するExpectスクリプト 19 • 踏み台経由のログイン対応 – 踏み台にログイン後、あらためて telnetコマンドを実行し、ターゲット 機器にログイン • 「---more---」対策 – 実行結果の出力行数が大きい場合 moreが表示されてハングしないよう に対処する – set console page 0 で良いという話も NetOpsCoding#4 発表資料 $ expect telnet.exp Usage: 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_hostn" } NW機器の設定コマンドをパラメータとして渡して実行できるように整備
  20. 20. 冗長構成の壁 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. 21. 設定リカバリの壁 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”
  22. 22. 設定差分からのコマンド生成 NetOpsCoding#4 発表資料 22 • 現在の設定データと元に戻したい設定データの差分から、設定を元に戻す ためのコマンドを計算する • 単純にdiff取れば良いわけではない – 2つの設定データの構造を比較し、差分を埋め合わせるためのコマンド生成処理を Pythonで頑張って実装(すべてのケースをカバーできている訳ではない) ... set address "Untrust" "TEST_ADDR1" 1.2.3.4/32 set 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 permit set policy id 4 exit set policy id 2 from "Untrust" to "Trust" "Any" "Any" "ANY" nat src permit set policy id 2 exit ... ... set address "Untrust" "TEST_ADDR1" 1.2.3.4/32 ... set policy id 2 from "Untrust" to "Trust" "Any" "Any" "ANY" nat src permit set policy id 2 exit ... 変更前の設定データ: 現在の設定データ: set 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 permit set policy move 4 before 2 生成されたリカバリコマンド:
  23. 23. まとめ 23 • Kompiraを用いたNW機器の運用自動化システムについ てご紹介 – 現在は、SSG、BIG-IPのみに対応しているが、今後も対応機種 を拡張していく予定 • 実際の現場で用いるには、レガシー機器対応、Telnetや 踏み台経由の接続、冗長構成、切り戻し手順などの、細 かな要求に対応していく必要がある – そして、それらの実装はとても面倒くさい – NW機器の運用自動化は一筋縄ではいかない • 今のところ「銀の弾丸」は無さそう – ExpectやPythonなどを使って、地道にコーディング • とはいえ、自動化することで手作業よりも、工数削減、 設定ミスの防止は確実にできるので、チャレンジする価 値はある NetOpsCoding#4 発表資料
  24. 24. ご清聴ありがとうございました 24 • 技術者絶賛募集中! • (株)フィックスポイントでは、世界中のシステ ム運用を自動化していくための基盤ソフト作り に協力してくれるメンバーを募集しています。 • ご興味ある方は会場内の弊社社員にお声掛けを NetOpsCoding#4 発表資料

×