Insightsの話題も取り上げられるようになってきています。クライアント側の話をしました。その他のコンポーネントに関しての説明を行います。Engine(insights-core)に転送されます。HatでホストされるSaaSアプリケーションです。Engineは、受信した情報を処理し、ユーザにわかりやすい形で結果をユーザインターフェイスに出力します。Engine(以下insights-core)は、前章の例で示したような情報(tar.gzでアーカイブされているもの)を解凍・展開し、各情報を識別して処理を開始します。insights-coreでは、このアーカイブされていたデータのような、様々な書式の情報(コマンドからの出力や、色々な形式の設定ファイル等)を処理するために、APIを使用してデータをオブジェクトに変換します。Pluginを用いてデータを分析し、ユーザにわかりやすい形での結果を出力しています。insights-coreのプラグインプラグインには次の3つの種類があります。Pluginで使用出来る形式にデータを変換します。プラグインは、特定のデータセットの解析を担当します。/ファイルの内容を解析して変換しています。プラグインではinsights-clientが取得してきた情報を集約します。-a”の実行結果からも取得できます。)の結果からメジャーリリース番号とマイナーリリース番号を判別します。Combinerでは最初に優先される情報を使用し、最初の情報が利用できない場合に2番目の情報を使用します。rh_rel.version---snip---となっており、unameの出力情報を/etc/redhat_releaseの情報よりも優先しています。プラグインでは、ParserとCombinerによって利用可能になった情報の分析を行います。Ruleでは、システムになんらかの(障害などにつながる)状態が存在するか、また将来発生する可能性が高いか等を判断することができます。sshd_configファイルの該当する設定を確認します。これら両方の結果が当てはまった場合、ルールは結果のレポートと、脆弱性及び解決方法に関する情報を出力します。この結果はエンジンによって統合され、カスタマーインターフェイスに表示されます。insights-coreチュートリアルFedora30でinsights-coreをチュートリアルに従ってインストール/開発を行い、大体の動きを掴んでみましょう。こちらの「Insights-core-tutorials」のドキュメントに従います。チュートリアルに従って行うと全体像が見えてきますが、insights-coreでどのようにRuleを用いて処理を行っているかの概要だけを掴みたい場合には、ここを飛ばして7.3を確認してもいいでしょう。7.2の環境はチュートリアル専用の環境のため、7.3の環境とは、別環境になります。環境構築チュートリアルガイドに従って環境を構築していきます。ここではFedora30の/home/sios/work/以下を環境として構築していきます。clonework/insights-core-tutorialsに移動します。3.7になっていますので、setup_env.shファイルを修正し3.6に合わせます。この際、下記のようなエラーが出力されることがあります。===============================================この場合には、lib/python3.6/site-packages/_pytest/main.pyを編集し、下記の行を削除します。Session(config)pytestまで成功したら、ほぼ準備は完了です。~/work/insights-core-tutorials/bin/activate”を実行して環境変数類を読み込みます。以降、下のようなプロンプトになります。プラグイン(以下Parser)を作成してみます。プラグインで取り扱える形式にするための物です。今回は、サンプルとして”SSHの設定”を扱うParserを作成します。サンプルのParserはwork/insights-core-tutorials/insights_examples以下にあります。今回は~/work/insights-core-tutorials/mycomponents/parsers以下にカスタムのParserを作成してみます。ここでは、sshd_configとして下記のようなものをサンプルにしています。2このファイルをParseするParserを作成します。~/work/insights-core-tutorials/mycomponents/parsers/secure_shell.pyとして、以下のようなParserのファイルを作成します。pass~/work/insights-core-tutorials/mycomponents/parsers/tests/test_secure_shell.pyとして、以下のようなParserのテストファイルを作成します。ディレクトリでpytestを用いてテストします。insights-core-tutorials]$次に、Parserのテスト用のファイル(test_secure_shell.py)を以下のようにSSHD_CONFIGの設定ファイルを読み込ませる形で作成します。'22'以下、このテストファイルの説明になります。context_wrapの所で、”context_wrap”を用いて、入力されたデータを”Context”オブジェクトに渡せるようにします。1"""のように入力します。SSHDConfig(context_wrap(SSHD_CONFIG_INPUT))を定義します。'22'としてキーワードでテストを行っています。次に、このテストファイルを実行できるように、パーサファイル(parsers/secure_shell.py)の方を下記のように修正します。kw]それぞれの意味は下記のようになります。”namedtuples”が使えるようにします。”get_active_lines()”は、空白行とコメント行を削除して有効な行だけを抽出するものです。os通常/etc/ssh/sshd_configファイルにアクセスするためにはroot権限が必要になりますが、ここではローカルに作成したsshd_configファイルを呼び出すため、SpecSetクラスを呼び出してLocalSpecsとしてローカルの(テスト用の)sshd_configファイルを呼び出すことにします。simple_file(conf_file)上で書いたローカルの(テスト用の)sshd_configファイルをmycomponents/parserディレクトリにコピーしておきます。testsnamedtupleを用いて格納している情報に簡単にアクセスできるようにしておきます。'kw_lower'])今回のパーサでは、全ての行(self.line)をnamedtupleに格納しています。self.lines])最後に、いくつかの「dunder」メソッドを実装して、クラスの使用を簡素化します。__contains__は、キーワードチェックのin演算子を有効にします。__iter__は、self.linesの内容に対する反復を可能にします。__getitem__を使用すると、キーワードのすべての値にアクセスできます。kw]最終的な(コメントも入れた)パーサファイルは以下のようになります。entries[-1]pytestコマンドでエラーが出力されなければ、作成は完了です。プラグイン(以下Combiner)を作成してみます。プラグインを作成します。プラグインはwork/insights-core-tutorials/insights_examples以下にあります。プラグインを作成してみます。~/work/insights-core-tutorials/mycomponents/combiners/hostname_uh.pyとして、以下のようなプラグインのファイルを作成します。-aの結果)をインポートします。pass~/work/insights-core-tutorials/mycomponents/combiners/tests/test_hostname_uh.pyとして、以下のようなテスト用のファイルを作成します。hostname_uh”を実行して確認します。=============================================では、Combinerのテスト用のファイル(test_hostname_uh.py)を以下のようにします。HOSTNAMEそれぞれの意味は下記のようになります。context_wrapをインポートし、入力されたデータを”Context”オブジェクトに渡せるようにします。context_wrapHOSTNAMEとUNAMEにサンプルで出力データを入力します。GNU/Linux"必要なパーサクラスセットを生成するコードを追加します。Uname(context_wrap(UNAME))テスト部分は以下のようになります。HOSTNAME最終的なCombinerコード(hostname_uh.py)は以下のようになります。uname.nodenamepytestコマンドでエラーが出力されなければ、作成は完了です。最後にカスタムのRulesプラグイン(以下Rules)を作成してみます。今回は、今までに作ってきたsshd_configとホスト名からホストのsshdの情報を取得するRulesプラグインを作成します。プラグインはwork/insights-core-tutorials/insights_examples以下にあります。プラグインを作成してみます。~/work/insights-core-tutorials/mycomponents/rules/sshd_secure.pyとして、以下のようなプラグインのファイルを作成します。results=the_results)このファイルの説明は以下になります。ruleをインポートし、先のパーサで作成したSSHDConfigをインポートします。SSHDConfig次に、ルールの実行時にinsights-coreによって収集され、実行結果で提供されるユニークな文字列ERROR_KEYとして”SSHD_SECURE”を設定します。"SSHD_SECURE"@rule()の引数は、ルール処理に必要なパーサーとCombinerで構成されます。@rule(SSHDConfig)最終的なRuleファイル(sshd_secure.py)は以下のようになります。openssh=openssh_version.package)対応するテストファイル(integration_test.py)は以下のようになります。expectedルールファイルは”insights-run”コマンドで確認できます。mycomponents/rules/sshd_secure.py”を実行した結果が以下になります。30でinsights-coreを手順に従ってインストールし、テストしてみましょう。Development」に従っています。(前章のチュートリアルの環境とは異なる環境のため、新たに作り直す必要があります。前章のチュートリアルを飛ばした方は、前章の環境は使いませんので、この小から新たに作成して下さい)。以下、~/project_dirを作業用ディレクトリとします。事前準備として、Fedora30にdnfを用いて以下のパッケージをインストールします。virtualenvinsights-coreをgitを用いて取得してきます。project_dir]$insights-coreディレクトリ下でPythonの仮想環境を構築するvirtualenvを使用します。wheel...done.Pythonの仮想環境を確認します。insights-core]$insights-coreプロジェクトとパッケージをpipでダウンロードします。–help”で確認します。insights-core]$独自のruleを作成してテストするために、~/project_dir以下にmyrulesディレクトリを作成し、ディレクトリ内に空の__init__.pyファイルを作成します。これ(__init__.pyファイル)により、そのディレクトリがPythonパッケージとして扱われるため、insights-runコマンドを用いてruleを扱うことが出来ます。hostname_rel.py)を作成して実行してみます。どちらのruleも参考ドキュメントに載っておりダウンロードリンクもあります。ここでは、簡単に次のようなテスト用のrule(openssh-server_version.py)を作成し、説明をしたいと思います。print_summary=True)解説)(1)(2)でPythonのクラスとオブジェクトを呼び出しています。Document)に使用方法までまとめられています。今回は、openssh-serverのバージョンをRPMパッケージから取得しています。CatalogクラスのInstalled.RPMsオブジェクトを使用しています。-qa”コマンドの出力は、行単位でパースされてInstalledRpmオブジェクトに格納されています。その格納された内容に対して検索を掛けていくわけです。(3)で、検索を行っています。Installed.RPMsには検索用の式がいくつか準備されており、ドキュメントから見る事が可能です。get_max(package_name)get_min(package_name)__contains__(package_name)等があり、上述のサンプルではget_max(package_name)を用いて、インストールされているバージョンのうちの最大のパッケージを取得しています。package_nameには”openssh-server”等のパッケージ名(バージョン番号の前)を指定します。”os-prober-1.74-8.fc30”を検索したい場合には、”os-prober”までを指定します。(4)の部分で、insights.run()を呼び出して結果を表示しています。この辺りの動作はinsights-coreのnotebooksにTutorialとして幾つかのドキュメントが用意されているので、そちらを参照して下さい。myrulesの下で上述のサンプルを実行すると、次のようなメッセージが出力され、インストールされているopenssh-serverのパッケージ情報を取得して表示していることがわかります。Insightsのドキュメントinsights-coreのnotebookから辿れるようになっていますので、これらのドキュメントを参照にして動作を追うことが可能です。Hatから提供されています。Customerのサブスクリプションが必要となります。まとめ前半部分では通常のInsightsの使い方を、後半部分ではInsightsの中身をDeveloper用途のチュートリアルを参考にしてお見せしました。InsightsはOSの状況を簡単に知ることが出来るので、ユーザとして使用するにはとても手間が省ける良いツールだと思います。Insightsの中身を知ることで、Pythonのモジュールや、OSの内部に関しても詳しくなれるので、エンジニアとしての腕を磨くには良い材料だと思います。開発にも参加してコミットできるようになると、OSSとして皆さんでハッピーになれるので、是非チャレンジしてみて下さい。