付録A テンプレート作成の参照
Embedded Ruby (ERB) は、プレーンテキストと Ruby コードを組み合わせるテンプレートをベースにしてテキストファイルを生成するためのツールです。Red Hat Satellite は、プロビジョニングテンプレート (『プロビジョニングガイド』の「プロビジョニングテンプレートの作成」)、リモート実行の ジョブテンプレート (「5章ホストでのリモートジョブの実行」)、レポートテンプレート (3章ホストモニタリングレポートの生成)、パーティションテーブル のテンプレート (『プロビジョニングガイド』の「パーティションテーブルの作成」)、スマート変数 (『Puppet ガイド』の「スマート変数の設定」)、および スマートクラスパラメーター (『Puppet ガイド』の「スマートクラスパラメーターの設定」) で ERB 構文を使用します。本セクションでは、ERB テンプレートで使用できる Satellite 固有の関数および変数の概要を説明し、使用例を挙げます。また、Red Hat Satellite で提供されるデフォルトテンプレート (ホスト > プロビジョニングテンプレート、ホスト > ジョブテンプレート、モニター > レポートテンプレート) でも ERB 構文例が紹介されています。
ホストのプロビジョニング時またはリモートジョブの実行時に、ERB のコードが実行し、変数がホスト固有の値に置き換えられます。このプロセスは、レンダリング と呼ばれています。Satellite Server ではセーフモードのレンダリングオプションがデフォルトで有効になっており、これにより、有害なコードがテンプレートから実行されないようにすることができます。
A.1. ERB テンプレートの作成
以下は ERB 構文を要約したポイントになります。
<% %>: Ruby コードを ERB テンプレート内で囲むマークです。コードはテンプレートのレンダリング時に実行されます。これには Ruby の制御フロー構造と、Satellite 固有の関数および変数を含めることができます。たとえば、以下のようになります。
<% if @host.operatingsystem.family == "Redhat" && @host.operatingsystem.major.to_i > 6 %> systemctl <%= input("action") %> <%= input("service") %> <% else %> service <%= input("service") %> <%= input("action") %> <% end -%>
<%= %>: コード出力はテンプレートに挿入されます。これは変数の置き換えに便利です。たとえば、以下のようになります。
echo <%= @host.name %>
<% -%>、<%= -%>: デフォルトでは、%> が行末で閉じられている場合に、改行文字は Ruby ブロックの後に挿入されます。この動作を抑制するには、囲みマークを変更します。たとえば、以下のようなテンプレートになります。
curl <%= @host.ip -%> /mydir
上記のテンプレートは以下のようにレンダリングされます。
curl <%= @host.ip %>/mydir
これはレンダリングされるテンプレートの行数を減らすために使用されます (Ruby 構文で許可される場合)。
<%# %>: テンプレートのレンダリング時に無視されるコメントを囲むマークです。
<%# A comment %>
A.2. ERB テンプレートのトラブルシューティング
Satellite web UI では、特定ホストについてのテンプレートのレンダリングを検証するための 2 つの方法を提供しています。
- テンプレートエディターによる直接的な方法: テンプレートの編集時に (ホスト > パーティションテーブル、ホスト > プロビジョニングテンプレート、または ホスト > ジョブテンプレート の) テンプレート タブで プレビュー をクリックしてから、ドロップダウンメニューでホストを選択します。次に、選択したホストのパラメーターを使用して、テキストフィールドでテンプレートをレンダリングします。プレビューが失敗した場合は、ここでテンプレートの問題を特定できます。
- ホストの詳細ページを使用する方法: ホスト > すべてのホスト でホストを選択し、テンプレート タブをクリックして、ホストに関連付けらえたテンプレートを一覧表示します。選択したテンプレートの横にあるドロップダウンメニューから 確認 を選択して、そのテンプレートをレンダリングします。
A.3. Satellite 固有の関数および変数
本セクションでは、ERB テンプレート用の Satellite 固有の関数および変数を一覧表示します。この中にはどのテンプレートでも使用できるものもあれば、使用が制限されるものもあります。たとえば、ジョブテンプレートは @host 変数のみを受け入れ、表A.4「キックスタート固有の変数」 の変数はキックスタートテンプレートでのみ適用できます。
以下の表に記載されている関数は、すべての種類のテンプレートで使用することができます。
表A.1 汎用的な関数
名前 | 説明 |
---|---|
indent(n) |
コードブロックを n スペース分インデントします。インデントされていないスニペットテンプレートの使用時に便利です。 |
foreman_url(kind) |
完全な URL を、ホストでレンダリングされた指定タイプのテンプレートに返します。たとえば、「provision」タイプのテンプレートは通常 http://HOST/unattended/provision にあります。 |
snippet(name) |
指定されたスニペットテンプレートをレンダリングします。プロビジョニングテンプレートをネスト化するのに便利です。 |
snippets(file) |
Foreman データベースで、指定したスニペットをレンダリングします。データベースにない場合は unattended/snippets/ ディレクトリーからこれをロードします。 |
snippet_if_exists(name) |
指定されたスニペットをレンダリングし、指定された名前を持つスニペットが見つからない場合は省略します。 |
例A.1 スニペットおよびインデント関数の使用
以下の構文は、subscription_manager_registration スニペットをテンプレートにインポートし、4 スペース分インデントします。
<%= indent 4 do snippet 'subscription_manager_registration' end %>
以下の関数はジョブテンプレートで使用できます。使用例は「詳細テンプレートの作成」を参照してください。
表A.2 ジョブテンプレート固有の関数
名前 | 説明 |
---|---|
input(input_name) |
ジョブ実行時に指定された入力の値を返します。 |
render_template(name, parameters) |
汎用的な snippet() 関数と同様に指定されたテンプレートを返しますが、引数をテンプレートに渡すことができます。 |
以下の変数は、テンプレート内でのホストの使用を可能にします。
表A.3 ホスト固有の変数および関数
名前 | 説明 |
---|---|
@host.architecture |
ホストのアーキテクチャーです。 |
@host.bond_interfaces |
すべてのボンディングインターフェースのアレイを返します。注記 を参照してください。 |
@host.capabilities |
システムプロビジョニングの方法には、ビルド (キックスタートなど) またはイメージのいずれかを使用できます。 |
@host.certname |
ホストの SSL 証明書名です。 |
@host.diskLayout |
ホストのディスクレイアウトです。オペレーティングシステムから継承できます。 |
@host.domain |
ホストのドメインです。 |
@host.environment |
ホストの Puppet 環境です。 |
@host.facts |
Facter からファクトの Ruby ハッシュを返します。たとえば、出力の 'ipaddress' ファクトにアクセスするには、@host.facts['ipaddress'] を指定します。 |
@host.grub_pass |
ホストの GRUB パスワードを返します。 |
@host.hostgroup |
ホストのホストグループです。 |
host_enc['parameters'] |
ホストパラメーターの情報が含まれる Ruby ハッシュを返します。たとえば、host_enc['parameters']['lifecycle_environment'] を使用してホストのライフサイクル環境を取得します。 |
@host.image_build? |
ホストがイメージを使用してプロビジョニングされる場合は |
@host.interfaces |
プライマリーインターフェースを含む利用可能なすべてのホストインターフェースのアレイが含まれます。注記 を参照してください。 |
@host.interfaces_with_identifier('IDs') |
指定された ID を持つインターフェースのアレイを返します。複数の ID のアレイを入力として渡すことができます (例: @host.interfaces_with_identifier(['eth0', 'eth1']))。注記 を参照してください。 |
@host.ip |
ホストの IP アドレスです。 |
@host.location |
ホストの位置です。 |
@host.mac |
ホストの MAC アドレスです。 |
@host.managed_interfaces |
管理対象インターフェースのアレイを返します (BMC およびボンディングインターフェースを除く)。注記 を参照してください。 |
@host.medium |
割り当てられたオペレーティングシステムのインストールメディアです。 |
@host.name |
ホストの完全名です。 |
@host.operatingsystem.family |
オペレーティングシステムファミリーです。 |
@host.operatingsystem.major |
割り当てられたオペレーティングシステムのメジャーバージョンの番号です。 |
@host.operatingsystem.minor |
割り当てられたオペレーティングシステムのマイナーバージョンの番号です。 |
@host.operatingsystem.name |
割り当てられたオペレーティングシステムの名前です。 |
@host.operatingsystem.boot_files_uri(medium_provider) |
カーネルおよび initrd への完全パスで、アレイを返します。 |
@host.os.medium_uri(@host) |
プロビジョニングに使用される URI です (インストールメディアに設定されるパス)。 |
host_param('parameter_name') |
指定したホストパラメーターの値を返します。 |
host_param_false?('parameter_name') |
指定したホストパラメーターが false と評価されると、 |
host_param_true?('parameter_name') |
指定したホストパラメーターが true と評価されると、 |
@host.primary_interface |
ホストのプライマリーインスタンスを返します。 |
@host.provider |
コンピュートリソースプロバイダーです。 |
@host.provision_interface |
ホストのプロビジョニングインターフェースを返します。インターフェースオブジェクトを返します。 |
@host.ptable |
パーティションテーブル名です。 |
@host.puppetmaster |
ホストが使用する必要のある Puppet マスターです。 |
@host.pxe_build? |
ホストがネットワークまたは PXE を使用してプロビジョニングされる場合に |
@host.shortname |
ホストの省略名です。 |
@host.sp_ip |
BMC インターフェースの IP アドレスです。 |
@host.sp_mac |
BMC インターフェースの MAC アドレスです。 |
@host.sp_name |
BMC インターフェースの名前です。 |
@host.sp_subnet |
BMC ネットワークのサブネットです。 |
@host.subnet.dhcp |
DHCP プロキシーがこのホストに設定されている場合は |
@host.subnet.dns_primary |
ホストのプライマリー DNS サーバーです。 |
@host.subnet.dns_secondary |
ホストのセカンダリー DNS サーバーです。 |
@host.subnet.gateway |
ホストのゲートウェイです。 |
@host.subnet.mask |
ホストのサブネットマスクです。 |
@host.url_for_boot(:initrd) |
このホストに関連付けられる initrd イメージへの完全パスです。変数を補間しないので推奨されません。 |
@host.url_for_boot(:kernel) |
このホストに関連付けられたカーネルへの完全パスです。変数を補間しないので推奨されません。boot_files_uri が優先されます。 |
@provisioning_type |
プロビジョニングのタイプに応じて「host」または「hostgroup」と等しくなります。 |
@static |
ネットワーク設定が静的な場合、 |
@template_name |
レンダリングされるテンプレートの名前です。 |
grub_pass |
md5pass 引数でラップされる GRUB パスワードを返します (例: --md5pass=#{@host.grub_pass})。 |
ks_console |
ポートを使用して組み立てられる文字列、およびカーネル行に追加できるボーレートを返します (例: console=ttyS1,9600)。 |
root_pass |
システムに設定される root パスワードを返します。 |
@host.interfaces
、@host.bond_interfaces
などのネットワークインターフェースに関連するホスト変数は、アレイで分類されるインターフェースデータを返します。特定インターフェースのパラメーター値を抽出するには、Ruby メソッドを使用してアレイを解析します。たとえば、アレイの最初のインターフェースに関する情報を取得し、これをキックスタートテンプレートで使用するには、以下を実行します。
<% myinterface = @host.interfaces.first %> IPADDR="<%= myinterface.ip %>" NETMASK="<%= myinterface.subnet.mask %>" GATEWAY="<%= myinterface.subnet.gateway %>"
インターフェース名のアレイを抽出するなどの目的でインターフェースアレイを繰り返すことができます。以下を使用します。
<% ifnames = [] @host.interfaces.each do |i| ifnames.push(i.name) end %>
例A.2 ホスト固有変数の使用
以下の例では、ホストで Puppet および Puppetlabs リポジトリーが有効にされているかどうかをチェックします。
<% pm_set = @host.puppetmaster.empty? ? false : true puppet_enabled = pm_set || host_param_true?('force-puppet') puppetlabs_enabled = host_param_true?('enable-puppetlabs-repo') %>
以下の例では、パッケージ関連の決定に使用できるホストのオペレーティングシステムのマイナーバージョンおよびメジャーバージョンを取得する方法を示します。
<% os_major = @host.operatingsystem.major.to_i os_minor = @host.operatingsystem.minor.to_i %> <% if ((os_minor < 2) && (os_major < 14)) -%> ... <% end -%>
以下の例では、ホストのサブネットで DHCP ブートモードが有効な場合に 'kickstart_networking_setup' スニペットをインポートします。
<% subnet = @host.subnet %> <% if subnet.respond_to?(:dhcp_boot_mode?) -%> <%= snippet 'kickstart_networking_setup' %> <% end -%>
一般的な Ruby メソッドのほとんどはホスト固有の変数で使用できます。たとえば、ホストの IP アドレスの最後のセグメントを抽出するには、以下を使用できます。
<% @host.ip.split('.').last %>
以下の変数は、キックスタートプロビジョニングテンプレート内で使用されるように設計されています。
表A.4 キックスタート固有の変数
名前 | 説明 |
---|---|
@arch |
ホストのアーキテクチャー名です。@host.architecture.name と同じです。 |
@dynamic |
使用されているパーティションテーブルが %pre スクリプト (表の最初の行に #Dynamic オプションがある) の場合 |
@epel |
epel-release rpm の正しいバージョンを自動インストールするコマンドです。%post スクリプトで使用されます。 |
@mediapath |
URL コマンドを提供する詳細なキックスタート行です。 |
@osver |
オペレーティングシステムのメジャーバージョンの番号です。@host.operatingsystem.major と同じです。 |