運用業務において管理対象が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度起動するだけで、「メンテナンス対象」テーブルに登録されている全サーバーで指定したコマンドを実行することができます。