Red Hat Training

A Red Hat training course is available for Red Hat Satellite

第13章 Satellite Server 機能の拡張

Red Hat Satellite Server は、プラグインをインストールし、オーケストレーションと Rails イベントにフックを使用することで、機能拡張が可能です。プラグインは、RPM パッケージとして Red Hat リポジトリーと Foreman リポジトリーから入手できます。

13.1. Satellite プラグイン

Satellite プラグインは以下から入手できます。

  • Red Hat リポジトリー
  • Foreman リポジトリー

Satellite 用のプラグインには通常、RPM パッケージ名に foreman という語が含まれており、Capsule 用のプラグインには、名前に smart_proxy が含まれています。

Red Hat が提供するプラグインは、Satellite CLI から yum コマンドを使用して検索とインストールができます。

アップストリーム の Satellite プラグインは、Foreman リポジトリーで入手できます。Foreman の各リリースには、該当リリース用のプラグインを格納している個別のリポジトリーがあります。

アップストリーム プラグインをインストールするには、Foreman リポジトリーを Satellite で設定する必要があります。設定が完了したら、yum コマンドを使用して Satellite CLI から検索とインストールができます。

Foreman リポジトリーは、http://yum.theforeman.org/plugins から入手できます。

注記

お使いのシステムにある Foreman のバージョンと互換性のあるプラグインをインストールするように注意してください。

yum info または rpm -qi を使用すると、RPM パッケージの説明を表示してプラグインを確認することができます。

重要

Red Hat では、Foreman API はサポートしていますが、Foreman リポジトリーからインストールしたプラグインはサポートしていません。

13.1.1. プラグインの検索

Satellite CLI を使って利用可能なプラグインを検索します。

注記

アップストリーム プラグインも検索するには、Foreman リポジトリーを 「Foreman リポジトリーの設定」 の説明に従って設定します。

手順

  • root ユーザーとして yum search を使ってパッケージ名に "-foreman" がつくパッケージを検索します。

    例 - Satellite 用 rubygem プラグインの検索

    # yum search rubygem-foreman
    Loaded plugins: product-id, search-disabled-repos, subscription-manager
    =================== N/S matched: rubygem-foreman ==============================
    tfm-rubygem-foreman-redhat_access.noarch : Foreman engine to access Red Hat knowledge base and manage support cases.
    tfm-rubygem-foreman-tasks.noarch : Tasks support for Foreman with Dynflow integration
    tfm-rubygem-foreman_abrt.noarch : Display reports from Automatic Bug Reporting Tool in Foreman
    tfm-rubygem-foreman_bootdisk.noarch : Create boot disks to provision hosts with Foreman
    出力省略

13.1.2. プラグインのインストール

Satellite CLI を使用してプラグインをインストールします。

注記

アップストリーム プラグインをインストールするには、Foreman リポジトリーを 「Foreman リポジトリーの設定」 の説明に従って設定します。

手順

  1. yum install を使用して必要なプラグインをインストールします。

    例: tfm-rubygem-foreman_templates プラグインのインストール:

    # yum install tfm-rubygem-foreman_templates
  2. foreman-maintain サービスを再起動します。

    # foreman-maintain service restart

インストールされたことを確認するには、yum を使ってインストールされたプラグインを一覧表示します。

  • 例: rubygem-foreman プラグインのインストール確認

    # yum list installed | grep rubygem-foreman | grep foreman
  • yum を使って Capsule プラグインを一覧表示することもできます。

    # yum list installed | grep proxy

13.1.3. Foreman リポジトリーの設定

Satellite CLI を使用して Foreman リポジトリーを設定します。

手順

  1. rpm コマンドで Foreman のリリースを確認します。

    $ rpm -q foreman
    foreman-1.7.2.53-1.el7sat.noarch
  2. rpm 設定ファイルを作成します。

    touch /etc/yum.repos.d/foreman-plugins.repo
  3. 以下の内容をファイルに追加します。

    [foreman-plugins]
    name=Foreman plugins
    baseurl=http://yum.theforeman.org/plugins/1.10/el_7_/x86_64/
    enabled=1
    gpgcheck=0

    URL 内のバージョン番号 (上記の 1.10) を必要な Foreman リリース番号で置き換えます。

注記

これらのパッケージは現在 GPG 署名されていません。

foreman プラグインについての情報は、Foreman web サイトの Popular Plugins および List of Plugins セクションを参照してください。

13.2. Foreman フック

Foreman のホストオーケストレーションはフックで拡張することで、追加のタスクを実行できるようになります。Foreman フックを使用すると、ホストの作成時やホストのプロビジョニングの完了時などのオーケストレーションイベントが発生するときに、スクリプトをトリガーできます (どのような実行可能ファイルでも使用できます)。また、フックはスクリプトとともに Foreman オブジェクトの標準的な Rails コールバックに組み込むことができます。

注記

Foreman フックは Satellite のワークフローを変更できるため、Red Hat からサポートを得るためにすべてのフックを削除するよう求められることがあります。また、Foreman フックはアップグレードの前に削除し、Satellite が期待どおり動作していることを確認した後に復元する必要があります。

13.2.1. Foreman フックのインストール

Foreman フックは、デフォルトでインストールされる tfm-rubygem-foreman_hooks パッケージが提供します。パッケージがインストールされ、最新の状態であることを確認するために、rootyum を使用します。

手順

  • yum 使用して foreman フックをインストールします。

    # yum install tfm-rubygem-foreman_hooks
    Loaded plugins: product-id, search-disabled-repos, subscription-manager
    Package tfm-rubygem-foreman_hooks-0.3.9-2.el7sat.noarch already installed and latest version
    Nothing to do

13.2.2. Foreman フックの作成

Foreman フックは /usr/share/foreman/config/hooks/ に格納されます。

手順

  1. 各 Foreman オブジェクトには 1 つのサブディレクトリーを作成する必要があります (各イベント名には他のサブディレクトリーが作成されます)。Foreman オブジェクトは、ホストまたはネットワークインターフェースである場合があります。フックへのパスは以下のようになります。

    /usr/share/foreman/config/hooks/object/event/hook_script
  2. たとえば、ホストでオペレーティングシステムのインストールが完了した後にフックをアクティベートするために、以下のコマンドでサブディレクトリーを作成します。

    # mkdir -p /usr/share/foreman/config/hooks/host/managed/before_provision/
  3. スクリプトをダウンロードし、適切な名前が指定されたディレクトリーがすでに作成されている場合は、以下のように install コマンドを使用して SELinux コンテキストが正しいことを確認します。

    install hook_script /usr/share/foreman/config/hooks/object/event/hook_script
    • または、イベントサブディレクトリーに直接スクリプトを作成した場合は、root で以下のコマンドを入力して SELinux コンテキストを適用します。

      # restorecon -RvF /usr/share/foreman/config/hooks

      Red Hat Enterprise Linux 7 での SELinux コンテキストは foreman_hook_t です。スクリプトは制限のある状態で実行されるため、一部のアクションが SELinux によって拒否される場合があることに注意してください。SELinux により拒否されたアクションを確認するには、aureport -a を実行するか、/var/log/audit/audit.log を調べます。

      SELinux の問題のデバッグと audit2allow ユーティリティーの使用の詳細については、以下のトピックを参照してください。

    • Red Hat Enterprise Linux 7 の場合は、Fixing Problems[9] を参照してください。

13.2.3. Foreman フックを作成してロガーコマンドを使用

このフックスクリプトは、Foreman が新しいサーバーをプロビジョニングするたびに追加のログメッセージを作成します。

手順

  1. Satellite Server ベースシステムでディレクトリー構造を作成します。

    # mkdir -p /usr/share/foreman/config/hooks/host/managed/before_provision/
  2. 以下のようにスクリプトを作成します。

    # vi /usr/share/foreman/config/hooks/host/managed/before_provision/_10__logger.sh
    #!/bin/bash
    logger $1 $2

    ファイル名 _logger.sh の前の数値の接頭辞 10 により、同じサブディレクトリー内のスクリプトの実行順序が決定されます。必要に応じてこの接頭辞を変更します。

  3. スクリプトの所有者を foreman に変更します。

    # chown foreman:foreman /usr/share/foreman/config/hooks/host/managed/before_provision/_10__logger.sh
  4. ユーザーによる実行を許可するためにスクリプトのパーミッションを変更します。

    # chmod u+x /usr/share/foreman/config/hooks/host/managed/before_provision/_10__logger.sh
  5. SELinux コンテキストが /usr/share/foreman/config/hooks ディレクトリー内のすべてのファイルで正しいことを確認します。

    # restorecon -RvF /usr/share/foreman/config/hooks/
  6. foreman ユーザーが logger コマンドを使用できるようにするために、以下のルールを /etc/sudoers ファイルに追加します。

    # vi /etc/sudoers
    foreman ALL=(ALL) NOPASSWD:/usr/bin/logger
  7. Satellite サービスを再起動して、フックを登録します。

    # foreman-maintain service restart

各 Foreman または Rail オブジェクトにはフックを含めることができます。/usr/share/foreman/app/models/ ディレクトリーを確認するか、利用可能なモデルの完全なリストを取得するために、以下のコマンドを入力します。

# foreman-rake console
>
ActiveRecord::Base.descendants.collect(&:name).collect(&:underscore).sort
=> ["audited/adapters/active_record/audit", "compute_resource", "container",
output truncated

このコマンド出力は、Foreman フックで使用されない可能性が高いいくつかの技術的な表 ("active_record" や "habtm" など) も一覧表示します。一般的に使用されるものは以下のとおりです。

  • host
  • report

13.2.4. オーケストレーションイベント

Foreman は、オブジェクトが作成、更新、および破棄された際に、ホストおよびネットワークインターフェース (オブジェクトと呼ばれます) 向けのオーケストレーションタスクをサポートします。これらのタスクは Web UI でユーザーに表示されます。タスクが失敗した場合は、アクションのロールバックが自動的にトリガーされます。オーケストレーションフックには優先度を割り当てることができるため、組み込みオーケストレーション手順の前または後 (たとえば、DNS レコードがデプロイされる前) にオーケストレーションフックを呼び出すことができます。

フックをイベントに追加するには、以下のイベント名を使用します。

  • create
  • update
  • destroy

13.2.5. Rails イベント

(上述したオーケストレーションをサポートする) ホストと NIC 以外のものに対するフックの場合は、標準的な Rails イベントを使用できます。各イベントには "before" フックと "after" フックがあります。提供される最も興味深いイベントは以下のとおりです。

  • after_create
  • before_create
  • after_destroy
  • before_destroy

ホストオブジェクトでは、以下の 2 つの追加コールバックを使用できます。

  • host/managed/after_build は、ホストがビルドモードになると開始されます。
  • host/managed/before_provision は、ホストで OS のインストールが完了すると、開始されます。

Rails イベントの完全なリストについては、Ruby on Rails ActiveRecord::Callbacks[10] ドキュメンテーションの「Constants」を参照してください。

13.2.6. フックの実行

フックは Foreman サーバーのコンテキスト (したがって、通常は foreman ユーザー下) で実行されます。最初の引数は常にイベント名であり、スクリプトを複数のイベントディレクトリーにシンボリックリンクすることを可能にします。2 つ目の引数はフックされたオブジェクトの文字列表現 (たとえば、ホストのホスト名) です。

~foreman/config/hooks/host/managed/create/50_register_system.sh create foo.example.com

フックオブジェクトの JSON 表現は標準入力で渡されます。この JSON は v2 API ビューによって生成されます。jgrep でこれを読み取るユーティリティーは examples/hook_functions.sh で提供され、ほとんどのユーザーにとっては、このユーティリティースクリプトを source コマンドで実行するだけで十分です。それ以外の場合は、パイプバッファーが満杯になり、Foreman スレッドがブロックされることを防ぐために、標準入力を閉じることが推奨されます。

echo '{"host":{"name":"foo.example.com"}}' \
  | ~foreman/config/hooks/host/managed/create/50_register_system.sh \
       create foo.example.com

イベントディレクトリー内の各フックは、アルファベット順に実行されます。オーケストレーションフックの場合は、フックのファイル名の整数接頭辞が優先度値として使用されます。このため、DNS、DHCP、VM 作成、および他のタスクに関連して実行するタイミングが影響を受けます。

13.2.7. フックの失敗とロールバック

フックが失敗し、ゼロ以外のリターンコードで終了した場合は、イベントがログに記録されます。Rails イベントの場合は、他のフックの実行が続行されます。オーケストレーションイベントの場合は、失敗によってアクションが中止され、ロールバックが実行されます。別のオーケストレーションアクションが失敗した場合は、そのアクションをロールバックするためにフックが再び呼び出されることがあります。この場合は、最初の引数が適切に変更されるため、スクリプトで処理する必要があります (たとえば、"create" フックは、あとでロールバックする必要がある場合、"destroy" とともに呼び出されます)。