9.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[12] を参照してください。
  • Red Hat Enterprise Linux 7 の場合は、Fixing Problems[13] を参照してください。

手順9.1 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. フックを登録するために Foreman サービスを再起動します。
    # touch ~foreman/tmp/restart.txt
各 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",出力省略
このコマンド出力は、Foreman フックで使用されない可能性が高いいくつかの技術的な表 ("active_record" や "habtm" など) もリストします。最も一般的に使用されるものは以下のとおりです。
  • host
  • レポート

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

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

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

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

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

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

このページには機械翻訳が使用されている場合があります (詳細はこちら)。