Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

ICM によるスクリプト作成

この付録では、スクリプトから一連の ICM コマンドを発行する方法と、導入環境全体にわたってコンテナとサービスを指定し、調整する方法を説明します。

ICM の終了ステータス

ICM は、それぞれのコマンドの後に UNIX 終了ステータスを設定します。これは、指定した ICM コマンドが正常に実行されたかどうか簡単に判断する手段です。以下の例では、それぞれのコマンドの後に特殊変数 $? を検査しています。

# icm inventory
Machine                 IP Address    DNS Name                        Region   Zone
-------                 ----------    --------                        ------   ----
Acme-DATA-TEST-0001 54.191.233.2  ec2-54-191-233-2.amazonaws.com  us-east1 b
Acme-DATA-TEST-0002 54.202.223.57 ec2-54-202-223-57.amazonaws.com us-east1 b
Acme-DATA-TEST-0003 54.202.223.58 ec2-54-202-223-58.amazonaws.com us-east1 b
# echo $?
0

# icm publish
Unrecognized goal: 'publish' (try "icm -help")
# echo $?
1

# icm ps -role QM
Unrecognized role 'QM'
# echo $?
1

# icm session
Error: Interactive commands cannot match more than one instance
# echo $?
1

ICM ロギング

ICM は、出力をファイル (既定では icm.log) とコンソールに記録します。すべての出力がログ・ファイルに送られますが、そのコンソール出力を取得して stdout と stderr に分割できます。以下の例は、エラーを出さずに完了しています。

# icm inventory > std.out 2> std.err
# cat std.out
Machine             IP Address    DNS Name                        Region   Zone
-------             ----------    --------                        ------   ----
Acme-DATA-TEST-0001 54.191.233.2  ec2-54-191-233-2.amazonaws.com  us-east1 b
Acme-DATA-TEST-0002 54.202.223.57 ec2-54-202-223-57.amazonaws.com us-east1 b
Acme-DATA-TEST-0003 54.202.223.58 ec2-54-202-223-58.amazonaws.com us-east1 b
# cat std.err

以下の例は、エラー出力を含んでいます。

# icm publish > std.out 2> std.err
# cat std.out
# cat std.err
Unrecognized goal: 'publish' (try "icm -help")

リモート・スクリプト呼び出し

コマンドを組み合わせて使用して、ホストまたはコンテナにスクリプトをコピーし、リモート側からこれらのスクリプトを呼び出すことができます。以下の例では、エクスポートした InterSystems IRIS ルーチンを InterSystems IRIS クラスタにコピーした後、コンパイルして実行します。

# icm scp -localPath Routine1.xml -remotePath /tmp/
# icm session -command 'Do ##class(%SYSTEM.OBJ).Load("/tmp/Routine1.xml", "c-d")'
# icm session -command 'Do ^Routine1'

以下の例では、ホストにシェル・スクリプトをコピーし、アクセス権を変更して、実行します。

# icm scp -localPath script1.sh -remotePath /tmp/
# icm ssh -command 'sudo chmod a+x /tmp/script1.sh'
# icm ssh -command '/tmp/script1.sh abc 123'

以下の例でも実行することは同じですが、カスタムまたはサードパーティのコンテナ内で行います。

# icm cp -localPath script2.sh -remotePath /tmp/ -container gracie
# icm exec -command 'chmod a+x /tmp/script2.sh' -container gracie
# icm exec -command '/tmp/script2.sh abc 123' -container gracie

JSON モードの使用

スクリプトで、クラスタの状態に関する情報を ICM から収集する必要が生じることがあります。次に例を示します。

  • InterSystems IRIS データ・サーバの IP アドレスは?

  • カスタム/サードパーティ・コンテナのステータスは?

ICM の目視可読形式の出力を解析することは困難で、誤りが生じやすくなります。より確実なソリューションは、json オプションを使用して JSON 形式で出力を生成するように ICM に指示することです。出力は、現在の作業ディレクトリ内のファイル response.json に書き込まれます。

正常な出力

ほとんどの ICM コマンドは、正常終了時に出力を生成しません。この場合、終了値は 0 で、stderr に出力は書き込まれず、JSON は空の配列です。

# icm exec -command "ls /" -json
# cat response.json
[]

正常終了時に有用な出力を生成する ICM コマンドについて、以下に詳しく説明します。フィールドの順序は保証されません。

icm provision

icm provision 出力の形式は、プロビジョニング時に使用される入力 (つまり、構成) ファイルと出力 (つまり状態) ファイルを表す名前と値のペアが含まれるオブジェクトです。 次の例で示しているように、対応するコマンド行引数に一致する名前は、defaultsdefinitionsinstances、および stateDir です。

# icm provision -json
...
Machine             IP Address    DNS Name                        Region   Zone
-------             ----------    --------                        ------   ----
Acme-DATA-TEST-0001 54.191.233.2  ec2-54-191-233-2.amazonaws.com  us-east1 b
Acme-DATA-TEST-0002 54.202.223.57 ec2-54-202-223-57.amazonaws.com us-east1 b
Acme-DATA-TEST-0003 54.202.223.58 ec2-54-202-223-58.amazonaws.com us-east1 b
To destroy: icm unprovision [-cleanUp] [-force]

# cat response.json
{
  "defaults" : "defaults.json",
  "definitions" : "definitions.json",
  "instances" : "instances.json",
  "stateDir" : "/Samples/AWS/state/"
}

icm inventory

icm inventory コマンドの形式は、プロビジョニングされたそれぞれのインスタンスに対応する要素を含む配列であり、それぞれの要素は名前と値のペア MachineNameRoleIPAddress、および DNSName からなるリストを含みます。例を以下に示します。

# icm inventory -json
Machine             IP Address    DNS Name                        Region   Zone
-------             ----------    --------                        ------   ----
Acme-DATA-TEST-0001 54.191.233.2  ec2-54-191-233-2.amazonaws.com  us-east1 b
Acme-DATA-TEST-0002 54.202.223.57 ec2-54-202-223-57.amazonaws.com us-east1 b
Acme-DATA-TEST-0003 54.202.223.58 ec2-54-202-223-58.amazonaws.com us-east1 b

# cat response.json
[
  {
    “Provider”: “AWS”,
    "MachineName":"Acme-DATA-TEST-0001",
    "Role":"DATA",
    "IPAddress":"54.191.233.2",
    "DNSName":"54_191_233_2.amazonaws.com",
    “Region”: “us-east-1”,
    “Zone”: “us-east-1b”
  },
  {
    “Provider”: “AWS”,
    "MachineName ":"Acme-DATA-TEST-0002",
    "Role":"DATA",
    "IPAddress":"54.202.223.57",
    "DNSName":"54_202_223_57.amazonaws.com,
    “Region”: “us-east-1”,
    “Zone”: “us-east-1b”"
  },
  {
    “Provider”: “AWS”,
    "MachineName":"Acme-DATA-TEST-0003",
    "Role":"DATA",
    "IPAddress":"54202.223.58",
    "DNSName":"54_202_223_58.amazonaws.com,
    “Region”: “us-east-1”,
    “Zone”: “us-east-1b”"
  }
]

icm ps

コンテナ・モードでは、icm ps コマンドの出力は、それぞれのコンテナに対応する要素を含む配列であり、それぞれの要素は名前と値のペア MachineNameRoleIPAddressDNSNameContainerDockerImageStatus、および MirrorStatus (該当する場合) からなるリストを含みます。

# icm ps -container iris -json
Machine              IP Address     Container  Status  Health  Image
-------              ----------     ---------  ------  -----   -----
Acme-DATA-TEST-0001  54.191.233.2   iris       Up      healthy isc/iris:2022.2.0.221.0
Acme-DATA-TEST-0002  54.202.223.57  iris       Up      healthy isc/iris:2022.2.0.221.0
Acme-DATA-TEST-0003  54.202.223.58  iris       Up      healthy isc/iris:2022.2.0.221.0
# cat response.json
[
  {
    "MachineName":"Acme-DATA-TEST-0001",
    "Role":"DATA",
    "IPAddress":"54.191.233.2",
    "DNSName":"54_191_233_2.amazonaws.com"
    "Container":"iris",
    "DockerImage":"isc/iris:2022.2.0.221.0",
    "Status":"Up",
    "Health":"healthy"
  },
  {
    "MachineName ":"Acme-DATA-TEST-0002",
    "Role":"DATA",
    "IPAddress":"54.202.223.57",
    "DNSName":"54_202_223_57.amazonaws.com"
    "Container":"iris",
    "DockerImage":"isc/iris:2022.2.0.221.0",
    "Status":"Up"",
    "Health":"healthy"
  },
  {
    "MachineName ":"Acme-DATA-TEST-0003",
    "Role":"DATA",
    "IPAddress":"54.202.223.57",
    "DNSName":"54_202_223_57.amazonaws.com"
    "Container":"iris",
    "DockerImage":"isc/iris:2022.2.0.221.0",
    "Status":"Up",
    "Health":"healthy"
  },
]

コンテナレス・モードでは、icm ps の出力フィールドは、MachineNameRoleIPAddressDNSNameISCInstance (インターシステムズ提供のコンテナ内では常に IRIS)、KitStatus、および MirrorStatus (該当する場合) です。

# icm ps -json
Machine             IP Address    Instance Kit            Status   Health
-------             ----------    -------- ---            ------   ------
Acme-DATA-TEST-0001 54.67.2.117   IRIS     2017.3.0.392.0 running  ok
Acme-DATA-TEST-0002 54.153.96.236 IRIS     2017.3.0.392.0 running  ok
Acme-DATA-TEST-0002 54.153.90.66  IRIS     2017.3.0.392.0 running  ok

# cat response.json
[
  {
    "MachineName":"Acme-DATA-TEST-0001",
    "Role":"DATA",
    "IPAddress":"54.191.233.2",
    "DNSName":"54_191_233_2.amazonaws.com"
    "ISCInstance":"IRIS",
    "Kit":"2017.3.0.392.0",
    "Status":"running",
    "Health":"ok"
  },
  {
    "MachineName ":"Acme-DATA-TEST-0002",
    "Role":"DATA",
    "IPAddress":"54.202.223.57",
    "DNSName":"54_202_223_57.amazonaws.com"
    "ISCInstance":"IRIS",
    "Kit":"2017.3.0.392.0",
    "Status":"running"",
    "Health":"ok"
  },
  {
    "MachineName ":"Acme-DATA-TEST-0003",
    "Role":"DATA",
    "IPAddress":"54.202.223.57",
    "DNSName":"54_202_223_57.amazonaws.com"
    "ISCInstance":"IRIS",
    "Kit":"2017.3.0.392.0",
    "Status":"running"",
    "Health":"ok"
  }
]

異常な出力

エラーが発生したときの JSON 出力の形式は、エラーが ICM アプリケーションのローカル側で発生したか、ホストまたはインスタンス上のターゲット・アプリケーションから発生したかによって異なります。

ローカル・エラー

ICM コマンドにエラーが発生した場合、JSON には以下のように、エラーを説明するオブジェクトと、名前と値のペアが含まれます。

# icm ps -role QM -json
Unrecognized role 'QM'

# cat response.json
{
    "error": "Unrecognized role 'QM'"
}

リモート・エラー

リモート・エラーは、以下のうち 1 つ以上が当てはまるときに発生したと見なされます。

  • ゼロ以外の終了ステータス

  • stderr への出力

リモート・エラーが発生すると、JSON は名前と値のペアを含むオブジェクトの配列になります。名前はターゲット・マシンのものに対応し、値は以下の 1 つ以上を含む名前と値のペアのリストを含む別のオブジェクトです。

  • error : 発生した問題の説明 (例外のテキストの大部分)

  • file : 問題に関する詳細を含むファイル

  • exitValue : 基礎のプロセスの (ゼロ以外の) 終了値

次に例を示します。

# icm ssh -command "ls file.txt" -json
Executing command 'ls file.txt' on host Acme-DATA-TEST-0001...
ls: cannot access file.txt: No such file or directory
Error: See tmp/DATA-TEST/DATA-TEST-0001/ssh.err
Errors occurred during execution; aborting operation

# cat response.json
[
  {
    "Acme-DATA-TEST-0001": {
      "file": "tmp/DATA-TEST/DATA-TEST-0001/ssh.err"
    }
  }
]

# cat tmp/DATA-TEST/DATA-TEST-0001/ssh.err
ls: cannot access file.txt: No such file or directory

FeedbackOpens in a new tab