expectでのループ処理とVMware ESXiのバックアップ

expectは対話式で処理(ssh,telnet接続等)する場合は便利ですが、何故かループ処理の例がウェブに殆どないようなので
拙いながら、一応載せておきます。
とはいえ、条件式でループ処理等の場合は参考になるサイトがありますので
ここでは、リストの値をループ処理する場合になります。

リスト値・・・・・・AAA BBB CCC DDD
リストファイル・・・touch_list(内容はAAA BBB CCC DDD)

■リストした値を順次変数に代入してループ処理する場合

▲shの場合

#!/bin/bash

for i in AAA BBB CCC DDD; do
  touch /tmp/$i
done

▲expectの場合

#!/usr/bin/expect

foreach i {AAA BBB CCC DDD} {
	spawn touch /tmp/$i
	expect "root"
	}

■リストファイルの値を順次変数に代入してループ処理する場合

▲shの場合

#!/bin/bash

TOUCH_LIST=/root/touch_list

while read line; do
  touch /tmp/$line
done <$TOUCH_LIST

▲expectの場合
知らん。が、shと組み合わせると以下の通り

#!/bin/bash

TOUCH_LIST=/root/touch_list

while read line; do
  expect -c "
    spawn touch /tmp/$line
    expect "#"
  "
done <$TOUCH_LIST

■上記4つの実行結果(共通)

# ./test
# ls -l /tmp/
合計 4
-rw-r--r-- 1 root root    0 12月 10 19:39 AAA
-rw-r--r-- 1 root root    0 12月 10 19:39 BBB
-rw-r--r-- 1 root root    0 12月 10 19:39 CCC
-rw-r--r-- 1 root root    0 12月 10 19:39 DDD

======================================================
これだけだと手抜きなので、下記にVMware ESXiホストで動作しているゲストOSのバックアップスクリプトを載せておきます。
方法の解説については別サイトで詳しく解説されておりますので、そちらをご参照下さい。

なお、ESXiサーバへはrootユーザでSSH接続出来たり、バックアップ先をマウントしていることを前提としていますので
未設定の場合は適宜書き換えるか別サイトを参考に設定しておいて下さい。

#!/usr/bin/expect

set timeout -1

#下記コマンドを実行して、ESXiホストで動作しているゲストOSを調べます
#vim-cmd vmsvc/getallvms
#Vmid   Name
#10     GustOS1 #HTTP Server
#12     GustOS2 #MySQL Server
#17     GustOS3 #MAIL Server
#24     GustOS4 #Active Directory Server
#33     GustOS5 #CIFS Server

set NOW_TIME [clock format [clock seconds] -format {%Y%m%d}]

#ESXiホストへのSSH接続パスワード
set PASSWD "Password"
#ゲストOSが格納されているデータストア
set DATASTORE "/vmfs/volumes/LOCAL"
#ゲストOSのバックアップ先
set BACKUPDIR "/vmfs/volumes/BACKUP/$NOW_TIME"

set SNAPSHOTCRE "vim-cmd vmsvc/snapshot.create"
set SNAPSHOTRM "vim-cmd vmsvc/snapshot.removeall"


#VMware ESXiサーバへSSH接続
#ESXiホスト名(IPアドレス)に適宜書き換える
spawn ssh VMWARE-ESXI
expect "Password"
send "$PASSWD\r"
expect "#"


#バックアップディレクトリを作成
send "mkdir $BACKUPDIR\r"
expect "#"


#各ゲストOSの構成ファイル(vmx vmxf vmsd)をコピー(バックアップ)
foreach i {vmx vmxf vmsd} {
	send "cp $DATASTORE/*/*.$i $BACKUPDIR/\r"
	expect "#"
	}


#スナップショットを取得
# VMIDは環境によって適宜変更する
foreach VMID {10 12 17 24 33} {
	send "$SNAPSHOTCRE $VMID $NOW_TIME\r"
	expect "#"
	}


#スナップショットタスクが完了するまで待機
#事前に手動で下記コマンドを実行し、待機に必要な時間を確認しておく
#vim-cmd vmsvc/get.tasklist 確認するゲストOSのVMID
sleep 300


#各ゲストOSの本体ファイル(vmdk)をコピー(バックアップ)
#ゲストOS名は環境によって適宜変更する
foreach VMNAME {GustOS1 GustOS2 GustOS3 GustOS4 GustOS5} {
	send "vmkfstools -i $DATASTORE/$VMNAME/$VMNAME.vmdk -d thin $BACKUPDIR/$VMNAME.vmdk\r"
	expect "#"
	}


#スナップショットを削除
# VMIDは環境によって適宜変更する
foreach VMID {10 12 17 24 33} {
	send "$SNAPSHOTRM $VMID\r"
	expect "#"
	}

#バックアップを完了
send "exit\r"

==================================
動作環境:VMware ESXi5.1