column

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”をキーとした次の様な情報が記述されています。

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

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

アドレスを登録

ここまでで、認証情報の設定とスプレッドシートの準備ができました。続いて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”というメソッドが利用できるようになります。

 
ジョブフローの作成

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

まず get() を利用して、DNSサーバーからゾーンファイルをKompiraサーバーにダウンロードします。
続いて、先に作成したchange_A_record()を呼び出して、ゾーン情報の編集を行います。結果はnewzoneに保存されます。
最後に変更後のゾーンファイル$newzoneをDNSサーバーに再アップロードして終了です。
(必要に応じてrndcコマンドでゾーン情報の再読み込みを行わせるなどの対応が必要です。)

このようにしてdnspythonの機能を利用して既存のゾーン情報内のレコードの編集を行いましたが、他にもTTLの変更、ドメインの追加、ホストの追加・削除などを行う事が出来ます。上記と同様にライブラリにメソッドを追加してジョブフローから利用する事ができますが、詳細に関してはdnspythonのサイトを参照してください。

また、上記の例ではKompiraサーバー上にpythonライブラリをインストールしましたが、DNSサーバー上にインストールする事が可能であれば、Kompiraからはコマンド発行のみでゾーン情報の変更が出来るため、get/putのようなファイル転送は不要になります。DNSサーバーの認証情報についても「ノード情報」型オブジェクトを使用しても結構です。

Kompira上でWikiページを作成する

運用チームでKompiraを共有して利用する場合、作業手順などの情報をKompiraで共有して閲覧できるようにするために、Wikiを作成することが出来ます。例えばオペレータ向けに確認事項やジョブフローへのリンクをまとめておくと重宝するでしょう。
またジョブフローを実行して得られた情報などもWikiに自動的に記録しておくこともできます。

 
Wikiの作成

新規のジョブフローを作成する場合と同様に、Wikiページ型のKompiraオブジェクトを作成します。ここでは「作業手順」という名前で作成してみましょう。
Wikiの作成

次のような編集画面が表示されます。
Wiki編集画面

Wikiでメモを書いていくには、単純にテキストを書いていく他に、「スタイル」と呼ばれる一定の記法に従って書くと、太字、イタリックなどの表示、表の作成、外部リンクの作成などが出来るようになります。
「スタイル」では(1) Creole(デフォルト) (2) Markdown (3) Textileの三種類のWiki記法から選択する事が出来ます。各記法の詳細については、画面の「Wikiテキスト」欄の下に、それぞれリンクがありますので参照してください。
ここでは昔からWikiに利用されているCreole記法を使っていきます。

簡単な例として、Wikiテキスト欄に次の様に記載してみます。

保存ボタンをクリックすると、次の様に表示されます。

Wiki画面

上記の例では、行の先頭に “#” を記載すると番号付きリストになり、[[ ]] で囲んだパスはリンクになるCreole記法の例です。
このようにして手順の解説とジョブフローへのリンクをまとめておくと便利でしょう。

 
ジョブフローからWikiに保存する方法

Wikiオブジェクトのフィールドを調べると、”wikitext”フィールドがwikiページのテキストを格納します。
Wikiオブジェクト

さて既存のWikiオブジェクト “Wikiページ”が存在しているとして、この”Wikiページ”の内容をジョブフローから変更するのは、次の様にします。

“Wikiページ”にメッセージを追記していくのは次の様に、いったん内容を変数に保存して、追記文字列を結合した後に、改めてwikitextフィールドに書き戻します。(下記の例で’\n’は改行を表します。)

上記のように、ジョブフローより既存のWikiページの内容を書き換える事が出来ます。取得したシステムの情報や、作業記録を追記していくような用途などでご利用ください。

Zabbixからの通知をKompiraで受信する

運用自動化を検討するにあたり、構成する機器の監視を行うために専用のツールを使用しているケースが多いと思います。Kompiraを利用して簡易的な監視を行う事も出来ますが、Zabbixなどをすでに利用している場合には、これらの監視ツールとKompiraの連携を行う方が効率的でしょう。

今回は代表的なシステム監視ツールであるZabbixで検知した障害情報などをKompiraで受信する方法についてご紹介します。ここではZabbixからユーティリティー”kompira_sendevt”コマンドを呼び出して、Kompiraに情報を送信します。

※”kompira_sendevt”コマンドのインストール要件として、Python 2.6系が動作する必要があります。今回の記事ではCentOS 6.7, Python 2.6, Zabbix 3.0 で作成しています。それぞれのインストール手順に関しては割愛いたします。

 
Kompira側の準備

“kompira_sendevt”コマンドで送信されてくる情報を、チャネルを利用して受信します。
次のようなジョブフローを作成して、実行状態にしておいてください。

 
Zabbix側の準備

方針としては「アクション」に”kompira_sendevt”を実行させる記述を行い、別途に登録したホスト、トリガーにより起動するものとします。今回はエージェントの導入が不要な”Template App HTTP Service”を利用して、リモートからWebサーバーを監視する想定としたシンプルチェックとします。

設定 -> アクション -> アクションの作成
名称は「Kompira通知」としました。

アクションの設定1

アクションの実行条件
デフォルトの「トリガーB」を削除して、「トリガー名」-「含まれる」-「HTTP」を追加します。
アクションの設定2

アクションの実行内容
アクションの設定3
ここで「タイプ」を「カスタムスクリプト」、「実行内容のタイプ」を「リモートコマンド」に変更しています。
「次で実行」は「Zabbixサーバー」を選択します。

「コマンド」には次のようなkompira_sendevtコマンドを記述しています。

「ホスト」の追加
「ホスト名」「エージェントのIPアドレス」に対象のWebサーバーの名称&IPアドレスを記載します。
ホストの追加

ホスト > テンプレートの追加
続いてテンプレートに”Template App HTTP Service”を追加します。
テンプレートの設定

これらの登録が完了するとZabbixはWebサーバーの監視を始めます。
障害発生として検知させるため、監視対象のWebサーバーのデーモンを、例えば次の様なコマンドで停止します。

Zabbixがhttpdからの応答が無くなった事を検知すると、アクションで設定した”kompira_sendevt”を呼び出してKompiraのチャネルにデータを送信します。Kompira側で先に動かしていたチャネル受信データを表示するジョブフローのコンソールには次の様な表示が出ます。
チャネルでの受信
上記はZabbixが検知した障害情報の内容となっています。以降は受信した内容に応じて通知や復旧処理をジョブフローに追加する事が出来ます。

システムの監視には、死活監視のみならず各種のメトリックスの閾値監視なども行えるZabbixを利用し、検知した情報を利用して担当者への通知や一次対応などを、Kompiraを用いて自動化することが出来るようになります。

syslogをKompiraで受信する

システム管理者にはおなじみのsyslogは、主にUNIX系OSでアプリケーションやシステムの動作状況やメッセージを記録するための仕組みです。ローカルのみならずネットワーク経由で他のシステムとログを送受信する機能もあります。syslogのログ情報はUDPまたはTCPの514ポートを通じて送信され、プロトコルはRFC3164で標準化されています。

syslog自体は1983年に発表された4.2BSDでの導入以来、30年以上の歴史がありますが、近年はsyslog-ng, rsyslogなどの新しい実装が利用されてきています。

本稿執筆時点(2017年1月)でのKompiraのサポートバージョンはCentOS6で、rsyslogが導入されています。rsyslogのバージョンは5.8系ですが、最新版は8.23であり、設定ファイルの書式が大幅に変更されています。ドキュメントや記事を参照する際には対象になっているバージョンにご注意ください。

syslogの受信機能そのものはKompiraにはありませんので、本稿ではKomiraサーバーのrsyslogで受信を行い、そこからユーティリティー「kompira_sendevt」でKompiraのチャネルに送信する方法でデータを取得します。

 
rsyslogの設定

rsyslogから”kompira_sendevt”を呼び出すには”omprog”モジュールを利用します。
設定は/etc/rsyslog.confで行います。
ただし以下のような登録を行うと、実行中のrsyslogdを停止したタイミングでしか情報を送信しません。

ここでは一旦シェルスクリプト(ここでは仮に/tmp/sendlog.sh)を呼び出し、そこから”kompira_sendevt”を間接的に呼び出すようにします。

ここでは簡単のために、rsyslog.confでは全てのログを決まったフォーマットで送信するようにしていますが、ここは必要に応じて「指定の文字列を含む場合」「指定のアプリケーションからのログ」など限定すべきところです。

 
Kompira側の設定

次にKompiraのチャネルで受信したデータを表示するためのテスト用のジョブフローを用意します。

 
動作確認

まずはジョブフロー「チャネル受信」を実行し、転送用のスクリプトの動作をチェックします。

ここでコンソールで”test message”の文字が表示されれば成功です。うまくいかない場合には、sendlog.sh の実行パーミッションの有無を確認してください。

次にrsyslogを起動します。

テスト用のsyslogメッセージを送信します。

ここでコンソールで”hello world”の文字が表示されれば成功です。

syslogの受信

うまくいかない場合、/var/log/messagesの一番最後に表示されるか確認してください。

表示されているようであれば、rsyslog.confの設定が正しくない可能性があります。

以上で、Kompiraサーバーでsyslogデータを受信し、それをKompiraのチャネルに転送することができるようになりました。
実践用途では、特定のアプリケーションの特定の条件(障害発生など)に絞り込んで、何らかの自動化処理につなげると思います。このため、Kompiraに転送するデータのフィルタリングの設定をrsyslog.confに行うなどの設定をいれてください。ログファイルを全てKompiraに転送して、Kompira側で条件分岐を行うのは転送コストを考えると望ましくありません。

snmptrapをKompiraで受信する

snmptrapは、snmpプロトコルでネットワーク上の危機を監視する際に、監視対象になっている機器から管理用コンピュータにむけての通知機能です。主にネットワーク機器などの監視エージェントをインストールできないアラートを検知するのに使います。snmptrapが発行されるのは、あらかじめ指定した異常状態が発生した場合や、機器の状態を表すパラメータが設定された閾値を越えた場合等があります。

snmpとの違いは、snmpの場合は機器に向けて問い合わせや要求を行い、それに対する応答を得るという手順となります。snmptrapの場合は機器からの一方的な通知(トラップ)となります。

トラップの受信はzabbixなどのツールを使うことも多いですが、ここではKompiraサーバーで受信を行う方法をご紹介します。
大まかには以下のような流れとなります。
1. snmptrapdで受信
2. kompira_sendevtを使って、kompiraのチャネルに転送
3. チャネルで受信した情報をジョブフローで処理

 
kompira_sendevtコマンドのインストール

チャネルにデータを送信するユーティリティー kompira_sendevtをインストールします。手順については、別記事
「チャネルを利用した外部システムからのデータ受信」を参照してください。

 
snmptrapdのインストール

snmptrapdは”net-snmp”というパッケージによって提供されます。関連ユーティリティーを含めて、Kompiraサーバーにyumコマンドでインストールして下さい。

次に/etc/snmp/snmptrapd.confを編集して、トラップの受信条件を設定します。ここでは簡易的に以下のようにしました。
トラップを受信したらtraphandleディレクティブで指定されたkompira_sendevtを実行するようにします。