CSVファイルからテーブル情報を作成する

管理下のサーバーにパッチをあてる場合のように、決まった処理を複数のサーバーに適用する場合の方法は、別記事「複数サーバーでのコマンド実行」で、テーブル型オブジェクトを利用した繰り返し処理で記述する方法をご紹介しました。

テーブル型オブジェクトにサーバー登録を追加するのは、Kompira Enterprise 画面から1台ずつ登録する事も出来ますが、台数が多くなると登録作業がひと手間です。
本記事では、このテーブル型オブジェクトに CSV ファイルを使って、一括で登録・変更を行う方法をご紹介します。


動作確認環境

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

または

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

または

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

作業の方針

CSV ファイル自体はテキストエディターや Excel などを使って作成します。これを添付ファイル型オブジェクトにアップロードします。CSV 形式のデータの読み込みと処理についてですが、現在の Kompira Enterprise (バージョン1.6.8) では CSV データを扱う組み込み関数が用意されていません。そこでライブラリ型オブジェクトを利用して、Python の CSV モジュールを利用します。

ノード情報型オブジェクトのテーブルは、あらかじめテーブル型オブジェクトを作成しておきます。CSV ファイルから読み込んだデータを利用して add メソッドを利用してノード情報型オブジェクトを追加。その後、サーバーの各種設定情報を更新します。

この記事では以下のコンテンツを作成します。
・サーバー情報を記載した CSV ファイル
・アップロードファイル (添付ファイル型)
・/root/import_from_csv/user1 (アカウント情報型)
・サーバーリスト (ノード情報型を格納するテーブル型)
・csvreader (ライブラリ型)
・サーバー追加 (ジョブフロー型)

サーバー情報を記載した CSV ファイルの作成

ここではサーバー名 (ノード情報型オブジェクトの名称に利用) 、IP アドレス、ログイン情報 (アカウント情報型オブジェクトのパス) の3つの項目を記載します。

名前は適当につけて PC 上に作成しておきます。ここでは server_list.csv とします。この際に文字コードが UTF-8 になっていることを確認してください。

アップロードファイル(添付ファイル型)の作成

作成した CSV ファイルを添付ファイル型のオブジェクトにアップロードします。以下のように、添付ファイル1に PC 上の CSV ファイルを指定してアップロードしてください。

/root/import_from_csv/user1 (アカウント情報型) の作成

CSV ファイルの「ログイン情報」に記載したパスでオブジェクトを作成します。

ssh でログインするためのユーザ名、パスワードをそれぞれ指定します。本記事での例では全てのサーバーに同じアカウント情報を設定しています。もし CSV ファイルで複数のアカウント情報を記載している場合には、それに応じたアカウント情報を個別に作成してください。

サーバーリスト (ノード情報型を格納するテーブル型) の作成

ここではあらかじめ手動でオブジェクトを作成しておきます。以下のように設定画面にて「ノード情報」を選択して保存してください。

csvreader (ライブラリ型) の作成

Python の CSV モジュールを利用して、指定された CSV ファイルを読み込み、各行を要素とする配列を返すライブラリを作成します。
ここでは csvreader という名前のライブラリ型オブジェクトを作成し、関数名を read_csv とします。

import csv # csvモジュールをインポートする

def read_csv(datafile):
    with open(datafile, 'r') as f:
        data_reader = csv.reader(f)
        return [row for row in data_reader]

サーバー追加 (ジョブフロー型) の作成

これまで作成した各オブジェクトを処理するジョブフローを書きます。

| table_name = ./サーバーリスト | # 作成したテーブル
| file = ./アップロードファイル | # 作成した添付ファイル

# 添付ファイルオブジェクトのCSVデータの読み込み
[csvdata = file.attached1.data] -> 
[tmp_file = '/tmp/dummy.csv'] -> # Kompiraサーバー上の一時ファイル
['cat > $tmp_file' << ./アップロードファイル.attached1.data] ->
[arr = ./csvreader.read_csv(tmp_file)] -> # 作成したライブラリの呼び出し
{ for item in arr |
    # CSVの各要素の取り込み
    [name = item[0]] ->
    { if name == "" | 
        break
    } ->
    [ip = item[1]] ->
    [account = item[2]] ->

    # 指定の名称のノード情報が無い場合は作成
    path("$table_name/$name") =>
    { if $STATUS != 0 |
        [./サーバーリスト.add: name]
    } ->
    [obj = $RESULT] ->

    # ノード情報の登録情報の更新
    [name >> obj.hostname] ->
    [ip >> obj.ipaddr] ->
    [account >> obj.account]
}

このジョブフローを実行すると、テーブルには以下のようにノード情報が追加されます。既存の登録名がある場合には CSV の記載内容で情報が更新されます。

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

CSV からダイレクトにテーブルに格納する機能はありませんが、本稿のようにファイルの読み込みからオブジェクトに反映させることが可能です。もしデータが JSON 形式であれば、ライブラリを用いずに組み込み関数の json_parse() 関数を利用して記述する事が出来ます。

TOP