Weitere ähnliche Inhalte Ähnlich wie Net opscoding#4発表資料 (20) Mehr von Kenta Hattori (20) Net opscoding#4発表資料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 発表資料
12. ネットワーク機器運用自動化の壁
12
• CLIの壁
– SSGはAPIが無いので、設定情報の取得や変更をCLI経由で行う
必要あり
– BIG-IPは、良くできた(SOAP)APIが提供されている。😊
• bigsuds(https://github.com/F5Networks/bigsuds)を使用
• Telnetの壁
– 機器によっては、TelnetでしかアクセスできないのでExpectで
何とかする必要あり
– 踏み台ルータ経由によるアクセス
• 冗長構成(Active-Standby)の壁
– 冗長構成を組んでいる場合、設定投入はアクティブ側に対して
のみ行う必要あり
• 設定リカバリ(切り戻し)の壁
– コンフィグファイルのアップロードによるリカバリは、数分間
の通信断が発生するため最終手段とする
– 投入したコマンドの逆コマンドを実行して切り戻す必要がある
NetOpsCoding#4 発表資料
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. 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をパースして構文木を作成
②構文木を辿って設定コマンド文字列を生成
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. 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. 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. 秘伝のタレ化する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. 冗長構成の壁
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
• 設定を誤投入してしまった時など、元の状態に戻したい
– ただし、保存しておいた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. 設定差分からのコマンド生成
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
生成されたリカバリコマンド: