column

ネットワーク機器へのコマンド投入

運用自動化する上でネットワーク機器に接続し設定情報や構成を取得したい場合があるかと思います。
Kompira enterprise(以降Kompiraと表記)にはネットワーク機器やサーバに接続しコマンド実行を行う機能があります。
本稿ではその機能を利用したネットワーク機器からの情報収集の手順を紹介します。

紹介する内容は以下の通りです。

・NW機器にSSH接続し、コマンド実行によって機器の情報を取得する
・NW機器にProxy経由でSSH接続し、コマンド実行によって機器の情報を取得する

なお、対応している接続方法についてはSSH(version2)のみとなります。
SSH(version1)やtelnetには対応していません。

 


環境情報

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

Kompiraサーバ

項目 バージョン
OS CentOS Linux release 7.6.1810
Kompira ver.1.5.3

VyOSルータ

項目 バージョン
OS VyOS 1.1.8

プロキシ(踏み台)サーバ

項目 バージョン
OS CentOS Linux release 7.6.1810

 

 


ネットワーク機器にSSH接続

Kompiraにはネットワーク機器に接続する機能がデフォルトで用意されています。

本稿ではその機能を使用して接続します。

 

以下の手順でネットワーク機器に接続します。

・Kompira上にアカウント情報オブジェクトを作成

・Kompira上にノード情報オブジェクトを作成

・VyOS上にスクリプト配置(※)

・コマンド実行

※: VyOSの場合、VyOSコマンドの直接実行は動作しないためスクリプトを配置する必要があります。

 

ネットワーク構成

以下のような環境で検証しています。

 

Kompira上にアカウント情報オブジェクトを作成

まず対象機器(VyOSルータ)に接続するためのアカウントを作成します。

次のオブジェクトを作成します。

名前 VyOSユーザ
アカウント情報

このオブジェクトの編集画面では、「ユーザー名」「パスワード」の指定をします。
認証に鍵ファイルが必要な場合は、別途鍵ファイルのパスやパスフレーズを登録してください。

 

Kompira上にノード情報オブジェクトを作成

次に接続先のノード情報を作成します。

次のオブジェクトを作成します。

名前 VyOSルータ
ノード情報

以下のような設定を実施します。

項目
IPアドレス 192.168.1.Z(VyOSルータのIPアドレス)
ポート番号 22
接続種別 ssh
シェル使用 チェックなし
アカウント VyOSユーザ

 

VyOS上にスクリプト配置

VyOSの場合、BashのComplete機能を用いてコマンドを実現しています。
通常のBashコマンド(date等)であれば動作はしますが、VyOSコマンドの直接実行は動作しません。
VyOSを使用しない場合は本手順は不要です。

以下のようなスクリプトを経由させて間接的にコマンドを実行する必要があります。

実行権限を付与します。

 

コマンド実行

以下のようなジョブフローを生成し、VyOSからバージョン情報を取得します。
ジョブフローはVyOSノード情報と同階層のディレクトリに作成します。

 

名前 VyOS設定取得ジョブフロー
ジョブフロー

 

 

正常に実行できた場合はバージョン情報が以下のように出力されます。

 

プロキシ(踏み台)経由の接続

ネットワーク環境によっては情報収集の対象機器に対して、Kompiraからの直接SSH接続を許可していない場合もあります。
この場合、プロキシサーバを経由した接続をしているネットワーク環境がほとんどだと思われます。
本項ではプロキシサーバ経由のSSH接続について紹介します。

以下の手順で設定します。

・プロキシサーバ用のアカウント情報の作成

・プロキシサーバ用のノード情報の作成

・VyOSルータのノード情報の修正

 

ネットワーク構成

以下のような環境で検証しています。

 

プロキシサーバ用のアカウント情報の作成

プロキシサーバに接続するためのアカウントを作成します。

次のオブジェクトを作成します。

名前 プロキシユーザ
アカウント情報

このオブジェクトの編集画面では、「ユーザー名」「パスワード」の指定をします。
認証に鍵ファイルが必要な場合は、別途鍵ファイルのパスやパスフレーズを登録してください。

 

プロキシサーバ用のノード情報の作成

プロキシサーバ用のノード情報を作成します。

次のオブジェクトを作成します。

名前 プロキシサーバ
ノード情報

 

項目
IPアドレス  192.168.1.Y(プロキシサーバのIPアドレス)
ポート番号 22
接続種別 ssh
シェル使用 チェック有
アカウント プロキシユーザ

 

 

VyOSルータのノード情報の修正

VyOSルータのノード情報を修正します。

IPアドレス 192.168.1.Z(プロキシサーバより接続できるIPアドレス)
プロキシ プロキシサーバ

 

設定後、VyOS設定取得ジョブフローを実行します。
コマンドの実行結果が正常であればプロキシ経由での実行は正常に動作しています。

またプロキシサーバの/var/log/secureを確認し、以下のようなログが出力されていればプロキシ経由での接続ができていることが分かります。

 

 

まとめ

本稿ではKompiraの機能を使ったネットワーク機器からの情報収集について紹介しました。
今回紹介したのは単純な情報取得のコマンドの実行までですが、「Kompiraのセッション機能を利用して対話的にコマンドを実行する」といった記事と組み合わせれば、複雑な運用の自動化も可能です。

 

参考

本文中にでてきたVyOS内で実行するスクリプトについては以下のブログを参考にしました。
http://d.hatena.ne.jp/iamsandman/20110510/1304984590

フィールド修飾子でフィールドの入力内容に制約を設ける

フォームからジョブフローへ渡す値の入力やテーブルなどオブジェクトに項目を登録・編集する際に、フィールドに対して何らかのルールを設けたい場面があるかと思います。
ジョブフローを実行するフォームを作成するでは、これを実現するフィールド修飾子について、enum, objectの指定による簡単な例についてご紹介しました。
今回は、上記コラムでは挙げられていない制限に関するフィールド修飾子についてご紹介いたします。

 


環境情報

本記事で説明するフィールド修飾子は、バージョン1.5.1で追加されたものも含まれます。
ご確認の際は、1.5.1以降のバージョンのKompiraをご用意ください。

項目 バージョン
OS CentOS Linux release 7.5.1804
Kompira ver.1.5.2

 


フィールド修飾子のおさらい

本題に入る前に、フィールド修飾子について振り返りたいと思います。

フィールド修飾子は、Kompiraオブジェクトのフィールド型に対し、表示の制御や制約内容を設定するものです。
Kompira上で作成可能なオブジェクトのうち、型オブジェクト設定オブジェクトフォームの3点で設定することが出来ます。
具体的には、次の場面で設定した内容が適用されます。

1. フォーム上のパラメータ(ジョブフローへ渡す引数)指定
2. テーブルへ項目を登録、登録済みの項目を変更
3. 設定または独自の型オブジェクトの登録または変更

フィールド修飾子は、JSON形式{“key”:”value”}で記入します。例えば、フィールドの初期値を予め設定したい場合は下記の通りになります。

記入はオブジェクトの登録・編集画面内の「フィールド修飾子フィールド」または、フィールド横のボタン(下記画像の赤丸)を押すことで表示されるエディタから行います。

型フィールド入力画面

フィールド修飾子の編集画面

 

次に現在のKompiraで用意されているフィールド修飾子についてご説明します。
下記の表は、使用可能なフィールド修飾子と対応するフィールド型をまとめたものです。
各フィールド修飾子の役割(Kompiraドキュメント「5.2.2. フィールド修飾子」に記載)は割愛させていただきますが、太字の項目が入力内容に制約を持たせるものになります。

フィールド修飾子名 設定可能なフィールド型 備考
default 全フィールド 1.5.1よりArray, Dictionary型に対応
invisible 全フィールド
help_text 全フィールド
object Object
directory Object
no_empty Object
enum Enum
pattern String 1.5.1より追加
min_length String 1.5.1より追加
max_length String 1.5.1より追加
min_value Integer 1.5.1より追加
max_value Integer 1.5.1より追加
file_accept File 1.5.1より追加

紹介するフィールド修飾子について

振り返りを踏まえて、制約に関わる下記6点を順に説明していきます。

目次

1. 入力可能な文字列の長さを指定する(min_lengthとmax_length)
2. 入力可能な整数値を指定する(min_valueとmax_value)
3. 入力可能な文字列を正規表現で指定する(pattern)
4. Object型フィールドで選択可能なオブジェクトを制限する(object)
5. Object型フィールドで未選択を許可しない(no_empty)
6. アップロード可能なファイル形式を制限する(file_accept)

 


入力可能な文字列の長さを指定する(min_lengthとmax_length)

String型フィールドは文字列を入力するためのフィールドです。
String型フィールドに入力可能な文字数の制限を設けたい場面があるかと思います。
最小文字数を指定するmin_length、最大文字数を指定するmax_lengthを指定することでString型フィールドの文字数を制限することができます。
下記の例では、5文字以上10文字以内の文字列のみ許可します。

この設定を無視して、範囲外の文字列を登録・変更しようとした場合、画面上に警告と設定した文字数の案内が表示されます。

 


入力可能な整数値を指定する(min_valueとmax_value)

整数値を入力するためのInteger型フィールドに対して入力可能な値に制限を設けることが可能です。
最小・最大値を表すmin_valueとmax_valueの2つのフィールド修飾子が用意されています。

下記の例では、1~10の範囲の整数値のみ許可します。

 

この設定を行うと、フィールド内の値の上下ボタンで指定可能な値の範囲に設定した最小・最大値が反映されます。
なお、フィールドへ直接入力した場合、設定した範囲外の値を入力することは可能ですが、保存する際に画面上に警告と設定可能な範囲が案内されます。

 


入力可能な文字列を正規表現で指定する(pattern)

patternを指定することで、String型フィールドに入力可能な文字列の制約を正規表現で設定することが出来ます。
例えば、英数字のみ入力できるフィールドを用意する場合、次のようなパターン文字列を指定します。

この設定を無視して、登録・変更しようとした場合、画面上に警告が表示されます。

patternを活用することで、前述の文字数制限以外にString型フィールドへ独自の制約を設けることが出来ます。

例:03からはじまるハイフンあり電話番号(03-4桁-4桁)のみ許可

例:郵便番号(半角数字3桁-半角数字4桁)のみ許可

例:24時間制の時刻(hh:mm:ss, 0埋め2桁)を表す文字列のみ許可

 


Object型フィールドで選択可能なオブジェクトを制限する(object)

フィールド修飾子objectを使って、フィールドで選択可能なオブジェクトをシステムで定義、独自に定義した型オブジェクトに制限する方法を紹介します。

システムで定義されている型オブジェクトに制限する

システム定義型ディレクトリ(/system/types)に格納されている型オブジェクト全23件が指定できます。

システム定義型ディレクトリ

設定オブジェクトに限定させたい場合、object修飾子に/system/types/Configを指定します。

なお、特定ディレクトリ配下の設定オブジェクトのみ参照させる場合は、directory修飾子を使用して参照できるディレクトリを制限します。
下記の例ではフォームと同じディレクトリ下にあるConfigsフォルダの設定オブジェクトに限定しています。

独自に定義した型オブジェクトに制限する

システムで定義されている型オブジェクトと同様に、object修飾子に独自の型オブジェクトを指定します。
下記の例では、同じディレクトリ下にあるSampleTypeを型オブジェクトに指定しています。

 


Object型フィールドで未選択を許可しない(no_empty)

フィールド修飾子no_emptyを指定することで、Object型フィールドのオブジェクト選択を必須とします。
以下のように設定します。

 


アップロード可能なファイル形式を制限する(file_accept)

File型フィールドを使用する際に、利用するファイルの拡張子を制限したい場合があるかと思います。
フィールド修飾子file_acceptを指定することで、File型フィールドに制限をかけることができます。
フィールド修飾子file_acceptに制限したいファイルの拡張子を指定する際は、”.拡張子”形式で指定します。
下記の例では、.txt形式の選択のみ許可します。

フィールド修飾子を設定すると、下記のようにファイル選択ダイアログ上で選択可能なファイル形式が制限されます。
これにより、誤った形式のファイルの指定を防ぐことが出来ます。

 

ただし、ダイアログ上のファイル形式の種類(上記画像では「Text Document」の部分)はユーザーで変更可能です。
より厳格に制限するには、フォームであれば、file_acceptの設定と合わせて、ジョブフロー側でのファイル形式チェック処理(下記)を設けます。

 


まとめ

本記事では、制限に関するフィールド修飾子の使い方をご紹介しました。
フィールド修飾子を設定することで、人間の操作が必要な場面での入力負担の軽減や入力ミスの防止が期待できます。
型オブジェクト、設定オブジェクト、フォームを用意する際は、合わせてフィールド修飾子の使用もご検討下さい。

Kompira REST APIを利用して外部からオブジェクト情報を取得する

Kompira REST APIを利用して外部からジョブフローを実行する」では、指定のジョブフローを外部から操作する方法を紹介しました。
今回はKompiraのREST APIの別の利用方法として、外部からKompiraのオブジェクト情報を取得してみましょう。
また、取得した情報の応用例として、Kompira上のテーブルのデータを取得し、CSV形式のデータを作成する方法についても合わせてご紹介します。


動作確認環境

ソフトウェア バージョン
Kompira 1.5.1
LinuxOS CentOS7.4-1708

以降では、kompiraサーバーのIPアドレスを <kompiraサーバー> と表記します。


事前準備

APIトークンの取得

APIの利用に必要な「REST APIトークン」を、「Kompira REST APIを利用して外部からジョブフローを実行する」に記載されている手順で取得してください。
取得したトークンを以降では <api_token> と表記します。

 

オブジェクトの作成

外部から取得するオブジェクトをKompira上に作成します。
ここでは、下図のようなテーブルオブジェクトにノード情報を登録します。


基本の取得方法

実際にAPIリクエストを使ってオブジェクトの情報を取得してみましょう。
オブジェクト取得時のリクエストURLは以下になります。

ここでは、ターミナルのcURLコマンドを実行します。

すると下記のようなJSON形式の辞書データが返却されます。

 

レスポンスデータの中身は以下の通りです。

キー名 説明
id オブジェクトID
abspath オブジェクトパス
owner オブジェクト所有者ユーザー名
fields フィールドデータ辞書(オブジェクト依存)
extra_properties オブジェクト拡張属性
user_permissions ユーザーパーミッション辞書
group_permissions グループパーミッション辞書
display_name 表示名
description 説明
created オブジェクト生成日時
updated オブジェクト最終更新日時
type_object 型オブジェクトのパス
parent_object 親オブジェクトのパス

オブジェクト一覧の取得

GETリクエストのエンドポイントにディレクトリもしくはテーブルオブジェクトを指定することで、配下に存在するオブジェクトを一括で取得することができます。

リクエストのURLは以下の2通りになります。

コマンドでの実行は以下のようになります。

このときのレスポンスデータは以下です。
“results”の中に、先ほどのレスポンスデータがリストとして格納されています。

 

一覧取得時のレスポンスデータの中身は以下の通りです。

キー名 説明
count オブジェクト総数
next 次ページのURL
previous 前ページのURL
results オブジェクトデータリスト

応用例1(フィルタ条件付きの一覧取得)

一覧取得のリクエスト時にクエリパラメータを指定することで、レスポンスに含まれるデータを絞り込むことができます。

例えば、以下の条件でのフィルタを行います。

1. “/root”の子孫にある
2. ノード情報オブジェクトの内、
3. 本日の00:00:00以降に更新されたオブジェクトを取得する。

このときに指定するクエリは下の表のようになります。

クエリパラメータ 説明
type_object 指定した型のオブジェクトのみを取得
updated__gte 指定した日付以降に更新されたオブジェクトを取得

 

コマンドでの実行は以下のようになります。

または、クエリをURLで直接指定する以下の方法もあります。

 

お知らせ

近日リリース予定のバージョン1.5.2では、より強力なフィルタ指定を行うことができます。乞うご期待。


応用例2(CSVファイルへの変換)

REST API経由で取得したデータを活用する方法について一例を説明します。
先述の「オブジェクト一覧」で取得したノードオブジェクトの情報について、CSV形式のファイルへ変換します。
ここでは整形用のコマンドとして、 jq コマンドを用いています。

 

変換後のデータは以下のようになります。

KompiraからWindowsGUIアプリケーションを操作する (1/2)

運用の中で既に利用されているアプリケーションを自動化することができれば、運用効率の向上が期待できます。しかし、そのアプリケーションのインターフェースがGUIしか存在しない場合、それを自動化することは容易ではありません。

そこで本稿では、「KompiraからWindowsGUIアプリケーションを操作する」方法(全2回)を紹介します。
初回である今回は、Windowsアプリケーション操作ライブラリFriendlyを用いて、Windowsの代表的なアプリケーションの「メモ帳」を操作します。
2回目は、KompiraからWindowsに接続し、メモ帳を操作する方法を紹介します。

図: 全体像

Windowsアプリケーションの自動操作

Windowsアプリケーションを自動操作する方法には、以下の2種類の方法が考えられます。

・マウスやキーボードをエミュレートする
・ボタンやテキストボックスなどUI要素にアクセスし操作する

ここでは、 時刻や内部データに応じて、UIの表示量や表示順が変わる場合でも、確実に操作できる「UI要素にアクセスし操作する」方法を取り上げます。

Friendly

Friendlyとは、Codeer社が開発したWindowsアプリケーション操作用ライブラリです。Friendlyを使用することで、対象アプリケーションに別のプロセスからアタッチし、操作することができます。

Friendlyによるメモ帳の操作

以下は、「メモ帳」の編集欄に任意の文字列を入力するコンソールアプリケーションのコードです。
このアプリケーションを実行すると、メモ帳を触ることなく、メモ帳に”buz”という文字列を表示することができます。

Friendlyライブラリの読み込み

Friendlyのライブラリを読み込みます。

Friendlyはnugetに登録されているので、プロジェクト設定ファイル.csprojに以下の設定を追加することで、使用することができます (※)。

※ または、以下のように開発環境上で以下のコマンドを実行すると、.csprojに自動的に上記が追加することができます。

プロセスへアタッチ及び構成要素へのアクセッサ取得

プロセスIDを指定し、メモ帳のプロセスへアタッチします。
メモ帳は、下図のように、「編集欄」と「ステータスバー」から構成されます。

図: メモ帳の構成

編集欄のIDを指定し、アクセッサ(text_edit)を取得します。

構成要素のIDを取得するためには、別途、アプリケーションの解析が必要となります。
アプリケーションの解析方法については、後ほど説明します。

編集欄への書き込み
取得したアクセッサを使い、文字列を編集欄へ書き込みます。

アプリケーションの解析

構成要素を指定・操作するためには、対象となる要素のIDを知っておく必要があります。IDは、専用のツールを用いてアプリケーションを解析することで得ることができます。

TestAssistant
TestAssistantはCooder社が提供するGUI解析用ツールです。以下からダウンロードすることで使用することができます。

https://www.codeer.co.jp/CodeAndTool

TestAssistantによるメモ帳の解析

それでは、TestAssistantを使って、メモ帳を解析してみましょう。

1. メモ帳を起動します
2. TestAssistantを起動します
3. メモ帳にアタッチします

テスト対象プロセス選択ボタンを押して、対象アプリケーション(=メモ帳)にアタッチします

4. 要素の解析を行います
4.1. トップレベルウインドウ解析ボタンを押下します

4.2. 中央ペインで、編集欄をクリックすると、右ペイン下の表に指定した要素の情報が記載されます

本稿では、DialogId=15を用いて、記入欄の要素にアクセスします(※)

※ 要素のIDには、複数の種類が存在します。アプリケーションによっては、同じIDを持つ構成要素が存在するため、状況に応じてIDを使い分けてください。

TestAssistantによる操作のキャプチャ

TestAssistantには、アプリケーションの操作をキャプチャする機能が存在します。この機能を用いることで、アプリケーション操作の実装が簡単になるため、覚えておいた方がよいでしょう。

1. メモ帳、TestAssistantを起動し、メモ帳にアタッチします
2. 「操作によるコード生成ボタン」を押下します

3. メモ帳の編集欄にフォーカスし、文字を入力します

4. 操作によるコード生成ウインドウに入力した文字列を入力する操作のコードが生成されます

5. OKボタンを押下すると、TestAssistantの左ペインに、以下のような「メモ帳の編集欄に文字列を追加する」操作のコードが追加されます。

まとめ
本稿では、Friendlyを用いてメモ帳を操作する方法を紹介しました。この方法を応用することで様々なWindows GUIアプリケーションを自動的に操作することができます。

次回は、今回説明した方法を拡張し、Kompiraからメモ帳を操作する方法をご紹介いたします。

テーブル内の情報を選択して処理を実行する

複数サーバーに対してコマンドを実行する」ではテーブルに登録した全ての機器に対する一括処理を行う方法をご紹介いたしましたが、特定機器に対して処理を行う場合は一体どうすれば良いでしょうか。

機器の数が限られている場合は「ジョブフローを実行するフォームを作成する」に記載の「オブジェクトを指定させる場合」の手順にてフォームからテーブル内の機器を選べるようにしても良いですが、数が増えるとセレクトボックスが長くなり、対象機器が見つかりにくくなってしまいます。

こういったケースにおいて有用な機能として、今回の記事ではテーブルの関連オブジェクト機能を活用し、選択した機器を対象にジョブフローを実行する方法をご紹介します。

動作確認環境

ソフトウェア バージョン
Kompira 1.5.0

テーブルの作成

まずは機器情報を格納するためのテーブル「サーバー一覧」を作成します。Kompira上で機器情報を取り扱うためのオブジェクトとしてノード情報型が用意されておりますので、テーブルのオブジェクト型には「ノード情報」を指定します。
テーブルを作成したら、処理対象となる機器情報を追加してください。

ノード情報の追加

上記の例では「サーバー一覧」テーブルに「server1 ~ server3」の3台のサーバーを登録しています。
以降の説明はこの3台のサーバーが登録された仮定にて行います。

ジョブフローの作成

本記事ではサンプルの題材として、機器情報に登録されたホスト名・IPアドレスを表示するジョブを作成します。
下記の内容で、新規ジョブフローを作成してみましょう。

ジョブフローが作成できたら、パラメータ「servers」に機器情報を配列で渡し、動作確認をしてみましょう。
機器情報の配列は、例えば [./サーバー一覧/server1, ./サーバー一覧/server2] のように記載します。

関連ジョブの呼び出し

上記の例では、実行結果は次の様になります。

実行結果

関連オブジェクトの追加

ここまでの手順でテーブル・ジョブフローの用意が出来ましたので、実際に関連オブジェクトの設定をしてみましょう。
設定するにはテーブルの編集画面を開き、「関連オブジェクト」の欄のプルダウンから先ほど作成したジョブフローを選択し、「保存」をクリックします。
(本記事ではジョブ名を「関連ジョブ」としております)

関連オブジェクトの指定

設定保存後、テーブル内の機器情報を選択し、「その他」→「ジョブフローの実行」 をクリックします。

オブジェクトの選択実行

実行対象オブジェクトの確認画面が開きますので、「実行」をクリックします。

確認ダイアログ

以上の手順によりジョブフローが実行され、ジョブフローの動作確認時と同様の内容が表示されます。

実行結果

応用例

本記事の内容を利用すると、機器に対するオペレーションをテーブル上から簡単に実行することが可能となります。
例えば、テーブル上で選択した機器に対してパッケージアップデートを実施できるようにするには、次のようなジョブフローを関連オブジェクトとして登録します。
(Red Hat系のOS向けの例となります)

Kompiraでの文字列のパターンマッチング

Kompiraがチャネル、メールチャネル、API、kompira_sendevtモジュールなど、外部から受信したデータを解析して、ジョブフローの処理の起動を行ったり、処理条件を変える事があります。このような場合には受信した文字列を解析するために、文字列のパターンマッチングが必要となります。

動作確認環境

ソフトウェア バージョン
Kompira 1.5.0

Kompiraでパターンマッチングを行う場合には、パターン型オブジェクトを利用します。パターンの種別は、’r’ (正規表現パターン)、’g’ (glob パターン)、’e’ (完全一致パターン) の3種類があります。また、パターンマッチングを行う場合、大文字、小文字を区別しないモード (‘i’) を組み合わせることもできます。

パターン型オブジェクトを作成するには、組み込み関数”pattern()”を利用します。

引数:

■ pattern は、マッチングを行うパターンを指定します。
■ typ はパターンの種別を表し、 “r” (正規表現パターン)、”g” (glob パターン)、”e” (完全一致パターン) のいずれかを指定することができます。
■ mode には、”i”を指定すると大小文字を区別しないパターン照合となります。指定しない場合は、大小文字を区別します。

戻り値:
■ パターン型オブジェクト(ptn_obj)を返します。

パターン型オブジェクトは、文字列 s とパターンとのマッチングを試みるmatch()メソッドを備えています。

引数:

■ sは、マッチング対象の文字列を指定します。

戻り値:

■ マッチした場合は true、もしくはパターンが正規表現パターンの場合はマッチした情報を格納した辞書を返します。
■ マッチしなかった場合は、false を返します。

続いて、ログファイルの行をサンプルにして、各マッチング種別の動きを見ていきましょう。


完全一致パターン

完全一致パターンは、対象の文字列とパターンで指定した文字列が一致するかを確認します。
対象の文字列とパターンで指定した文字列が一致する場合はtrue, 一致しない場合にはfalseを返します。

上記の場合、ptn_1とのマッチング結果は結果は、trueとなり、ptn_2とのマッチング結果は、falseとなります。

rst_e_match

完全一致パターンは、以下のように単純な文字列比較として記述することもできます。


globパターン

globパターンでは、Unixのシェル形式のワイルドカードを用いることができ、以下の特別な文字に対応しています。

■ * すべての文字にマッチ
■ ? 任意の一文字にマッチ
■ [seq] seq にある任意の文字にマッチ
■ [!seq] seq にない任意の文字にマッチ
■ *、?、[などの特殊文字をエスケープしたい場合は、[*]、[?]、[[]のように[]で囲って記述する

ログに”[warn]”という文字列が含まれているかを判別する処理は、以下のよう(“*[[]warn[]]*”)に、globパターンを用いて記述することができます。
match()は一致する場合はtrue, 一致しない場合にはfalseを返します。以下の例では、ptn_1はtrueを返しますが、ptn_2はfalseを返します。

globパターンは、比較的単純なマッチングにおいて有効な方法です。


正規表現パターン

正規表現パターンは、プログラミング言語 Python の re モジュールの正規表現に準じています。
また、match()メソッドの応答は、完全一致やglob型と異なり、マッチした場合は、マッチした情報を格納した辞書を返します。( )でくくったグループごとに、マッチした文字列を返します。
(マッチしなかった場合は、”false”を返します)
以下の処理では、ログ取得の日時、ログレベル、メッセージの3つの情報にマッチさせて、それぞれ個別に表示します(ptn_1)。
マッチした文字列は応答中のgroupsに格納されます。マッチしない場合は、falseが返ります(ptn_2)。
特殊文字をエスケープしたい場合は、\をエスケープしたい文字の直前に記述します。

img_No-0198

正規表現でのマッチングは、glob型より複雑ですが、より細かい条件設定を行うことが出来ます。


パターンリテラル

これまではマッチングパターンのオブジェクトを作成するためにpattern()関数を利用してきました。
Kompiraでは、pattern()の代わりに、パターンリテラルを用いる事も出来ます。
パターンリテラルは、パターンの種別を表す ‘e’, ‘g’, ‘r’ のいずれかの文字に引き続き、一重引用符(‘)、もしくは、二重引用符(”)で囲まれた0個以上の文字(パターン文字列)で表現されます。

上記の「正規表現パターン」のジョブフローは、パターンリテラルを用いると以下のように既述することができます。

実行結果はpattern()を使った場合と同様になります。正規表現以外にも完全一致、glob型の場合も同様に記述する事が出来ます。


正規表現パターンの名前付きグループ

正規表現を利用してパターンを使って値を参照しようとする場合、値はgroupsという配列に格納されているため、パターン中の順序を意識する必要があります。
Kompiraでは、各パターンのグループに明示的に名前をつけることで、名前を用いて値を参照することができます。

名前つきグループのための構文は、固有拡張の一つ: (?P…) を使います。
上記の「パターンリテラル」のジョブフローを以下のように書き換えることで、名前付きグループを用いることができます。

それぞれの要素に”timestamp”, “level”, “message”という名前を付けています。
出力は、以下のようになります。

regex_title_ret

マッチさせた文字列は、groupdictという辞書に指定した名前をキーにして格納されていますので、上記の例では”match_rst.groupdict.timestamp”のように参照できます。

このようにしてパターン型オブジェクトやパターンリテラルを用いることで、文字列のパターンマッチングを行うことができ、文字列から必要な情報を取得したりするなど、文字列の解析を行うことができます。

Webページから内容を取得する

デスクトップでの作業を自動化するためにRPA (Robotic Process Automation) が広く知られています。しかし、ブラウザを通じたWebアプリケーションの操作であればブラウザとサーバ間の通信を模倣するだけで再現することができます。例えば特定のフォームに値を入力して送信するような操作や、Webページから値を抽出するスクレイピングのような操作を行うことができます。

ここではKompiraを用いて通信を模倣することで通常はブラウザ画面を用いて行う作業を自動化します。今回はWebサイトから内容を取得し、フィルタリングして表示するジョブフローを作成します。

htmlファイルを扱うためにPythonのライブラリであるBeautiful Soup4を使用します。ライブラリの使用に関しては「Pythonで記述された処理をKompiraから呼び出す」の記事にて紹介しています。このライブラリを用いて本コラムのタイトル一覧を取得します。

動作確認環境

ソフトウェア バージョン
Kompira 1.5.0
LinuxOS CentOS7.5_1804

Pythonライブラリの準備

まずPythonライブラリであるBeautifulSoup4を導入します。Kompira1.5では/opt/kompira/bin/pipを使用してライブラリをインストールします。
Kompiraサーバにログインし、以下のようにしてインストールします。

インストール後、つぎのコマンドを実行し情報が表示されればインストールされています。

htmlリソースの取得

まずKompiraの組み込み関数であるurlopen()を使いHTTPリクエストを送信して結果を取得します。urlopen()の詳細に関しては「簡単なWebサーバの監視をする」の記事にて紹介しています。今回はKompiraの運用自動化コラムのページのhtmlソースを取得するのでつぎのジョブフローを作成します。

取得に成功していた場合200が表示されます。

Kompiraライブラリの作成

今回はコラムページからタイトル一覧を取得するライブラリを作成します。ライブラリはHTMLリソースを取得するジョブフローと同じ階層にKompiraWebpageAnalyzerという名前で作成します。
ブラウザ付属のツールを用いてウェブページの内容を確認します。ここではChromeのデベロッパーツールを使って取得しています。

チャネルを利用して外部システムからデータを受信するというタイトルはつぎのような内容であることがわかります。

タイトルのタグとクラスがわかったので、タグが<a>でクラスが”qa-q”である要素を取得するライブラリを作成します。

ただこのままではタグ等がついたままで扱いづらいので、タイトル以外を除去して取得する関数をライブラリに追記します。

タイトル一覧の取得
作成したライブラリを使用してタイトル一覧を取得するようにジョブフローをつぎのように作成します。

実行に成功すればつぎのようにコラムのタイトル一覧が表示されます。

本記事ではコラムサイトのhtmlソースからタイトル一覧を取得しましたが、htmlソースの他のタグやクラスを指定することで様々な情報を取得することができます。例えばテーブルの内容を取得し、行ごとに処理する事ができます。取得したいデータがどのようなタグやクラスを持つか確認することでその値を取得し、自動で処理することが可能になります。

アラートメールをフィルタリングして転送する

Unix/Linux系OSではシステムのセルフチェックを行い、結果を管理者にメールで通知するといった仕組みが動いています。また、システム管理ツールがサーバ監視を行い、異常時にはアラートメールを送信するように設定しているケースも多くあります。しかし、管理しているサーバー数が多いとメールの数も膨大となり、すべてに目を通す事は現実的ではありません。そのため、受信したメールのうち警告の通知だけを読みたい、もしくは障害通知だけ受け取れればよいといった要望があります。

今回は、受信したメールのうち差出人やタイトルが一定のパターンに一致するものをフィルタリングし、転送するジョブフローを作成します。

動作確認環境

ソフトウェア バージョン
Kompira 1.5.0
LinuxOS CentOS7.5_1804

メール転送の設定

ここでは、メールサーバーよりIMAP4/POP3プロトコルを通じて、メールを取り込む「メールチャネル」を利用します。取得の際、メールはサーバーから削除されます。またKompiraのメールチャネルがチェックできるアカウントは1つであるため、メールサーバーにKompira用のメールアカウントを作成し、そのアカウントにメールが転送されるように設定を行ってください。

メールチャネルの設定

まず、メール受信を行うためのメールチャネルを作成します。
先程設定した転送先のメールアドレス宛のメールを受信する、 ”メール受信チャネル”という名前のメールチャネルを作成します。メールチャネルの詳細については、「メール受信をトリガーにしてジョブフローを実行する」にて紹介しております。

メールを処理するジョブフローの作成

ここでは
(1)メールアドレスを抽出するジョブフロー
(2)メールを転送するジョブフロー
(3)メールサーバーから受信し、他のジョブフローを呼び出すジョブフロー
の3つを作成します。

(1) メールアドレスを抽出するジョブフロー

メールアドレスの形式としては “taro@example.jp” といったアドレスだけを記載したものと、 “コンピラ太郎 <taro@example.jp>”のようにアカウントの名前が併記されているものがあります。アカウント名が併記されている場合にはFrom行からアドレス以外の項目を除外します。

次のジョブフローを「アドレス抽出」という名前で作成します。

3行目では、正規表現を用いて< >で囲まれた部分をメールアドレスとして取り出すためのパターンを記述しています。パターン型データのメソッド match( ) は、 文字列と正規表現がマッチすればその情報を辞書型にして返し、マッチしなければfalseを返します。ここでは< >で囲まれていなかった場合は全文を、囲まれていた場合はその中身を取得しています。

(2) メールを転送するジョブフロー

メールの転送は mailto()関数を使って行います。詳細については「メールを送信する」を参照してください。メールが平文の場合はmailto()関数でそのまま送信することができますが、メッセージがHTML形式ものなど追加の処理が必要になる場合があります。

最初に、受信メールを扱いやすくするためにmail_parse()関数を用いて辞書型データに変換します。本文の内容はキーワード”Body”で取得できます。メールが平文の場合(Content-Typeが”text/plain;”の場合)は

のようになりますが、HTML形式のメッセージと一緒に送られる場合(Content-Typeが”multipart/alternative;”の場合など)は

のように平文とHTMLがそれぞれ配列の要素として格納されます。 このため、Body要素で渡されたデータが文字列の場合はそのまま処理を行い、配列の場合はそれぞれの要素を抽出して処理を行います。 この処理を行うジョブフロー「メール転送」を次のように作成します。

このジョブフローではtype()関数を用いて、本文の型をチェックしています。平文の場合には”String”という文字列が返りますので、このままmailto()関数のbodyパラメータに渡します。それ以外の場合は配列と判断し、平文部分をbodyパラメータに、HTML部分をhtml_contentパラメータに渡します。

(3) メールサーバーから受信し、他のジョブフローを呼び出すジョブフロー

ここでは、作成したメールチャネルとジョブフローを組み合わせ、実際に転送を行うジョブフローを作成します。
条件として
(1) タイトルに”ALERT”または”WARNING”という文字列を含む
(2) 差出人が “loginaccount@system.local”である
の両方を満たす場合にメールを転送するものとします。
メールの差出人は適宜変更してください。
条件を満たさない場合には”スキップします”というメッセージを表示して次のメールを処理します。

転送条件として各ヘッダーの項目や本文の内容などを用いる事が出来ます。例えば受信日時は msg_dict.Date で参照することができます。本文を処理する際にはジョブフロー「メール転送」で見てきたように、HTML形式のメッセージの扱いにご注意ください。システムから送信されるメールが対象の場合はほぼ全てが平文のメールであるため、HTMLを含むメールを無視しても問題は少ないと思われますが、処理する対象によっては重要となります。

また本文の構造が複雑な場合には、Kompiraジョブフローのパターンマッチングだけでは難しい場合があります。その場合はKompiraのライブラリ型オブジェクトを使うことで、Python言語の文字列処理関数を利用できます。ライブラリ型オブジェクトについては、「Pythonで記述された処理をKompiraから呼び出す」を参考にしてみてください。

Active Directoryにユーザーを登録する

「Active Directoryから情報を取得する」では、Active Directoryの登録情報をKompiraから参照する方法をご紹介しました。今回は同様の手法でActive Directoryに新規のユーザーを登録してみます。
(Active Directoryは既存のサーバーを利用する想定です。)

※本記事はKompira v1.4.10post2, Windows Server 2016を利用して検証しております。掲載時点の情報であり、最新のものとは異なる場合があります。予めご了承ください。

 
事前準備

前回同様「Windows PowerShell 用 Active Directory モジュール」を使用します。Active Directoryサーバーにインストールしてください。

 
スクリプトジョブの作成

まずはユーザーを登録するスクリプトジョブを作成します。使用するコマンドレットは「New-ADUser」です。

New-ADUserに渡す各引数は、スクリプトジョブの引数として指定します。パラメータの順番に注意してください。

–Surname で指定した内容が「姓」に、-GivenName で指定した内容が「名」に、-DisplayName で指定した内容が「表示名」に、-UUserPrincipalName で指定した内容が「ユーザーログオン名」に設定されます。
パスワードはただの文字列ではなく、SecureString 型である必要があるので、ConvertTo-SecureStringコマンドレットを用いて変換します。

 
ジョブフローの作成

続いてスクリプトジョブ「AddUser」に引数を渡して実行させるジョブフローを作成します。

ここで注意点としては、スクリプトジョブ「AddUser」は登録に失敗した場合でも戻り値に0を返すということです。このため失敗の判定はエラーメッセージ$ERROR変数に値が格納されているかで行います。

登録に成功した場合には、以下のように表示されます。
登録成功

この場合、Active Directoryサーバーで登録されたアカウントのプロパティを見ると次のようになります。
ユーザーのプロパティ

同じ条件で2回ジョブフローを実行すると重複登録のエラーになりますが、その際の画面は次のようになります。
登録エラー

Active Directoryのユーザーには、所属部門や電話番号、メールアドレスなど様々な属性情報を登録する事が出来ます。また初回ログイン時にパスワード変更を強制するなどもできます。「New-ADUser」コマンドレットも多くの属性をサポートしています。詳細はTechNetの解説記事などを参照してください。

ユーザー登録に成功したら、該当ユーザーに登録内容の通知メールを送るように、ジョブフローを拡張することもできます。各組織での運用状況に応じて設定項目を調整してください。

Active Directoryから情報を取得する

Windowsで情報システムを構築している場合、規模が大きくなるにつれて管理負荷が大きくなるため、Active Directoryを利用してアカウントやIT資源の集中管理を行います。今回の記事ではKompiraからActive Directoryにアクセスして、登録されている情報の検索を行います。
(Active Directoryは既存のサーバーを利用する想定です。)

※本記事はKompira v1.4.10b0, Windows Server 2016を利用して検証しております。掲載時点の情報であり、最新のものとは異なる場合があります。予めご了承ください。

 
事前準備

Active DirectoryはLDAPやDNSなどの仕組みを利用した管理基盤です。Kompiraからのアクセス方法はLDAPの利用なども考えられますが、今回は「Windows PowerShell 用 Active Directory モジュール」を利用して、KompiraのスクリプトジョブからPowerShellでの操作を行います。

Active Directoryサーバーのサーバーマネージャーを起動してから、「機能」>「機能の追加」>「役割と機能の追加ウィザード」>「機能」>「Role Administration Tools」>「AD DS and AD LDS Tools」と選択します。「Active Directory module for Windows PowerShell」のチェックを指定して、インストールを選択してください。(デフォルトでインストールされていた場合には、そのままで構いません。)

AD Module

またKompiraからWindowsサーバーにアクセスできるように、WinRMの設定を行う必要があります。詳細は以前の記事Windowsでリモートスクリプトを実行する(その1)の、「Windows側での設定」をご参照ください。

 
スクリプトジョブの準備

Active Directoryモジュールに含まれるコマンドレット(Cmdlets)については、以下の記事を参照してください。

Windows Tech Net: Active Directory Cmdlets in Windows PowerShell

またスクリプトジョブを作成するにあたり、各コマンドレットの動作確認はサーバー側のWindows PowerShellウィンドウを使ってコマンドを投入してみると良いでしょう。

PowerShellを利用して上述のコマンドレットからActiveDirectoryを操作するためには、最初に以下のコマンドレットを実行して、ActiveDirectoryモジュールをインポートしておく必要があります。

では、「直近の30日間ログオンしていないユーザーを検索」というスクリプトジョブを作成します。拡張子に”ps1″を付けることを忘れないでください。

あわせて、ActiveDirectoryサーバーのノード情報、アクセスするアカウント情報のオブジェクトも作成してください。

上記のジョブフローを実行すると以下のような結果となります。

実行結果

このように検索条件に該当するユーザーアカウントの情報が列挙されます。

出力結果を扱いやすくするため、「ConvertTo-Json」コマンドレットを使用してJSON形式にしてみましょう。

出力をテキストエディタで整形すると次のようになります。

JSONデータ

 
ジョブフローからスクリプトジョブを呼び出す

スクリプトジョブからの応答をJSON化した所で、これを利用するジョブフローを作成してみます。
例として、ユーザー名を抽出して表示します。

スクリプトジョブからの応答はJSON形式の文字列のため、これをKompiraの辞書形式のデータにするためにjson_parse()関数を利用しています。

実行結果は以下のようになります。

検索結果

今回の記事では、PowerShellを使ったスクリプトジョブから、Active Directoryの情報検索を行いました。モジュールにはユーザーや機器の情報登録・参照・削除などの多くのコマンドレットが用意されているため、同様の手法でWindows関連のリソース管理をKompiraから行う事が出来るでしょう。

Slackでの投稿をKompiraに通知する

KompiraからSlackに通知する」では、KompiraからSlackのチャネルにメッセージを投稿する方法をご紹介しました。
今回は逆にSlackのチャネルに投稿したメッセージをKompiraで受信してみましょう。
(※) 本記事の内容を動作させるためには、Kompiraがインターネットから接続できる場所に配置されている必要がある点にご注意ください。

環境

ソフトウェア バージョン
Kompira 1.4.10.post3

Slackの設定

KompiraからSlackに通知する」の例と同様に、お使いのSlackのアカウントに#kompiraチャネルを利用します。

次にSlackの#kompiraチャネルに投稿されたら、それを外部に送信できるように、「Outgoing WebHooks」の設定をします。
channel settings > Add an app or integration > 検索窓に「Outgoing webhooks」と入力をしてOugoing Webhooksの設定ページを表示しましょう。
Outgoing WebHooks

左の「Add Configuration」ボタンをクリックします。

Outgoing WebHooks

「Add Outgoing Webhooks integration」をクリックします。

次に表示される画面で外部にリクエストを送る際の設定を行います。

項目名
Channel #kompira
Trigger Word(s) echo,shell
URL(s) http://(kompiraサーバのIPアドレス)/system/channels/Alert.send?format=json&token=XXXXX (KompiraのREST API呼び出し時のセキュリティートークン)

その他の項目はデフォルトのままで結構です。
「Trigger Word(s)」の項には「echo,shell」を設定しました。「echo」または「shell」から始まる投稿のみKompira側に通知されるようになります。

ここまでの設定で、Slackの#Kompiraチャネルでの投稿がKompiraのAlertチャネルに送信されるようになりました。

KompiraでSlackの投稿を受信

次の様なジョブフローを実行して、チャネルに送信されたデータを見てみましょう。

ここで#kompiraチャネルに「echo hello」と入力すると、Kompira側のコンソールには、次のような表示が現れます。

投稿した文字列「echo hello」だけでなく、ユーザ名、チャンネル名、マッチングしたトリガー名などの情報が含まれています。
トリガーと以降の文字列を分離したいので、簡単なライブラリを作成し、ジョブフロー「Slack受信」を以下のように書き換えてみましょう。

このジョブフローを実行させて再度Slack側で「echo hello」と投稿すると、以下のような結果となります。

これで、Triggerとなった文字列と以降の文字列を分けて扱えるようになりました。

受信文字列を利用してジョブを実行する

次に、Slackから受信した投稿内容ごとにジョブを作り、実行させてみましょう。
新しくジョブフロー「エコー」と「コマンド実行」を作成し、それを「Slack受信」から呼び出すように変更します。

Slackでの投稿が「echo」から始まっていればジョブフロー「エコー」が実行されます。「shell」から始まっていればジョブフロー「コマンド実行」が実行されます。
それぞれのジョブフローのreturnに渡された文字列は、ジョブフロー「Slackへ通知」をそのまま渡しています。このジョブフローは、「KompiraからSlackに通知する」で作成したものです。

「Slack受信」を実行させたまま、Slack側で発言をしてみましょう。

echoから始まる文字列のときは、echo以降に指定された文字列がそのまま帰ってきます。
shellから始まる文字列のときは、shell以降に指定された文字列をコマンドとして実行し、その結果が帰ってきます。

この機構を利用して、echo, shellの他にもいろんなコマンドを追加することができます。
本コラムでご紹介しているKompiraの機能と組み合わせてみてください。

KompiraでGoogle SpreadSheetの読み書きをする

KompiraでExcelファイルの読み書きをするという記事でKompiraからExcelファイルを読み書きする方法をご紹介しました。今回の記事では同様にGoogleスプレッドシートに対してアクセスする方法をご紹介します。

※KompiraのバージョンがKompira 1.4.9.post5以前の場合には、Googleスプレッドシートにアクセスする際に警告メッセージが出る場合があります。1.4.9.post6以降のバージョンにアップデートするか、次のように必要となるPythonモジュールをアップデートしてから、Kompiraのプロセスを再起動してください。

Pythonライブラリの準備

Excelの場合と同様に、Pythonの外部ライブラリを使用します。今回はスプレッドシートを操作する”gspread”とOauth認証関連の”oauth2client”を導入します。
Kompiraサーバーにログインした後に、以下のようにしてモジュールをインストールします。

Googleスプレッドシートの作成

Googleアカウントを取得して、スプレッドシートを1つ作成します。ここでは”kompira”という名前のスプレッドシートを作成して、A1セルに”Hello, world”と記載しました。
Googleスプレッドシート

Google API Consoleページで、「プロジェクトの作成」をクリックして新規プロジェクトを作成します。

プロジェクト作成

上図では”kompira”という名前で作成しました。名称は任意で結構です。

次にAPI Console画面で、「有効にする」をクリックします。

Drive API

続いて、左の「認証情報」を選んで、画面から「認証情報を作成」ボタンをクリック。「サービスアカウントキー」を選択します。認証情報

適当なサービスアカウントを選択して、”Key type”は”JSON”を選択して、”Create”をクリックします。

サービスアカウントキー

この後、認証キー情報のJSONファイルがダウンロードされます。このファイルはKompiraサーバーの”kompira”アカウントから参照できるディレクトリに転送しておきます。
今回は”/tmp/***.json”となるように保存しました。

次に先に作成したスプレッドシートにユーザーを登録します。ダウンロードしたJSON形式の認証情報ファイルを開いてみると、”client_email”をキーとした次の様な情報が記述されています。

※記載内容はサービスアカウント名やプロジェクト名称によって変わります。

このアドレスをスプレッドシート右上の「共有」ボタンを押した画面で登録します。

アドレスを登録

APIライブラリの設定
APIライブラリの設定画面で、作成したプロジェクトにAPIライブラリを追加します。

外部からGoogle SpreadSheetにアクセスするためには、以下の2つのライブラリが必要となります。

  • – Google Drive API
  • – Google Sheets API

APIライブラリを選択し、「有効にする」ボタンを押下してください。

プロジェクトのダッシュボードで、追加した2つのAPIが有効化されていることを確認できます。

ここまでで、認証情報の設定とスプレッドシートの準備ができました。続いてKompira上でのジョブフローを作成していきましょう。

ライブラリとジョブフローの作成

まずはライブラリを用意します。ここでは”gspread”という名前で作成しました。
KompiraでExcelファイルの読み書きをする」の場合と同様に、1つのセルの値を読み出す”get_cell_value”というメソッドを実装してみます。

次に、このメソッドを利用する”sample”ジョブフローを作成します。

スプレッドシートは次のように、名称が”kompira”、シート名が”シート1″になっています。
シート

ジョブフローは次のように記述できます。

実行すると次のようにコンソールに表示されます。

コンソール画面

※ここで”InsecurePlatformWarning”などの警告メッセージが表示される場合には、冒頭でご案内した通りに、Kompira本体のバージョンアップを行うか、Pythonモジュールの入れ替えを行ってください。

このようにしてgspreadモジュールのAPIを呼び出す事で、Googleスプレッドの値を読み込み・記入する事が可能です。今回は”acell”メソッドを使った指定セル値の読み込みのみをご紹介いたしましたが、他にも列指定やシート全体の読み込み、記入をはじめ、シートの作成なども行えます。詳細はgspread API Referenceをご覧のうえ、必要なライブラリ・メソッドを追加してご利用ください。

Kompira上のデータをバックアップする(その3)

「Kompira上のデータをバックアップする(その1), (その2)」では、Kompira上のデータをJSONデータとしてバックアップする方法をご紹介しました。

JSONデータは単純に保存しておいたり、別の環境に移行させる場合は単一ファイルとなっていて扱いやすいのですが、各オブジェクトの差分を見るといった用途には適していません。
今回は”manage.py”のサブコマンド”export_dir”を使って、Kompiraサーバのファイルシステム上にKompira上のデータを展開する方法をご紹介します。

実行例の事前準備として、「Kompira上のデータをバックアップする(その2)」と同様に、ディレクトリ”jobflows”の中にジョブフロー”jobflow1~3″、アカウント情報、ノード情報のオブジェクトを作成します。

サンプルジョブフロー

 
バックアップの取得

次の実行例は、”manage.py export_dir” を用いたバックアップの取得です。

ここでは元のディレクトリ階層に対応して、カレントディレクトリ以下にディレクトリおよびファイルが作成されます。
Kompira上の各オブジェクトは、オブジェクトの型に応じたフィールド値を持つYAMLファイルとして出力されます。
ジョブフローやWikiなど、一部のオブジェクトでは「代表フィールド」が内部で設定されています。このようなオブジェクトがエクスポートされた場合は、代表フィールドの内容を持つ単一のファイルと、それ以外のフィールドの値を持つ「.(ドット)」始まりのファイルの2つが出力されます。

 
バックアップデータからのリストア

次の実行例は “manage.py import_dir”を用いたバックアップデータからのリストアです。

特にリストア先のディレクトリを指定しない場合には “/” 以下に展開されます。

リストア先を明示的に指定する場合には “–directory” オプションを利用します。
以下の例ではバックアップしたジョブフロー、アカウント情報、ノード情報のオブジェクトをKompira上の “/root/restore” に展開しています。

例えばジョブフローをはじめとするKompira上のオブジェクトの差分管理をしたい場合は、”export_dir”により出力されたディレクトリをgitリポジトリに含めるとよいでしょう。

注意点として、Kompira 1.10時点ではexport_dirにオブジェクトに設定した権限情報を含めることができません。
もしKompiraのオブジェクトで権限情報を設定していて、それらの情報も含めて保存したい場合は”export_data”を併用してください。

例: “export_data”で出力したジョブフローの情報(一部抜粋)

例: “export_dir”で出力したジョブフローの情報

このように”export_dir”で出力した場合には、パーミッション情報(user_permissions, group_permissions)もあわせてエクスポートされます。

Kompira上のデータをバックアップする(その2)

Kompira上のデータをバックアップする(その1)では、Kompira上のデータをブラウザ上で操作することでバックアップする方法をご紹介しました。
今回は、同様の操作をコマンドラインから行ってみましょう。

 
manage.py

Kompiraサーバー上で利用できるユーティリティーコマンドは /opt/kompira/bin に格納されており、manage.py もその中の1つです。
利用方法は –help オプションをつけて実行すると表示されます。

また、各subcommandの使い方についても、同様に manage.py help “subcommand”で表示されます。例えば、サブコマンド”import_data”のヘルプは以下のように表示されます。

 
バックアップの取得

ここでは次の図のように、/root/jobflows ディレクトリの中に3つのジョブフローが格納されている状態を想定します。
サンプルジョブフロー

次のように/root/jobflows以下のバックアップを取得するにはexport_dataサブコマンドを利用し、ファイル”backup-jobflows”に格納します。

このコマンドを実行すると”backup-jobflows”という名前のJSON形式のデータファイルがカレントパスに作成されます。

これを使ってリストアするには、import_dataサブコマンドを利用します。(取得したパスと同じに展開されます)

これで /root/jobflows のリストアが完了しました。
(注意:上記の例でのパスは、Kompiraサーバー上のLinuxファイルシステム上のパスではなく、Kompira上のディレクトリオブジェクトを指しています。Linuxファイルシステム上のパスとKompira画面で見られるオブジェクトのパスは対応していません。)

 
相対パスでのバックアップの取得

Kompiraのエクスポート・インポート機能では、操作しているディレクトリからの相対パスでJSON形式のバックアップデータが作成されます。例えば、/root内で ./jobflows のバックアップを取得したら、展開するときはカレントパスの直下に./jobflowsを作成します。例えば作業ディレクトリを /root/restoreにした場合には、/root/restore/jobflowを作成することを意味します。

manage.pyを利用して、これと同じようなバックアップファイルを作ります。

上記のように–directoryオプションを使うとパスが指定され、カレントディレクトリからの直下に ./jobflows ディレクトリがあると想定されます。

このバックアップファイルを利用して、 /root/restore ディレクトリにリストアして展開してみます。

この場合には次のように /root/restore以下に ./jobflows として展開されます。

サンプルジョブフロー

このようにして、コマンドラインのユーティリティー manage.py を利用してオブジェクトのバックアップファイルを取得することができます。

Kompira上のデータをバックアップする(その1)

ジョブフローや各種のKompiraオブジェクトを作成して自動化していると、ジョブフローの書き換えの際の予備やシステム障害に備えたバックアップを取得しておく必要が出てきます。本記事ではエクスポート/インポート機能を利用して、Kompira上に作成したデータのバックアップ/リストアをする方法をご紹介します。

(※検証に利用したKompiraのバージョンは 1.4.10b0です。)

 
オブジェクトのエクスポート

まずはエクスポート機能を利用して、バックアップ用のファイルを取得する方法をご紹介します。

オブジェクトを1つだけバックアップする場合には、オブジェクト名を右クリックして「エクスポート」を選択します。
img_No-0140

「オブジェクトのエクスポート」ダイアログが表示されますので、対象オブジェクトが選択されているのを確認して「エクスポート」ボタンをクリックします。
エクスポート・ダイアログ

次はブラウザによって異なりますが、「kompira_export.json」という名前のファイルをダウンロードするように確認が行われます。必要に応じてダウンロード先のフォルダを変更したり、ファイルの名前を変えてください。
確認ダイアログ

ダウンロードしたファイルはJSON形式のテキストファイルです。内容はメモ帳などのテキストエディタで確認する事が出来ます。
エクスポートファイル

この「kompira_export.json」ファイルを適当なフォルダ等に移動して保管しておいてください。ダウンロード時のファイル名は固定です。(ブラウザによっては既存のファイルがある場合には「kompira_export(1).json」のような命名規則で別ファイルで保存されます)拡張子以外は名称を変更しても構いません。ファイルを取得した年月日などを付けても良いでしょう。以後は「バックアップファイル.json」という名前に変更したとします。

上記の例ではディレクトリ型のオブジェクトを選択してバックアップしましたが、この場合には階層下にあるオブジェクトもまとめてバックアップされます。

 
複数オブジェクトのエクスポート

複数のオブジェクトをまとめてエクスポートする場合は、エクスポートしたいオブジェクトについて、画面左側のチェックボックスを選択し、「その他」->「エクスポート」を選択することでエクスポートを行うことができます。
複数ファイルのエクスポート

以後はオブジェクト1つのエクスポートの場合と同様に確認ダイアログが表示されますので、クリックして進めてください。

 
オブジェクトのインポート

続いてバックアップしたJSONファイルを利用してオブジェクトのリストアを行います。こちらの場合も2通りのやり方があります。

(1) リストア先となるKompiraのディレクトリオブジェクトの名前を右クリックして「インポート」を選択します。
インポートメニュー

(2) 「オブジェクトのインポート」ダイアログで、バックアップしたJSONファイルを選択して、「インポート」ボタンをクリックします。
例えば「ジョブフローを修正している最中に動きがおかしくなったので元に戻したい」というようなケースでは、ここで「既存オブジェクトを上書きする」のチェックを有効にしてください。

確認ダイアログ

(3) インポート処理の結果は画面上部に表示されます。各項目の意味は以下表の通りです。

フィールド 説明
created 新しく作成されたオブジェクトの数
updated 上書きされたオブジェクトの数
skipped (上書きされずに)スキップされたオブジェクトの数
warning 何らかの警告が出たオブジェクトの数
error インポートエラーとなったオブジェクトの数

 

インポートの結果

warning, errorに値が入っている場合には、何らかの不具合が生じている可能性がありますので、リストアされた結果をご確認の上、必要に応じて再度処理を行ってください。
warning, errorの詳細については、Kompiraがインストールされているサーバの/var/log/kompira/kompira.logを参照してください。

※インポートする際にエラーが発生する場合、以下のような理由が考えられます。
・書き込み権限がないディレクトリにインポートしようとしている。
・インポートした結果、オブジェクト数がKompiraのライセンスで規定された数を越える。
・エクスポートした際のKompiraのバージョンとインポートするKompiraのバージョンが異なる。

またインポート処理は、選択したディレクトリ直下に作成される点にご注意ください。上記のケースではバックアップは「/root」ディレクトリで「ジョブフロー」ディレクトリーをエクスポートしました。

そして「/root/ジョブフロー」ディレクトリを選択してインポートすると、下図の様に「/root/ジョブフロー/ジョブフロー」と展開されます。つまり、上書きで戻したい場合には1つ上のディレクトリーで「/root」を選択してインポートする必要があります。
インポート先ディレクトリ

またエクスポートした場合と同様に、上部の「その他」->「インポート」を選択してインポートを行うこともできます。この場合、表示されているディレクトリ自体がリストア先となります。

その他からのインポート

ジョブフローの書き方FAQ(その2)

ジョブフローの書き方FAQ(その1)に続いて、ジョブフローの書き方に関するFAQをご紹介します。

 
(1) オブジェクト名の命名規則

命名時のルールとしては次の様なものがあります。
・アルファベット、数字、アンダーバー(“_”)、日本語を使うことができる
・先頭の文字は数字以外でなければいけない
・アルファベットの大文字と小文字は区別される
・オブジェクトの名称の長さは128文字以内でなければいけない
・絶対パスの長さは1024文字以内でなければいけない

以下に具体例を示します。

オブジェクト名 有効かどうか 備考
AAA (半角) OK
_AAA (半角) OK
111 (半角) NG 数字で始まるためNG
AA-B (半角) NG ハイフンが含まれるためNG
AAA (全角) OK
111 (全角) OK 数字から始まるが、全角文字のためOK
いろは (全角) OK
*A (全角) NG
-A (全角) NG
_A (全角) NG

「-(ハイフン)」が使用できないことに注意してください。
また、全角の数字については先頭であっても使用できますが、全角の記号は半角記号と同じく、名前に含めることはできません。

 
(2) 状態変数を文字列の中に埋め込みたい

Kompiraでは、文字列の中に$付きで変数名を記述すると、ジョブフロー中に定義されている変数の値に置換して文字列とする機能があります。

Kompiraでは各命令の結果を格納する$RESULT, $STATUS, $ERROR, $DEBUGという変数が存在し、これらを「状態変数」と呼んでいます。
これらは変数名自体に「$」が入っているので、 “$RESULT” と書いただけでは文字列の中で値を展開させることができません。

この場合、 “${$RESULT}” のように、 { }で囲むように記述することで値を展開させることができます。

 
(3) 変数で扱える数について

Kompiraの変数では整数を扱うことはできますが、小数点がつく実数は扱えません。

システム運用目的のジョブフローの場合には、あまり小数を扱うケースはありませんが、例えば構成管理でミドルウェアのバージョン番号などを保存しておきたいようなケースでは、数字を文字列として扱う必要がありますので、ご注意ください。

 
(4) sshコマンド実行時の状態について

Kompiraでは[“コマンド”] という構文を使用することで、ローカル/リモートサーバ上でコマンドを実行させることができます。
このとき、[“コマンド”]はそれぞれ個別に通信が発生して実行されます。よって、前の[ ]の処理で実行した一時的な設定は、次の[ ]に引継ぐことができません。
具体的には、ディレクトリの変更を行うcdコマンドや、環境変数のexportコマンドの結果などが引き継がれません。

UNIX/Linuxが対象の場合は、上記のように”;”を使って処理を連続させることで回避することができます。

また、cdを行いたい場合は、__dir__制御変数を使用することでコマンド実行時のワーキングディレクトリを指定することができます。

より長い手順を実行する必要がある場合は、スクリプトジョブ型オブジェクトを使用してスクリプトにより処理を実行するようにする、もしくはsessionブロックを利用するといった方法があります。

 
(5) 外部コマンド結果の受信タイミングについて

Kompiraの[“コマンド”]構文を使用してコマンド実行を行う場合、Kompiraは実行したコマンドが終了したタイミングですべての結果を取得します。
ジョブフローを実行すると、コンソール画面には外部コマンドの実行結果が表示されますが、表示されるのはコマンドが終了したときです。
例えば、終了するまで1分かかるようなコマンドを実行する場合、コンソール画面では出力を逐次表示するのではなく、終了時にすべての出力が表示される、という動作となります。

また、手動でCtrl+C(SIGINTシグナルの送信)をすることで停止することが想定されているようなコマンドは、停止させることができません。(例: tail -f, topなど)
この場合、コマンドのオプションで停止するような動作にできるかどうかを調べてみてください。

上記例の “vmstat 1 30” は、シェルログインしたコンソール上で実行すると1秒ごとに表示が追加されますが、Kompiraでは30回の結果表示が完了し、コマンド自体が終了したタイミングで結果を取得します。

 
(6) 文字列の指定に使用する ‘ と ” は何か違いがあるか?

特にありません。どちらも対になる記号を入れて利用します。

“hello ‘ world”
‘hello ” world’
のように、 ‘ や ” の文字を文章中に含めたい場合には、それとは別の記号を引用符として使う事で扱えるようになります。

 
(7) 配列や辞書の要素を削除したい

del_itemメソッドを使用することで、配列および辞書の要素の削除をすることができます。

また、辞書に対してはpop_itemというメソッドを使用することができます。
pop_itemは、指定されたキーを辞書から削除し、値を$RESULTに格納します。また、キーが存在しない場合のデフォルト値もあわせて指定することができます。

ジョブフローの書き方FAQ(その1)

ここでは、毎月第3木曜日14:30~定期的に開催しているKompiraのセミナーでご質問頂いたジョブフローの書き方についてご紹介します。

 
(1) 文字列と数字を”+”したらどうなるの?

Kompiraの変数は型を持ちませんので、その時に格納されている値を評価します。その際にどのようなリテラル(型)で評価するかにより、演算の結果が変わります。

(a) は2つの変数val1, val2の値が整数と評価されるので、足し算されます。
(b)は両方とも文字列なので”+”は文字列結合となります。
(c),(d)は型の変換の例で、整数を文字列にする場合にはstring()を、逆に文字列を整数にする場合はint()を用います。
(e)の整数+文字列の場合には型の異なる変数間の演算となるため実行時エラーとなります。

 
(2) ジョブフローのパラメータに123と書いた場合と”123″と書いた場合の動きの違いは?

こちらも上記の質問の場合と同様に、それぞれ整数、文字列で評価されます。

 
(3) 変数に型宣言は出来ないのか?

出来ません。

・ジョブフローのパラメータ指定で入力値に制約を持たせたい場合には、フォーム機能の「フィールド種別」で限定する事が出来ます。
参考:ジョブフローを実行するフォームの作成

・ジョブフロー中で整数を文字列に、文字列を数字に変換したい場合にはstring(), int()のような組み込み関数を用いて型変換を行ってください。

 
(4) 変数のスコープはどうなっているの?

・基本的にはジョブフロー内から参照できます。 (ジョブフロースコープ)
・{ } で囲まれた単純ブロックで定義された変数やループ変数は{}内に限定されます。 (ブロックスコープ)

 
(5) 配列要素を文字列中に展開する方法はあるか?

配列要素を直接文字列の中に埋め込むことはできないため、ブロックスコープか”%”演算子を使用して表示します。

 
(6) プレイスホルダーに複数の辞書変数から置換する方法は?

文字列 % 辞書変数 の “%”は演算子であり、文字列に近い方から適用されます。

(a)の場合、最初にdict1の”%k1″が置換されます。後ろのキー “%k5″はdict1にキーが無いため、置換されません。
2つ目の%演算子でdict2のキーで”%k5″が置換されます。

つまり、以下のように文字列が置換されて行きます。

(b)では dict1, dict2ともに k3 というキーを持ちます。これも(a)と同じルールで置換していくと以下のようになります。

このようにして、複数の辞書変数を用いて文字列置換を行う事が出来ます。

公開鍵認証を使ってssh接続をする

Kompiraからリモートサーバーに接続してコマンドを投入する際には、sshで接続を行います。この際、パスワード認証以外に公開鍵認証を利用する事が出来ます。本記事ではKompiraから公開鍵認証を用いてssh接続を行うための設定方法をご紹介します。

本記事では接続対象のサーバーとしてCentOS 7.3およびUbuntu Linux 16.10で動作確認を行っております。

 
証明書の作成

まずはKompiraサーバーにて証明書ファイルを作成します。Kompiraが動いているサーバーにsshを使ってログインしてください。
次のように、ssh-keygen コマンドを使って作成します。

上記の例では以下の2つのファイルが作成されます。
kompira.key   (秘密鍵)
kompira.key.pub (公開鍵)

 
リモートサーバーでの証明書の登録

作成したファイルのうち、公開鍵は接続先のサーバーに、秘密鍵はKompiraを利用するPC等に、それぞれ転送します。
以下の例では接続用のアカウントのホームディレクトリの配下に “.ssh”ディレクトリがあり、その中にある “authorized_keys”ファイル中に公開鍵を転記します。
既存のディレクトリ/ファイルが存在している場合には、 mkdir, touchコマンドは省略してください。またディレクトリ/ファイルの権限については他のアカウントからアクセス出来ないようにしてください。(権限設定が弱いと通信を試みる途中で停止する場合があります。)

 
Kompiraのジョブフローでの利用

下図はKompiraの”アカウント情報”型のオブジェクトの作成例です。
・接続用のアカウントは”kompira”になっています。
・パスワード欄には鍵のパスフレーズを指定します。
・ssh鍵ファイル欄は、PC等に保管した秘密鍵を指定します。
・ssh鍵パスフレーズは、証明書を作成時に指定したパスフレーズを入力します。 (「パスワード」欄に記載がある場合は省略可)

sudoパスワードとssh鍵パスフレーズが異なる環境の場合は、パスワード欄にsudoパスワードを、ssh鍵フレーズ欄にパスフレーズを入力してください。

アカウント

ノード情報は従来同様に作成します。IPアドレスとアカウントの指定は最低限行ってください。

ノード情報

最後にジョブフローですが、例えば以下のように書くことができます。

ジョブフロー

ここでは”hostname”コマンドの実行結果を表示しています。
実行結果

このようにKompiraからはID/パスワード認証だけでなく、公開鍵を利用した接続を行う事が出来ます。

Windowsでリモートスクリプトを実行する(その2)

Windowsでリモートスクリプトを実行する(その1)では、Kompiraからスクリプトジョブを利用してWindows機でバッチファイルを実行しました。
今回の記事ではWindows機でPowerShellスクリプトを実行してみましょう。

※本記事ではWindows Servver 2012 R2(PowerShell version 4)で動作確認をしております。

 
PowerShellスクリプトとは

歴代のWindowsにはcommand.com/cmd.exeといったコマンドラインツールが付属し、いわゆるMS-DOS時代からのバッチ実行が出来るようになっていました。これを補強する意味でWindows98からWindows Script Host(WSH)が提供されましたが、セキュリティ面での問題が指摘されるに至って、広く普及しませんでした。
そこで自社OSのシステム管理や自動化を行うための新世代シェル/プログラミング言語としてPowerShellを発表しました。
PowerShellは多くのコンポーネント(コマンドレット)を組み合わせたタスクで構成されます。

 
実行ポリシーの変更

本記事ではWinRMでの接続が出来ており、Windows機への接続に必要なノード情報、アカウント情報も用意されている前提です。出来ていない場合にはWindowsでリモートスクリプトを実行する(その1)を参照して準備してください。

システム保護のためにOSの初期設定の段階では、PowerShellスクリプトの実行が制限されている場合があります。特にWindows Server 2012 以前のOSでは、デフォルトでスクリプトファイルの実行ができないようにポリシーが設定されています。このポリシーを変更するには、 Set-ExecutionPolicy というコマンドレットを使用します。

これに”RemoteSigned”を指定した場合、ローカルで作成されたスクリプトは無条件で実行できますが、ネットワークから入手したスクリプトは署名が無ければ実行できません。(Windows Server 2012 R2 はこの設定がデフォルト)。

※実行ポリシーの種類

Restricted すべてのスクリプトの実行禁止 (規定値) 対話型モードでのみ使用できる
AllSigned 信頼できる発行元が署名したスクリプトのみ実行可能
RemoteSigned ダウンロードしたスクリプトは信頼できる発行元が署名した場合にのみ実行可能
Unrestricted すべてのスクリプトが実行可能

スクリプトを実行できるように、ポリシーを変更します。管理者権限で PowerShell を起動し、以下のコマンドを実行してください。

 
スクリプトの実行

ここでは”スクリプトジョブ”型の”PowerShellスクリプトの実行”という名前のオブジェクトを作成します。

Windowsでバッチファイルを実行させる場合拡張子を設定する必要があるので、”拡張子”の欄に”ps1″と入力してください。

PowerShellスクリプトの実行

適当に引数を指定して実行してみます。

実行画面

 

上記のように、バッチファイル(bat)と同様に実行できる事がわかります。
Microsoft社も管理系のツールはPowerShellで実装することを表明しており、バッチ(batファイル)よりも適用範囲が多いため、Windows機の管理をする場合には大変有用です。

Windowsでリモートスクリプトを実行する(その1)

KompiraはLinuxなどのssh接続できるもの以外に、Windowsに対するアクセスもサポートしています。
今回の記事ではKompiraの”リモートスクリプト”を利用して、Windowsサーバーでバッチファイルを実行する方法をご紹介します。

※本記事ではWindows Server 2012 R2(WinRM version 3)で動作確認をしております。

 
Windows側での設定

KompiraからWindows機への接続はWinRM/WinRSを利用して接続します。Windows Serverでは通常、デフォルトで必要な設定が行われておりますが、必要に応じて設定を行ってください。

スタート > “Windows Power Shell”を右クリック > “管理者として実行”
下の実行例の様に、”winrm qc” コマンドを実行してください。

また、ファイヤーウォールなどで通信を管理している場合にはポート5985番にリクエストを行えるように設定してください。

続いて、KompiraからWinRM経由でアクセスできるよう、Basic認証と暗号化していない認証を許可します。
同様にPower Shellの画面から次のコマンドを実行してください。

Basic認証の設定

ここまでで、Windows側の設定は完了です。

 
Kompira側の設定

実行するスクリプトを記述する”スクリプトジョブ”オブジェクトと、これを実行するサーバーを指定する”ノード情報”、”アカウント情報”を作成します。

まず”アカウント情報”ですが、ここでは”AccountOnWindows”という名前で以下のように作成しました。(名前は任意で結構です。)
Windows機で作成したアカウントの名前とパスワードを入力してください。

アカウント情報

次に”ノード情報”ですが、ここでは”WindowsServer”という名称で作成しました。WindowsサーバーのIPアドレスを記載し、”接続種別”は”Winrs”を選択してください。一番下の”アカウント”は先に作成した”AccountOnWindows”を選択します。

ノード情報

最後に”スクリプトジョブ”ですが、ここでは”Win機でバッチファイルの実行”という名前で作成しました。”ソース”は以下のように指定の引数等を表示させています。

Windowsでバッチファイルを実行させる場合拡張子を設定する必要があるので、”拡張子”の欄に”bat”と入力してください。

ジョブフロー

 
スクリプトジョブの実行

実行画面で先に作成したノード情報(“WindowsServer”)とアカウント情報(“AccountOnWindows”)を指定して実行します。

ジョブフローの実行

実行時に以下の様なエラーが表示される場合にはアカウント情報の指定ミスか、設定段階でBasic認証と暗号化していない認証の設定が失敗している可能性がありますので確認してください。

ここまで、Linuxの場合と同様に、Windowsに対してもスクリプトジョブを実行できるところまでを見てきました。リモートサーバーに直接バッチファイルなどを配置するとバッチファイルそのもののメンテナンスが大変ですが、Linuxなどの場合と同様にKompira側でそれらを管理して、複数のサーバーに同じ処理を実行させる事が可能になります。

Kompiraオブジェクトのプロパティ,メソッド,フィールドを扱う

Kompira上で扱う管理情報は、「ジョブフロー」や「ノード情報」「環境変数」など多くの種類がありますが、これらは全て「Kompiraオブジェクト」として扱われます。例えばKompiraファイルシステム上での「ディレクトリ」もオブジェクトになります。

これらの「Kompiraオブジェクト」には「プロパティ」、「メソッド」、「フィールド」が定義されています。今回の記事では、これらの扱い方を見ていきましょう。

 
Kompiraオブジェクトの「プロパティ」

各Kompiraオブジェクトには、あらかじめシステムで定義された「プロパティ(オブジェクトの属性情報)」を持っています。例えばオブジェクトのパス、名称、作成日時などがあります。

これらのKompiraオブジェクトのプロパティをジョブフローから参照するには、ドット記法で、
”オブジェクト名.プロパティ名”
と記述します。

プロパティには以下の種類があります。

プロパティ名 説明
id オブジェクトのID値
abspath オブジェクトの絶対パス
name オブジェクト名
description オブジェクトの説明
display_name オブジェクトの表示名
field_names オブジェクトが備えるフィールド名の一覧
owner オブジェクトの所有ユーザー
created 作成日時
updated 更新日時
parent_object オブジェクトの親オブジェクト
children オブジェクトの子オブジェクト一覧
type_object 型オブジェクト
type_name 型名
user_permissions ユーザ権限
group_permissions グループ権限

例えば、以下のジョブフローは、”sample_jobflow”というジョブフローの更新日時を表示します。

 
Kompiraオブジェクトの「メソッド」

各オブジェクトは、それらの操作を行うための「メソッド」を持ちます。オブジェクトを削除する”delete”メソッドのように、全てのオブジェクトが共通して持つメソッドと、特定の型のオブジェクトが持つ固有のメソッドがあります。

例えば、以下のジョブフローは”rename”メソッドを用いて、”sample_jobflow”というジョブフローの名前を”sample_jobflow2″に変更します。

共通するメソッドは delete(オブジェクトの削除)、rename(名称の変更)、update(フィールド(後述)の値の更新) があります。

特定の型が持つメソッドとしては、ディレクトリ型の”add”メソッドがあります。これは指定のディレクトリに新しいオブジェクトを作成するものです。例えば、カレントディレクトリ”./”の下に”sample_jobflow”という名前の空のジョブフローを作成します。

別の例としては、チャネル型の”send”メソッドがあります。これは指定されたチャネルにメッセージを送信します。Alertチャネルに”sample message”というメッセージを送り、それを読み出して表示してみます。

 
Kompiraオブジェクトの「フィールド」

最後に「フィールド」ですが、これらは画面で設定できる各項目に固有の名前がつけられており、それで参照できるようになっています。

jobflow
上図はジョブフローの編集画面ですが、ここの「ソース(source)」、「多重度(multiplicity)」、「デフォルトチェックポイントモード(defaultCheckpointMode)」などが「フィールド」です。( )内が各フィールドの名称です。

例えば、次の例は”sample_jobflow”というジョブフローのソースを表示します。

特に「テンプレート」「メールテンプレート」「環境変数」型などのオブジェクトは、ジョブフロー中からフィールド情報を参照することが多いでしょう。

次の例は”設定情報_環境変数”という環境変数型のオブジェクトのenvironmentフィールドを読み出して表示します。environmentフィールドは”名称”と”値”の組み合わせの辞書型の構造を持ちます。この例では”item1″という名称に対応する値を表示します。

各オブジェクト型のフィールド情報の種類とデータ型はヘルプ画面の「Kompiraオブジェクト」に記載がありますので、詳細はヘルプを参照してください。

Kompiraのセッション機能を利用して対話的にコマンドを実行する

Kompiraでサーバー等でコマンドを実行する際には[“コマンド”]というように[ ]で囲みます。この場合、複数の[ ]内のコマンドは別のセッションとして実行されます。例えば次の様なジョブフローを見てみましょう。

この実行結果は例えば次の様になります。

dateコマンドの出力がロケールを明示的にCロケールに変更した2行目だけ英語になっているのがお分かりになると思います。また2行目で設定したロケールが3行目のdateコマンドを実行する際に引き継がれておらず、改めて日本語出力になっています。つまり各行がそれぞれ別のセッションとして実行されています。
コマンドの実行の都合上、同一セッションで行わなければならない局面では、sessionブロックを利用して記述します。

 
sessionブロック

sessionブロックは以下のような形式で記述します。

[“コマンド”]の場合の実行結果は$RESULT変数に格納されますが、セッションの途中の状態では接続先のリモートサーバーとのやり取りをセッションチャネルを通じて行います。またセッションブロック終了時、$RESULTにはセッションチャネルが格納され、date属性に未読み込みのデータが格納された状態になります。またセッションが成功した場合にはセッションブロック終了後に$STATUSに0が格納されます。

たとえば、上記と同じように実行するには次の様になります。

この場合の実験結果は、例えば次の様になります。

[“コマンド”]の場合とは異なり、ジョブフロー中の2回目のdateコマンドの直前に設定されたLANGが3回目のdateコマンドの実行時にも有効になっているのが見て取れると思います。

 

接続先サーバーとの対話

コマンドを実行した結果に応じてコマンドを投入したい場合は、セッションチャネルでガード式を利用して指定した応答を待ちます。上記の例ではセッションの値を拾う際に<s>としていますが、ここを <s ?? g”*]$ “> のように書きます。この場合、メッセージキューの先頭から順にオブジェクトがマッチするかどうかを調べ、マッチした場合には、それまでのオブジェクトを破棄して、マッチしたオブジェクトを受信します。
ここでは

のようなシェルログインした場合のプロンプトが返ってくるのを待ちます。応答が指定のパターンにマッチした場合に次の処理に進みます。

の部分は、globのパターンリテラルを使用しており、”(任意文字列)]$ “で上記のプロンプトにマッチさせるようにしています。

ジョブフローにすると、例えば以下のようになります。

実行結果は次の様になります。

上記の例では通常のシェルログインをした際のプロンプトを想定したマッチングパターンを利用していますが、例えばsuコマンドでパスワード待ちを行わせるような場合には、

のようにして、パスワード入力のプロンプトを待って、パスワード文字列を入力をさせる事が出来ます。

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

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

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

 
作業の方針

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

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

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

 
CSVファイルの作成

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

名前は適当につけてPC上に作成しておきます。

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

アップロードファイル

作成したCSVファイルを添付ファイル型のオブジェクトにアップロードします。上図の様に作成し、編集画面の添付ファイル1よりPC上のファイルを指定してアップロードします。

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

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

アカウント情報

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

 
サーバーリスト(テーブル)の作成

ここではあらかじめ手動でオブジェクトを作成しておきます。

サーバーリスト

上図のように設定画面にて「ノード情報」を設定して保存してください。

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

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

 
ジョブフローの作成

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

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

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

Kompira REST APIを利用して外部からジョブフローを実行する

監視ツールなどの外部システムからKompiraに登録されているジョブフローを直接実行したい場合があります。例えば障害発生時にサーバーやネットワークなどの状況を調べたり、障害プロセスを再起動させるなど、一次対応を行う場合などがあります。
今回はKompiraのREST APIの機能を利用して、外部からジョブフローを呼び出してみましょう。

事前準備

APIを利用するためには認証用のトークンが必要になります。以下の画面よりREST APIの機能を有効にして、トークンを取得します。
設定 -> ユーザー管理 -> (ログイン中のアカウント名) -> 「編集」ボタンをクリック

Activate REST API
一番下の「REST API 有効化」を選択した状態で「保存」ボタンをクリックします。

API Token
「REST APIトークン」の「トークンを表示する」をクリックして、表示された文字列が認証用のトークン(Token)ですので、これをメモしておきます。(「メモ帳」などにコピーしておきましょう)

ジョブフローの作成

ノード情報”server1″に登録されたサーバー機のApache httpdのプロセスをリスタートします。(ここではserviceコマンドを利用していますが、お使いのサーバー機のバージョン、ディストリビューションに合わせて変更してください。)
ここでは”/root/restart_process”という名前のジョブフローを作成します。

このジョブフローを実行して、「起動しました」「起動に失敗しました」の表示が出るところまで確認してください。

APIのエンドポイント

Kompira REST APIのエンドポイントは、通常のKompiraオブジェクトへのリソースパスと同じになります。すなわちルートエンドポイントは
http[s]://<Kompiraサーバー>/
となり、上記のジョブフローの場合には
http[s]://<Kompiraサーバー>/root/restart_process
となります。

ブラウザからのアクセスと API リクエストを区別するために、HTTP リクエストの Accept ヘッダに

を含めるか、クエリ文字列に

を含める必要があります。

APIのユーザ認証

認証はトークン認証と、セッション認証方式の2種類が許可されます。ここではトークン認証を利用します。以下のようにリクエストのAuthorizationヘッダにトークン鍵を含めます。

または、HTTP リクエストのクエリ文字列に以下のようにトークン鍵を含める方法もあります。

APIでのジョブフローの起動

実際にAPIにリクエストを送ってみましょう。POSTメソッドで送信する必要がありますので、APIのクライアントツールやブラウザのプラグイン(たとえばFirefoxの”RESTClient”など)を使ってください。
ここではターミナルのcurlコマンドで実行します。

リクエストのURLは

となります。

応答は起動したジョブフローのプロセスIDです。
画面上部の「プロセス一覧」>「全てのプロセス」>(該当するID) の画面で、実行結果を確認する事が出来ます。

process result detail

ちなみにAPIへのリクエストをGETメソッドで送信すると、ジョブフローの情報をJSON形式で取得できます。

上記のように、外部のシステムから指定するジョブフローに対応するパス名+”.execute”で起動させる事が出来ます。

応用例: 通知メールからの呼び出し

エラー通知を受け取った場合に、状況確認後に急いで一次対応が必要になる場合を考え、メール文中のボタンをクリックする事でジョブフローを起動してみます。(※運用自動化の観点からは、通知メールを送る段階で該当する処理を実行すべきところです。) HTMLメールのフォーム(form)を使って呼び出しURLを作ります。トークンなどをヘッダーに含める事が出来ないため、URLのパラメータとして引き渡します。

通知メールを送るジョブフローを以下のように作成します。

受信メールの例です。(Gmailの場合)
link on Gmail

この「httpdをリブート」ボタンをクリックして、先のcurlコマンドの場合と同様にプロセスIDが表示されれば起動OKです。
(※メールクライアントによっては、URLをクリックしてもGETメソッドでリクエストが送信される場合がありますので、ご注意ください。)

KompiraからSlackに通知する

障害発生や処理終了などの通知は、例えばmailto()関数を使うと電子メールで送る事が出来ますが、APIを持ったメッセージアプリケーションに送信することも可能です。今回はSlackに通知を行ってみましょう。

 
Slackの設定

お使いのSlackのアカウントにメッセージ受信用のチャネルを作成します。今回は#kompiraを作成します。
kompira_channel

次にSlackに外部からメッセージを送信できるように、”Incoming WebHooks”の設定をします。
channel settings > Add an app or integration > 検索窓に”incoming webhooks”
これでApp Directoryの”Incoming WebHooks”のページが表示されます。
Incoming Webhooks

左の”Add Configuration”ボタンをクリック

Post to channel

“Post to channel”画面で、チャネル名が”#kompira”になっている事を確認して、”Add Incoming Webhooks Integration”ボタンをクリック

“Setup Instructions”画面の”Webhook URL”を別途メモ帳などに記録しておいてください。(Kompiraのジョブフローに設定します。)
その他の項目は、続く”Integration Setting”も含めて、最低限はデフォルトでも良いですが、必要に応じて変更してください。
ここでは”Customize Name”を”Kompira2Slack”と変更してみます。

Customize Name

設定が完了したら”Save Setting”ボタンをクリックしてください。

 
Kompiraジョブフローの作成

続いてKompira側にジョブフロー「Slackへ通知」を次の様に作成します。

ここでパラメータ”url”には、Slackのセットアップ画面で表示された”Webhooks URL”を記載してください。

このジョブフローを実行すると、Slackに次のように投稿されます。
Entry on Slack

このようにKompiraからSlackのチャネルへの投稿は容易に可能です。
これを他のジョブフローから利用する場合には、例えば以下のように呼び出します。

単純なメッセージ送信以外にもリンクURLの送信やアイコン・色の変更なども行えます。リッチなメッセージ作成の詳細はSlack APIの”Message“をご参照ください。

KompiraからTwilioで電話をかける

Twilioとは電話やSMSの受発信をWeb APIを通じて利用できるサービスです。(電話以外にも二要素認証のAuthyやアプリケーションの同期を行うSyncなどがあります。)

今回はTwilioの電話をかける機能を利用して、Kompiraのジョブフローから指定した電話番号に対して自動音声通知をするジョブフローを作成します。

 
Twilioの準備

Twilioを利用するためには、最初にアカウントの設定が必要です。日本ではKDDIウェブコミュニケーションズ(KWC)社が代理店を行っており、サイトからサインアップできます。
(注意:TwilioのアカウントはUSのtwilio.comの方からもアカウントを作成する事が出来ますが、日本とは別に管理されており、提供されているサービスに差があります。日本国内の電話番号にかける場合にはKWC社のサイトからアカウントを取得してください。また日本の050番の電話番号ではSMSの送受信は出来ません。)

アカウントを作成したら、クレジットカードを登録してチャージしてください。(2000円以上でポイントを購入します。料金表はつぎのリンクを参照ください。)

API認証情報の取得

Twilio Console

コンソール画面の「アカウントサマリー」の「Account SID」と「Auth Token」の2つの値を記録しておいてください。API呼び出しの際に認証に利用します。

電話番号の購入

続いて通知するための電話番号(050/0120/0800/その他番号)を購入します。Twilioコンソールの画面左の#マーク -> “Buy a number” -> 国名として「Japan」を、「利用可能な機能」に「音声通話」のチェックを入れて「検索」を選択しましょう。

Buy a number

電話番号のリストが表示されるので、好みの番号を選んで「購入」してください。この番号も記録しておきます。

TwiML Binsの設定

TwiMLはTwilioの電話の機能を設定するXMLファイルです。TwiMLはTwilio社のサーバーからアクセスできるインターネット上のWebサーバーなどに配置する必要があります。(URLを持てるストレージであればOKです。)ここではTwilioの簡易的な運用を行うためのTwiML Binsの機能を利用します。

Twilioコンソールのデベロッパーセンター(左側の「>」マーク) -> 「TwiML Bins」をクリック -> 「+」ボタンをクリック

ここでTwiMLの内容を記載するページが表示されます。”Friendly Name”はTwiMLの内容を識別する名前で任意につけてください。
“TwiML”欄には、例えば以下のように記載します。

保存したら、”Properties”の”URL”は記録しておいてください。

ここまでで、”Twilio”側の設定は完了です。

 
Kompiraのジョブフローの作成

続いて、Kompira側の設定です。ここではKompiraサーバーのCurlコマンドを呼び出して、TwilioのAPIを呼び出します。

”To”には電話をかける相手の番号を国番号から指定します。また電話番号先頭の0を取ります。(上の例は、日本の国番号は”+81″で、”03-1234-5678″にかける事を想定しています。”+810312345678″ではない事に注意してください。)
“From”はTwilioで購入した電話番号を記入します。
“AcountSID”、”AuthToken”は、それぞれTwilioのコンソールに表示されていた文字列を記載してください。
“Timeout”は相手が電話をとるまでに呼び続ける秒数です。(最大600秒まで。ただし受ける側が一定時間後に留守番電話設定にするなどの場合は、これより早く処理される可能性があります。)
“TwiMLurl”は、TwilioのサーバーがTwiMLを取得するためのURLです。今回の例では先に設定したTwiML BinsのURLを記入します。

コマンドの戻り値は、JSON形式の応答を辞書型変数resultに格納しています。このコマンドを実行した段階では、Twilio側の呼び出しのキューに入れられるところまでです。したがって変数resultには実際に電話をかけた結果の情報はないことに注意してください。

このジョブフローを実行して、指定した電話番号に電話がかかってくれば成功です。

 
通話内容のカスタマイズ

ここまでで固定メッセージで相手の電話を呼び出すジョブフローが出来ました。うまく電話が鳴りましたでしょうか。
次に、通知のメッセージを呼び出し時にカスタマイズをしたい場合の対応を行います。
たとえば、サーバー名を追加したい場合はTwiML Binsのテンプレートの機能を利用します。
登録されているTwiMLを以下のように変更してください。

続いて、ジョブフローを以下のように変更します。

このようにTwiML Binを呼び出すURLに”?Machine=****”パラメータを付与しています。これがテンプレートに内挿されて再生されます。(上記の例では「サーバー一号機が停止しました。・・・」と再生されます。)複数のパラメータを埋め込む事が可能です。

今回の例では、指定した音声が電話口で読み上げられるシンプルな使い方をご紹介しました。
TwiMLの記法を使うことで、電話を受けた人が押した電話のボタンの値を記録したり、それによって次に再生される内容を分岐することなども可能です。詳細はTwiMLのドキュメントを参照してください。
本記事ではTwiMLを返す機能としてTwiML Binsを使用しましたが、もちろん任意のWebサーバーやクラウドストレージを利用することも可能です。特に動的にメッセージの内容を変更したい場合には、TwiMLを返すWebアプリケーションを作成してください。

DNSのゾーンファイルを編集する

ネットワークに新規のサーバーを追加した場合や、サーバーの入れ替えをした時など、DNSの設定を変更する場合があります。追加・変更する際にはbindのゾーンファイルを書き換えるのですが、管理者権限が必要になり、設定項目も注意が必要であり、運用上は気を使う作業の一つです。ここではKompiraを利用してDNSの登録情報の変更を行ってみましょう。今回の記事はnamedの設定とpythonの簡単な知識が前提となります。

 
事前準備

単純にサーバーの追加であれば、ゾーンファイルにAレコードを追加するのみですが、既存登録の変更となると単純ではありません。
ここではpythonの”dnspython”モジュールを利用しています。(動作確認にはバージョン1.15.0を使用しました。)

流れとしては以下の様になります。
* DNSサーバーから、ゾーンファイルをKompiraサーバーに転送
* Kompiraサーバーで、dnspythonの機能を使って編集
* 編集したファイルをDNSサーバーに再転送

 
dnspythonのインストール

Kompiraサーバーにシェルログインを行った後、管理者権限のアカウントで以下の様にモジュールをインストールしてください。

 
ライブラリの作成

Kompiraからdnspythonを利用するためのラッパーライブラリを作成していきます。ここでは「DNSレコード編集」という名前の「ライブラリ型」のオブジェクトを作成します。以下の様なpythonのコードを記載します。

これで指定したドメイン名、キーに該当するレコードのIPアドレスを変更して、新しいゾーンファイルに保存する”change_A_record”というメソッドが利用できるようになります。

 
ジョブフローの作成

次にライブラリを利用するジョブフローを作成します。