JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle® ZFS Storage Appliance 管理ガイド
Oracle Technology Network
ライブラリ
PDF
印刷ビュー
フィードバック
search filter icon
search icon

Document Information

このドキュメントの使用法

 1 Oracle ZFS Storage Appliance の概要

 2 ステータス

 3 初期構成

 4 ネットワーク構成

 5 ストレージ構成

 6 Storage Area Network の構成

 7 ユーザー構成

 8 ZFSSA の設定

 9 警告の構成

 10 クラスタ構成

 11 ZFSSA サービス

 12 シェア、プロジェクト、およびスキーマ

 13 レプリケーション

 14 シャドウ移行

 15 CLI のスクリプト化

アクセスの自動化

コマンドのバッチ処理

コマンドのスクリプト化

スクリプト環境

システムとの対話

run 関数

get 関数

list 関数

children 関数

choices 関数

出力の生成

エラーの処理

 16 保守のワークフロー

 17 統合

索引

システムとの対話

当然ながら、システムと詳細に対話できないかぎり、スクリプトはほとんど役立ちません。スクリプトがシステムと対話できるようにするための組み込み関数がいくつか存在します。

Table 15-1  システムとの対話をサポートするための組み込み関数
関数
説明
get
指定されたプロパティーの値を取得します。この関数がネイティブ形式の値を返すことに注意してください。たとえば、日付は Date オブジェクトとして返されます。
list
現在のコンテキストの動的な子に対応するトークンの配列を返します。
run
指定されたコマンドをシェルで実行し、すべての出力を文字列として返します。出力に複数の行が含まれている場合、返される文字列には、埋め込まれた復帰改行が含まれることに注意してください。
props
現在のノードのプロパティー名の配列を返します。
set
2 つの文字列引数を受け取り、指定されたプロパティーを指定された値に設定します。
choicies
値のセットが知られていて列挙可能であるすべてのプロパティーの有効なプロパティー値の配列を返します。

run 関数

スクリプトがより大規模なシステムと対話するためのもっとも単純な方法は、「run」関数を使用することです。この関数は、実行するコマンドを受け取り、そのコマンドの出力を文字列として返します。次に例を示します。

dory:> configuration version script dump(run('get boot_time'))
'                     boot_time = 2009-10-12 07:02:17\n'

組み込みの dump 関数は、埋め込まれた復帰改行を展開することなく引数をダンプ出力します。この出力を分割するために、ECMAScript の文字列処理機能を使用できます。たとえば、空白に基づいて上の出力を分割すると、次のようになります。

dory:> configuration version script dump(run('get boot_time').split(/\s+/))
['', 'boot_time', '=', '2009-10-12', '07:02:17', '']

get 関数

run 関数は十分に強力であるため、システムに関する情報を取得するために、もっぱら出力の解析に頼りたくなることがあります。しかしこれには、将来変更されるかどうかわからない、人間が読める形式の出力をスクリプトがいつまでも解析し続けるという決定的な欠点があります。システムに関する情報をより安定して収集するには、組み込みの「get」関数を使用します。boot_time プロパティーの場合は、この関数によって文字列ではなく、ECMAScript の Date オブジェクトが返されるため、プログラムからプロパティー値を操作できます。たとえば、boot_time プロパティーを現在の時間と組み合わせて使用して、ブート時からの時間を特定することもできます。

script
       run('configuration version');
       now = new Date();
       uptime = (now.valueOf() - get('boot_time').valueOf()) / 1000; 
       printf('up %d day%s, %d hour%s, %d minute%s, %d second%s\n',
           d = uptime / 86400, d < 1 || d >= 2 ? 's' : '',
           h = (uptime / 3600) % 24, h < 1 || h >= 2 ? 's': '',
           m = (uptime / 60) % 60, m < 1 || m >= 2 ? 's': '',
           s = uptime % 60, s < 1 || s >= 2 ? 's': '');

上のスクリプトを「uptime.aksh」として保存したとすると、それを次の方法で実行できます。

% ssh root@dory < uptime.aksh
Pseudo-terminal will not be allocated because stdin is not a terminal.
Password: 
up 2 days, 10 hours, 47 minutes, 48 seconds

仮想端末の割り当てに関するメッセージは、ssh クライアントによるものです。このメッセージが示す問題は、ssh に「-T」オプションを指定することによって対処できます。

list 関数

動的な子が存在するコンテキストでは、これらの子をプログラムから繰り返し処理すると非常に有効です。これを行うには、動的な子の配列を返す list 関数を使用します。たとえば、すべてのプロジェクト内のすべてのシェアを繰り返し処理し、消費されている容量と空きスペースを出力するスクリプトを次に示します。

script
       run('shares');
       projects = list();

       for (i = 0; i < projects.length; i++) {
               run('select ' + projects[i]);
               shares = list();

               for (j = 0; j < shares.length; j++) {
                       run('select ' + shares[j]);
                       printf("%s/%s %1.64g %1.64g\n", projects[i], shares[j],
                           get('space_data'), get('space_available'));
                       run('cd ..');
               }

               run('cd ..');
       }

このスクリプトが「space.aksh」という名前のファイルに保存されたと仮定して、スクリプトを実行した出力を次に示します。

% ssh root@koi < space.aksh
Password: 
admin/accounts 18432 266617007104
admin/exports 18432 266617007104
admin/primary 18432 266617007104
admin/traffic 18432 266617007104
admin/workflow 18432 266617007104
aleventhal/hw_eng 18432 266617007104
bcantrill/analytx 1073964032 266617007104
bgregg/dashbd 18432 266617007104
bgregg/filesys01 26112 107374156288
bpijewski/access_ctrl 18432 266617007104
...

この結果の「きれいに出力された」バージョン (ただし、プログラムの処理はより困難になる) がほしい場合は、get コマンドの出力を直接解析することもできます。

script
       run('shares');
       projects = list();

       printf('%-40s %-10s %-10s\n', 'SHARE', 'USED', 'AVAILABLE');

       for (i = 0; i < projects.length; i++) {
               run('select ' + projects[i]);
               shares = list();

               for (j = 0; j < shares.length; j++) {
                       run('select ' + shares[j]);

                       share = projects[i] + '/' + shares[j];
                       used = run('get space_data').split(/\s+/)[3];
                       avail = run('get space_available').split(/\s+/)[3];

                       printf('%-40s %-10s %-10s\n', share, used, avail);
                       run('cd ..');
               }

               run('cd ..');
       }

このスクリプトが「prettyspace.aksh」という名前であると仮定して、この新しいスクリプトを実行した出力の一部を次に示します。

% ssh root@koi < prettyspace.aksh
Password:
SHARE                                    USED       AVAILABLE 
admin/accounts                           18K        248G      
admin/exports                            18K        248G      
admin/primary                            18K        248G      
admin/traffic                            18K        248G      
admin/workflow                           18K        248G      
aleventhal/hw_eng                        18K        248G      
bcantrill/analytx                        1.00G      248G      
bgregg/dashbd                            18K        248G       
bgregg/filesys01                         25.5K      100G      
bpijewski/access_ctrl                    18K        248G      
...

children 関数

静的な子が存在するコンテキストであっても、これらの子をプログラムから繰り返し処理すると有効です。これを行うには、静的な子の配列を返す children 関数を使用します。たとえば、すべてのサービスを繰り返し処理し、そのサービスのステータスを出力するスクリプトを次に示します。

configuration services
script
       var svcs = children();
       for (var i = 0; i < svcs.length; ++i) {
                run(svcs[i]);
                try {
                        printf("%-10s %s\n", svcs[i], get('<status>'));
                } catch (err) { }
                run("done");
       }

このスクリプトが「svcinfo.aksh」という名前のファイルに保存されたと仮定して、スクリプトを実行した出力を次に示します。

% ssh root@koi < space.aksh
Password: 
cifs       disabled
dns        online
ftp        disabled
http       disabled
identity   online
idmap      online
ipmp       online
iscsi      online
ldap       disabled
ndmp       online
nfs        online
nis        online
ntp        online
scrk       online
sftp       disabled
smtp       online
snmp       disabled
ssh        online
tags       online
vscan      disabled

choices 関数

choices 関数は、値のセットが知られていて列挙可能であるすべてのプロパティーの有効なプロパティー値の配列を返します。たとえば、次のスクリプトは、choices 関数を使用してシェアノード上のすべてのプールのリストを取得してから、すべてのプールを反復処理してプロジェクトのリストを作成し、使用可能な領域とともにシェアします。

fmt = '%-40s %-15s %-15s\n';
printf(fmt, 'SHARE', 'USED', 'AVAILABLE');
run('cd /');
run('shares');
pools = choices('pool');
for (p = 0; p < pools.length; p++) {
        set('pool', pools[p]);
        projects = list();
        for (i = 0; i < projects.length; i++) {
                run('select ' + projects[i]);
                shares = list();
                for (j = 0; j < shares.length; j++) {
                        run('select ' + shares[j]);
                        share = pools[p] + ':' + projects[i] + '/' + shares[j];
                        printf(fmt, share, get('space_data'),
                            get('space_available'));
                        run('cd ..');
                }
                run('cd ..');
        }
}

これは、スクリプトを実行した出力です。

SHARE                                    USED            AVAILABLE     
pond:projectA/fs1                        31744           566196178944  
pond:projectA/fs2                        31744           566196178944  
pond:projectB/lun1                       21474836480     587670999040  
puddle:deptA/share1                      238475          467539219283
puddle:deptB/share1                      129564          467539219283
puddle:deptB/share2                      19283747        467539219283