複数サーバーに対してコマンドを実行する

運用業務において管理対象が1台のみという事は珍しく、通常はサーバーを複数台メンテナンスされていると思います。
ただ、1台ごとに個別のジョブフローを作成するのは現実的ではありませんので、本稿では同一のメンテナンスのコマンドを複数のサーバーに渡って実施する場合の方法について説明します。

※ 本稿は Kompira Enterprise 1.6系に準拠した画像を用いています。


動作確認環境

本稿は、以下の環境で検証しています。

ソフトウェア バージョン
Kompira Enterprise 1.5.5.post7
OS CentOS 7.8.2003

または

ソフトウェア バージョン
Kompira Enterprise 1.6.2.post4
OS CentOS 8.2.2004

または

ソフトウェア バージョン
Kompira Enterprise 1.6.8
OS CentOS Stream 8

for 文で繰り返し

メンテナンス対象のサーバーが3台あるとします。各サーバーについて、ノード情報型のオブジェクト “server1″ 、”server2″ 、”server3” をそれぞれ用意します。
また、各サーバーに合わせたアカウント情報型のオブジェクト “アカウント1″ 、”アカウント2″ 、”アカウント3” を用意し、ノード情報型のオブジェクトに設定します。

接続先の指定は制御変数 “__node__” にノード情報型のオブジェクトを代入することで行います。
ここまで準備できましたら、サーバーごとの繰り返し処理は、以下のように記述できます。

{ for server in [./server1, ./server2, ./server3] |
    print(server['hostname'] + "でコマンドを実行します") ->
    [__node__ = server] ->
    ["実行したいコマンド"] ->
    print($RESULT)
}

変数 “server” には繰り返し処理ごとにノード情報型のオブジェクトが代入され、コマンドが実行されます。

2行目の “server[‘hostname’]” は、ノード情報型のフィールド “hostname” を参照しています。これは Kompira Enterprise の操作画面上では、ノード情報における「ホスト名」という値に対応しています。

テーブル型による繰り返しの記述

先程の例では、繰り返し対象になるサーバーを for 文中に配列で指定していました。台数が少ないうちはこのような方法でも良いですが、台数が増えてきたり、サーバーの追加や入れ替えが頻繁になると、ジョブフローの管理が大変になります。
このため、管理対象のサーバーをテーブル型のオブジェクトを利用して、ジョブフローとは別に管理します。

ここでは「メンテナンス対象」という名称のテーブル型のオブジェクトを作成します。テーブル作成時に “オブジェクト型” として “ノード情報” を指定しましょう。

※以下の画像は Kompira Enterprise バージョン 1.6.8 時点のものです。他のバージョンでは項目が異なることがあります

上の例では「サーバー1号機」のような各行はノード情報型のオブジェクトを表しています。

さて、ノード情報型のテーブルが作成できたので、先程の繰り返し処理のジョブフローは次のように書き換える事が出来ます。

{ for server in ./メンテナンス対象 |
    print(server['hostname'] + "でコマンドを実行します") ->
    [__node__ = server] ->
    ["実行したいコマンド"] ->
    print($RESULT)
}

このように for 文の in の後に、配列の代わりにテーブル型のオブジェクトを使用する事が出来ます。この場合、変数 server には「メンテナンス対象」テーブルに含まれるノード情報型の各要素が順に代入され、 “|”  以降の処理を繰り返し実行します。つまり、サーバー構成に変更がある場合には「メンテナンス対象」オブジェクトのみを適切に修正しておけば、このジョブフローそのものを変更する必要が無くなるというわけです。また、ノード情報型に設定するアカウント情報型についても同様にテーブルで管理することができます。

次に、先程のジョブフローを

  • 実行するコマンドを実行時にパラメータ “cmd” で指定
  • コマンド実行時にエラーが発生した際に「エラーが発生しました」と表示

といったように変更してみます。

| cmd = "ls" |
 
{ for server in ./メンテナンス対象 |
    print(server['hostname'] + "でコマンドを実行します") ->
    [__node__ = server] -> 
    [cmd] =>
    { if $STATUS == 0 |
      then:
        print($RESULT)
      else: 
        print("エラーが発生しました") 
    }
}

今回はデフォルトで “ls” コマンドを実行するように指定しましたが、実行時に任意のコマンドを指定することができます。

このようにすることで、ジョブフローを1度起動するだけで、「メンテナンス対象」テーブルに登録されている全サーバーで指定したコマンドを実行することができます。

TOP