Insightsの概略を説明しました。Insightsを更にソースコードを読みながら詳細に解説していきます。Clientの詳細な動作を解説します。Hat社の商用のソフトウェアです。内部でinsights-coreが使用されています。以下のコンポーネントから構成されています。Engineに情報を送信します。Engine(insights-core)OSSで提供されているコンポーネントで、データ収集と解析のインフラ部分を担っています。これは他のプロジェクトでも転用が可能とのことです(転用の実例は未だ見てませんが・・・)。Interface実際に情報をわかりやすく見るGUIです。Hatの提供するinsightsのサイト(https://cloud.redhat.com/insights/overview)がこれに該当します。Insightsのフレームワーク(主要なコンポーネント部分)はOSSで公開されています(https://github.com/RedHatInsights)。次章以降はソースを見ながら説明します。insights-clientの説明insights-clientはGitHubで公開されています。そちらの説明を補足する形で解説します。insights-clientのソースコードの取得とインストールinsights-clientの動作を追いかけるために、まずはinsights-clientのソースをgitで取得しインストールしてみます(RHEL8では既にパッケージがありますので、そちらを使うのがベストですが、ソースコードの確認のため入れてみます)。インストールの際には、適当なworkingディレクトリの中にinsights-clientとinsights-coreの両方のソース2つhttps://github.com/RedHatInsights/insights-client.githttps://github.com/RedHatInsights/insights-core.gitを同階層で置いておく(gitで取得しておく)必要があります。ここでは仮に、/home/sios/insights-client以下に2つのディレクトリが取得されているとします。インストールする際のユーザをsudoに登録して下さい(後でinsights-client/lay-the-egg.shスクリプトからsudoが呼び出されます)。事前に以下のパッケージをインストールしておきます。python2-develinsights-clientに移動し、インストールスクリプト(lay-the-eggs.sh)を実行します。install)します。呼び出されるbuild_client_egg.shですが、ソースコード中の情報(rpm.eggとなるinsights/以下のファイル一覧等の情報)を作成しています。eggはGPGでサインされていないので、GPGによるチェックを迂回するために無効化します。InsightsのClientは、2つの主要なコンポーネント(ラッパー(Wrapper)と、更新可能なコアモジュール(EGG))から出来ています。直接コマンドで実行する場合の実体がWrapperで、RHELにRPMパッケージなどでインストールされているものになります。Clientが実行される場合に経由されるメインのものになります。このwrapper経由でEggのモジュールを呼び出して情報を収集したりアップロードを行います。EGGは次の順番で実行され、Eggが失敗した時には順に次のEggを呼び出すことになります。以下で構成されています。Clientのコアモジュールになります。オプション/設定等はWrapperを通して与えられます。このEgg本体は、RPMでインストールしている場合にはinsights-clientのRPMファイルに同梱されている/etc/insights-client/rpm.eggになります(前述のRPM_EGG)。extractのようにZipアーカイブになっているので、リネームして中身を見てみます。insights/client/insights_spec.pyこのように、RPM_EGGは、実は前述のinsights-corehttps://github.com/RedHatInsights/insights-coreのクライアントとして動作するパーツの主要部分として、不要な部分(後述するParserやその他クライアントには必要ない部分、テストユーティリティなど)を削除したものが固められているものになっています。MANIFEST.inのように作られています。いう事で、実際のCore部分は、実はinsights-core内のclientを固めたEgg(insights-core/insights/client)により構成されていて、そのEggをWrapperが叩きに行くことになっています。Insights-clientの動作insights-clientの動作を知るには、ソースコードを参照するのが簡単です。insights-clientの主な動作はinsights-client/insights_client/__init__.pyに書かれています(参照しているオブジェクトはinsights-core/insights/client以下に置かれています(所謂Eggです)。そのため、インストールにはclientとcoreの両方が必要になります)。insights_client/__init__.py中のmain()を少し見て、動きを見てみましょう。rootアカウントで動作しているかを確認します。EGGファイルを探して参照します。found”を表示して終了します。insights/clientからInsightsClient()をインポートします。設定ファイルを読み込みます。無い場合にはデフォルト値を使います。Insights-serverへの接続を初期化します。insights/client/phase/v1.pyからget_phases()をインポートします。confファイルをロードし、logに出力できるようにします。validated_eggs)の所で、それぞれの”phase”に従って処理が進められます。Insights-clientの”Phase”insights-clientは次の4つの”Phase”毎にモジュール化されて実行されます。そのため、EGGに問題が有り処理が中断されたとしても、その次の候補のEGGを用いて現在の状態がレジュームされる事になっています。pre_update“すぐに実行する(–statusと–unregisterを除く)指定されたスイッチ”を実行し、必要ならExitします。updateInsightsサーバと接続を行い、アップストリームのEGGが新しいバージョンの場合にはEGGの更新を行います。情報収集のための新しい”uploader.json”をダウンロードします。Phaseで収集します。こちらに関しては、次の項で説明します。post_update登録されているかの確認です。システムが未登録で、登録が必要な操作をしている場合にはExitします。collect_and_outputuploader.jsonファイルや/etc/insights-client以下の設定ファイルに従って情報収集を実行し、望まれた形式で出力します。デフォルトではInsightsにアップロードされるアーカイブ形式です。情報収集insights-clientはシステムの情報を収集するために2つの”モード”(設定ファイル等からの出力結果と、コマンドによる出力結果)を使用しています。それぞれ定義どおりの話と注意事項はこちらのREADMEにも記載されていますが、実際にどうなっているかを理解するためにuploader.jsonファイルを参照しながら説明しましょう。それぞれファイル/コマンドを実行する部分はinsights-core/insights/client/insights_spec.pyになります。ファイル(file)ファイルの箇所でファイルに含まれるパターンを指定し、そのパターンに対する値を抽出します。例として、ssh(/etc/ssh/sshd_config)の設定ですが、下記のようなパターンを用いて/etc/ssh/sshd_configファイルから設定を抽出しています。"sshd_config"},ここで、/etc/insights-client/remove.confファイル(場所の指定は/etc/insishgt-client/insights-client.confファイルに従います)にファイル名を列記することで、情報を収集するファイルから除外することが可能です。コマンド(command)コマンドの出力結果から含まれるパターンを指定し、そのパターンに対する値を抽出します。例として、lsofの設定ですが、下記のようなパターンを用いてlsofコマンドから設定を抽出しています。"lsof"},ここで、/etc/insights-client/remove.confファイル(場所の指定は/etc/insishgt-client/insights-client.confファイルに従います)にコマンド名を列記することで、情報を収集するコマンドから除外することが可能です。Supportから見る事ができます。正規表現を用いてパターンで除外したり、キーワードを列挙することが可能です。収集されたデータがどのような形式になっているかは、実際にオフラインで(Insightsサーバに接続しないで)データを収集して出力するモードを使用すると理解しやすいでしょう。insights-clientをオフラインオプションを付けて実行してみます。こちらの中身を見てみましょう。version_info収集された情報がそれぞれのディレクトリに集まっていることがわかります。下記のように、etc/以下に色々な”file”で指定したパターンで出力された設定情報が集められています。getenforceEnforcingのようにコマンドと出力結果が残っています。これらの情報をinsights-clientはinsightsサーバに送信しています。Insights-clientのネットワーク接続insights-clientはinsightsサーバとHTTPSを利用して情報を送ります。この接続部分は、insights-core/insights/client/connection.pyに記載されています。アクセスを行うことです。このサイトに接続できない場合には、insights-clientは正常に動作しません。疎通テストを行う際には、タイムアウト値を10秒として、ステータスコード200(OK)か201(Created)が帰ってきた場合には、疎通確認が取れたということにしています。seconds#http_timeout=10として設定されているため、変更が可能です。先の章で記したシステム情報(アーカイブ)をアップロードする際には、HTTPSを用いて暗号化し平文では流れないようにしてあります。その他Insights-Clientのソースコードは少し入り組んでいますが、難しいものではないので一度ソースコードを読んだほうが良いでしょう。