#!/bin/expect --
set vm_num [lindex $argv 0]
puts "``````````````````````````````````````````````````````````````"
puts "``````````````````````````````````````````````````````````````"
puts "Registering Stations on VM"
puts "Tarts to be Registered: $vm_num"
puts "``````````````````````````````````````````````````````````````"
puts "``````````````````````````````````````````````````````````````"
for { set index 0 } { $index < [llength $vm_num] } { incr index } {
puts "Registering Tart Num: [lindex $vm_num $index]"
switch -- [lindex $vm_num $index]\
1 {
spawn telnet 10.171.0.10 6187
set timeout -1
expect {
puts "``````````````````````````````````````````````````````````````"
"*traffic*" { puts "Registering Group1, Group2"
send "traffic map rate reg_group1 30000\r"
send "traffic map rate reg_group2 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group3, Group4"
send "traffic map rate reg_group3 30000\r"
send "traffic map rate reg_group4 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group5, Group6"
send "traffic map rate reg_group5 30000\r"
send "traffic map rate reg_group6 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group7, Group8"
send "traffic map rate reg_group7 30000\r"
send "traffic map rate reg_group8 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
}
puts "wait 3 seconds"
sleep 3
send -- "^]"
expect -exact "^\]\rtelnet> "
send -- "close\r"
expect eof
wait
}
} 2 {
spawn telnet 10.171.0.11 6187
set timeout -1
expect {
"*traffic*" {
puts "``````````````````````````````````````````````````````````````"
puts "Registering Group1, Group2"
send "traffic map rate reg_group1 30000\r"
send "traffic map rate reg_group2 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group3, Group4"
send "traffic map rate reg_group3 30000\r"
send "traffic map rate reg_group4 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group5, Group6"
send "traffic map rate reg_group5 30000\r"
send "traffic map rate reg_group6 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group7, Group8"
send "traffic map rate reg_group7 30000\r"
send "traffic map rate reg_group8 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
}
puts "wait 3 seconds"
sleep 3
send -- "^]"
expect -exact "^\]\rtelnet> "
send -- "close\r"
expect eof
wait
}
} 3 {
spawn telnet 10.171.0.12 6187
set timeout -1
expect {
"*traffic*" {
puts "``````````````````````````````````````````````````````````````"
puts "Registering Group1, Group2"
send "traffic map rate reg_group1 50000\r"
puts "wait 220 seconds .."
send "traffic go\r"
sleep 220
puts "Registering Group2"
send "traffic map rate reg_group2 50000\r"
puts "wait 220 seconds .."
send "traffic go\r"
sleep 220
}
puts "wait 3 seconds"
sleep 3
send -- "^]"
expect -exact "^\]\rtelnet> "
send -- "close\r"
expect eof
wait
}
}
default {
puts "$vm_num is not a valid tart"
}
}
誰でも私を案内できますか?たとえば、./vmSetup.ex "1 2 3" などのスクリプトを実行すると実行される上記の予想スクリプトがありますが、これは順次実行されます。このExpectスクリプトを作成しましたが、スクリプトの例(1、2、3など)を並列に実行したいと思います。たとえば、8つのケースを並列に実行する方法を教えてください。そして同様のケース1〜3を使用していますが、違いはIPだけです。私の周りにもそのような場合が25個ほどあります。 1つのケースのみを使用して25個のVMをすべて収容する方法を教えてください。
答え1
最も簡単な方法は、次にのみリンクするように除外スクリプトを再構築することです。一つMachine、コマンドラインからコンピュータ名またはIPアドレスを取得します。
次に、次のいずれかを使用してスクリプトを実行します。GNUパラレルまたはをxargs -P
使用すると、xargs
より簡単な並列化操作でより使いparallel
やすく、より柔軟で、より複雑な並列化要件に適しています。
例えば
echo 10.171.0.{10..17} | xargs -P 8 -n 1 /path/to/your/expect/script
これにより、最大8つのジョブ(-P 8
)が同時に実行され、各ジョブは正確に1つの(-n 1
)IPアドレスを指定します。
スクリプトが多数の出力を生成すると予想される場合は、標準出力として印刷するのではなく、別のログファイル(IPアドレスなどexpect-10.171.0.10.log
)で印刷するようにスクリプトを作成することをお勧めします。それ以外の場合、すべてのジョブの出力は次のようになります。一緒に混ぜました。
少なくとも各出力行は、IPアドレスとコロンを各行の接頭辞として指定して、その出力が出てくるシステムを識別する必要があります。
追加コメント:
可能であれば、パスワード認証ではなくキーベース認証を使用するように設定し、次の手順を実行する必要があり
ssh
ますtelnet
。- あなたは必要ありません
expect
- 並列分散シェルを使用できますPDSHリモートシステムに接続する(pdshはデフォルトで並列に接続)
スクリプト
expect
をもう少し考えてみると、sshが適していない可能性があります。- あなたは必要ありません
それとも、一部のルーターからデータを収集したいと思いますか?
この場合、シンプルなネットワーク管理プロトコルより適切かもしれません。 SNMP(および他のソース)を介して収集されたデータを収集、保存、およびプロットするための既存のツールはすでにたくさんあります。例えば、サボテン、クリケット、ムニンその他の使用ツールRRDツール。