Red Hat Training

A Red Hat training course is available for Red Hat Satellite

第11章 Satellite Server のカスタマイズ

Red Hat Satellite Server は、ユーザーインターフェースプラグインの追加と、オーケストレーションおよび Rails イベントによりトリガーされたフックの使用で拡張できます。一部のプラグインはデフォルトでインストールされますが、追加のプラグインは Red Hat リポジトリーとアップストリームから RPM パッケージとしてインストールできます。

Satellite 用のプラグインには通常、RPM パッケージ名に foreman という語が含まれており、Capsule 用のプラグインには、名前に smart_proxy が含まれています。yum info または rpm -qi を使用して、RPM パッケージの説明を表示し、プラグインを確認します。アップストリームプラグインの詳細については、Foreman web サイトの Plugins セクションで確認してください。

Red Hat では、API はサポートしていますが、アップストリームプラグイン自体はサポートしません。一部のフックは RPM パッケージとして提供され、シェルスクリプトとして作成できるフックもあります。これにより、シェルスクリプトの知識がある管理者は、Ruby と Rails を使用せずに Satellite の機能を拡張することが可能になります。

11.1. プラグインの追加

設定されたリポジトリーから利用可能なプラグインをリストするには、Satellite Server 上で root として、パッケージ名の一部を使用して検索することができます。例を示します。

# 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
output truncated

Satellite に現在インストールされているプラグインを表示するには、root で以下のコマンドを入力します。

# yum list installed | grep rubygem-foreman | grep foreman

Capsule に現在インストールされているプラグインを表示するには、root で以下のコマンドを入力します。

# yum list installed | grep proxy

新しいプラグインを追加するには、パッケージをインストールし、Foreman を再起動します。たとえば、Templates プラグインをインストールするには、root で以下のコマンドを入力します。

# yum install tfm-rubygem-foreman_templates

Katello サービスを再起動して、プラグインを登録します。

# katello-service restart

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

重要

Foreman フックがインストール、設定されている場合は、Satellite の診断やサポートを Red Hat では実行できません。Foreman フックは自己責任でご使用ください。

Red Hat では、プラグイン API はサポートしていますが、特定のアップストリームプラグイン自体のサポートは提供していません。Foreman フックは Satellite でのワークフローを変更する可能性があります。このため、Red Hat からサポートを受ける場合には、Red Hat サポートがフックすべてを削除するよう依頼する場合があります。

Foreman フックは、Satellite 移行プロセスでは移行できません。つまり、アップグレード前にフックを削除し、Satellite アップグレードが正常に機能していることを確認した後に、ご自分でフックを元に戻していただく必要があります。

Foreman リポジトリーからのプラグインの追加

Foreman リポジトリーは、http://yum.theforeman.org/plugins から入手できます。各 Foreman リリースには、その特定のバージョンと互換性があるプラグインを含む独立したリポジトリーが利用可能です。Foreman のバージョンと互換性があるプラグインをシステムにインストールします。使用している Foreman のリリースを調べるには、以下のコマンドを入力します。

$ rpm -q foreman
foreman-1.7.2.53-1.el7sat.noarch

以下のように Foreman リポジトリーを設定します。

# /etc/yum.repos.d/foreman-plugins.repo
[foreman-plugins]
name=Foreman plugins
baseurl=http://yum.theforeman.org/plugins/1.10/el_X_/x86_64/
enabled=1
gpgcheck=0

ここでの X は、Red Hat Enterprise Linux 6 か 7 に応じて 6 または 7 にします。使用中の Foreman のリリースに合わせて URL のバージョン番号を変更します。パッケージは現在 GPG 署名されていないことに注意してください。

  1. 検索機能を使用してプラグインのパッケージを見つけます。たとえば、名前に "discovery" という単語があるプラグインを検索するには、以下のコマンドを実行します。

    # yum search discovery

    または、プラグインの名前のプラグインドキュメンテーションを確認します。

  2. たとえば、以下のようにパッケージをインストールします。

    # yum install tfm-rubygem-foreman_discovery
  3. Katello サービスを再起動して、プラグインを登録します。

    # katello-service restart

11.2. Foreman フックの使用

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

注記

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

Foreman フックは、デフォルトでインストールされる tfm-rubygem-foreman_hooks パッケージにより提供されます。必要な場合は、パッケージがインストールされ、最新の状態であることを確認するために、root で以下のコマンドを入力します。

# 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

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

/usr/share/foreman/config/hooks/object/event/hook_script

たとえば、ホストでオペレーティングシステムのインストールが完了した後にフックをアクティベートするためにサブディレクトリーを作成するには、以下のようにコマンドを入力します。

# mkdir -p /usr/share/foreman/config/hooks/host/managed/before_provision/

スクリプトをダウンロードし、適切な名前が指定されたディレクトリーがすでに作成されている場合は、以下のように install コマンドを使用して SELinux コンテキストが正しいことを確認します。

install hook_script /usr/share/foreman/config/hooks/object/event/hook_script

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

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

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

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

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

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 _10__logger.sh
  4. ユーザーによる実行を許可するためにスクリプトのパーミッションを変更します。

    # chmod u+x _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. Katello サービスを再起動して、フックを登録します。

    # katello-service restart

各 Foreman または Rail オブジェクトにはフックを含めることができます。/usr/share/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

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

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

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

  • create
  • update
  • destroy

11.2.2. 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[11] ドキュメンテーションの「Constants」を参照してください。

11.2.3. フックの実行

フックは 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 作成、および他のタスクに関連して実行するタイミングが影響を受けます。

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

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