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 オブジェクトにサブディレクトリーを作成し、各イベント名に追加のサブディレクトリーを作成する必要があります。Foreman オブジェクトは、ホストまたはネットワークインターフェイスです。フックへのパスは以下のとおりです。 /usr/share/foreman/config/hooks/object/event/hook_script
たとえば、ホストでオペレーティングシステムのインストールが完了した後にフックをアクティベートするために、以下のコマンドでサブディレクトリーを作成します。
# mkdir -p /usr/share/foreman/config/hooks/host/managed/before_provision/
スクリプトをダウンロードし、適切な名前が付けられたディレクトリーがすでに作成されている場合は、以下のように install コマンドを使用して SELinux コンテキストが正しいことを確認します。
または、イベントサブディレクトリーに直接スクリプトを作成した場合は、
SELinux コンテキストは、Red Hat Enterprise Linux 6 の
install hook_script /usr/share/foreman/config/hooks/object/event/hook_script
root で SELinux コンテキストを適用します。
# restorecon -RvF /usr/share/foreman/config/hooks
bin_t と Red Hat Enterprise Linux 7 の foreman_hook_t です。スクリプトは制限のあるため、一部のアクションが SELinux によって拒否される可能性があることに注意してください。aureport -a を実行するか、/var/log/audit/audit.log を確認して、SELinux が拒否したアクションを確認します。
SELinux の問題のデバッグと audit2allow ユーティリティーの使用の詳細については、以下のドキュメントを参照してください。
手順9.1 Foreman フックを作成してロガーコマンドを使用
このフックスクリプトは、Foreman が新しいサーバーをプロビジョニングするたびに追加のログメッセージを作成します。
- Satellite Server ベースシステムでディレクトリー構造を作成します。
# mkdir -p /usr/share/foreman/config/hooks/host/managed/before_provision/ - 以下のようにスクリプトを作成します。数値の接頭辞 10 は、ファイル名
# vi /usr/share/foreman/config/hooks/host/managed/before_provision/10_logger.sh #!/bin/bash/ logger $1 $2_logger.shに付けられ、同じサブディレクトリー内のスクリプトの実行順序を決定します。この接頭辞は、ニーズに合わせて変更してください。 - スクリプトの所有者を
foremanに変更します。# chown foreman:foreman 10_logger.sh - ユーザーによる実行を許可するためにスクリプトのパーミッションを変更します。
# chmod u+x 10_logger.sh /usr/share/foreman/config/hooksディレクトリー内のすべてのファイルで SELinux コンテキストが正しいことを確認します。# restorecon -RvF /usr/share/foreman/config/hooks/foremanユーザーが ロガー コマンドを使用できるようにするには、以下のルールを/etc/sudoersファイルに追加します。# vi /etc/sudoers foreman ALL=(ALL) NOPASSWD:/usr/bin/logger- フックを登録するために Foreman サービスを再起動します。
# touch ~foreman/tmp/restart.txt
各 Foreman または Rail オブジェクトにはフックを指定できます。
このコマンド出力には、Foreman フックでは使用できないテクニカルテーブルもリストされています(例:"active_record" や "habtm"。以下は最も一般的に使用されます。
/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
- host
- report
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の下部にある Constants セクションを参照してください。[14] ドキュメント。
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 で提供され、多くのユーザーにとっては、このユーティリティースクリプトを利用するのに十分です。そうしないと、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 で呼び出されます)。