物理ディスク一覧を作成する際、単純に「storage disk show」で取得すると、2ノードの表示が入り交じり、どちらに所属している物理ディスクなのか判別が面倒。
なので、「storage disk show -nodelist ノード名」という形で出力を分けたいのだが、NetAppに対して「system node show -fields node」で取得したノード一覧からノード名を抜き出して、それぞれに対してコマンドを実行するためには、TeraTermマクロで実装できるのかを調査した。
調査
まず、NetAppのノード名一覧の出力を確認
netapp01::> system node show -fields node
node
-------------
netapp01-01
netapp01-02
2 entries were displayed.
netapp01::>
ノードとして「netapp01-01」と「netapp01-02」があることを確認。
また、system node showコマンドの出力のうち最初の2行はヘッダ、そして、ノード名出力後に「~ entries were displayed.」と出力がある。これらは使わないので除外が必要。
スクリプト
サンプルとして、ノード一覧を表示して、各ノードに対して「system node run -node ノード名 hostname」を実行する、というものを作成した。
setsync 1
timeout=60
strdim nodenames 20
I=0
sendln 'system node show -fields node'
recvln ; コマンド入力 のecho出力 をスキップ
recvln ; ヘッダ部分 をスキップ
recvln ; --- 部分 をスキップ
endflag=1
while endflag=1
recvln
strscan inputstr 'displayed.'
if result>0 then
endflag=0
else
nodenames[I] = inputstr
I=I+1
endif
endwhile
wait '::> '
J=0
while I > J
sendln 'system node run -node ' nodenames[J] ' hostname'
wait '::> '
J=J+1
endwhile
setsync 0
「2 entries were displayed.」というエントリ以降の行は不要なので、whileを終了する処理を入れるが、1台だったりすると1 entry wasとかになったりしそうなのでdisplayed.だけで終了検出。
whileを抜けたあとは、コマンドプロンプトの「::> 」が来るまで待ちを入れる。
スクリプト実行例
netapp01::> system node show -fields node
node
-------------
netapp01-01
netapp01-02
2 entries were displayed.
netapp01::> system node run -node netapp01-01 hostname
netapp01-01
netapp01::> system node run -node netapp01-02 hostname
netapp01-02
netapp01::>
cp -r retoge-mag.hatenablog.com viewpage
for file in `find ./viewpage -name \*.html -print`
do
sed -i -e "s/retoge-mag.hatenablog.com/retoge-mag.websa.jp\/old\/viewpage/g" $file
done
これでまずはHTMLのみがコピーされた状態だが、リンクをいくつかクリックしてみると404 not foundとなるものがある。
for file in `find ./viewpage -name \*.html -print`
do
sed -i -e "s/b.st-hatena.com/retoge-mag.websa.jp\/old\/b.st-hatena.com/g" $file
sed -i -e "s/cdn-ak.f.st-hatena.com/retoge-mag.websa.jp\/old\/cdn-ak.f.st-hatena.com/g" $file
sed -i -e "s/cdn.blog.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.blog.st-hatena.com/g" $file
sed -i -e "s/cdn.pool.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.pool.st-hatena.com/g" $file
sed -i -e "s/cdn.profile-image.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.profile-image.st-hatena.com/g" $file
sed -i -e "s/cdn.user.blog.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.user.blog.st-hatena.com/g" $file
sed -i -e "s/usercss.blog.st-hatena.com/retoge-mag.websa.jp\/old\/usercss.blog.st-hatena.com/g" $file
done
ホスト名変更操作は scope:cimc/network にて set hostnameを実行したあと、commitで確定する。
ホスト名 /cimc/network # set hostname 新ホスト名
Create new certificate with CN as new hostname? [y|N] y
ホスト名 /cimc/network *# commit
Changes to the network settings will be applied immediately.
You may lose connectivity to the Cisco IMC and may have to log in again.
Do you wish to continue? [y/N] y
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:33:27:f8 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 172.17.44.48/16 brd 172.17.255.255 scope global noprefixroute ens160
===buffer===
ip a s ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:33:27:f8 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 172.17.44.48/16 brd 172.17.255.255 scope global noprefixroute ens160
===str0===
inet 172.17.44.48/16 brd 172.17.255.255 scope global noprefixroute ens160
===str1===
172.17.44.48/16 brd 172.17.255.255 scope global noprefixroute ens160
====
valid_lft forever preferred_lft forever
inet6 fe80::cca7:388a:36e7:d688/64 scope link noprefixroute
valid_lft forever preferred_lft forever
条件を「inet (.*)\r」から「inet6 (.*)\r」に変更
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:33:27:f8 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 172.17.44.48/16 brd 172.17.255.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::cca7:388a:36e7:d688/64 scope link noprefixroute
valid_lft forever preferred_lft forever
===buffer===
ip a s ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:33:27:f8 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 172.17.44.48/16 brd 172.17.255.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::cca7:388a:36e7:d688/64 scope link noprefixroute
valid_lft forever preferred_lft forever
===str0===
inet6 fe80::cca7:388a:36e7:d688/64 scope link noprefixroute
valid_lft forever preferred_lft forever
===str1===
fe80::cca7:388a:36e7:d688/64 scope link noprefixroute
valid_lft forever preferred_lft forever
====
ここからさらにIPアドレスの部分を取り出すには「string first ~」「string last ~」と「string range ~」を使って文字列を切り出す。
set str $expect_out(1,string)
set stred [string first "/" $str]
puts "[string range $str 0 $stred]"
set stred [expr $stred - 1]
puts "[string range $str 0 $stred]"
上記の実行結果としては下記のようになる。
172.17.44.48/
172.17.44.48
他の言語のsubstring系だと開始アドレスと、そこを起点に取り出す文字列の長さを指定するが、tclのstring range では、開始アドレスと終了アドレスの2つを指定する形になるので注意が必要になる。