付録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?

ホストがイメージを使用してプロビジョニングされる場合は true を返します。

@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 と評価されると、false を返します。

host_param_true?('parameter_name')

指定したホストパラメーターが true と評価されると、true を返します。

@host.primary_interface

ホストのプライマリーインスタンスを返します。

@host.provider

コンピュートリソースプロバイダーです。

@host.provision_interface

ホストのプロビジョニングインターフェースを返します。インターフェースオブジェクトを返します。

@host.ptable

パーティションテーブル名です。

@host.puppetmaster

ホストが使用する必要のある Puppet マスターです。

@host.pxe_build?

ホストがネットワークまたは PXE を使用してプロビジョニングされる場合に true を返します。

@host.shortname

ホストの省略名です。

@host.sp_ip

BMC インターフェースの IP アドレスです。

@host.sp_mac

BMC インターフェースの MAC アドレスです。

@host.sp_name

BMC インターフェースの名前です。

@host.sp_subnet

BMC ネットワークのサブネットです。

@host.subnet.dhcp

DHCP プロキシーがこのホストに設定されている場合は true を返します。

@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

ネットワーク設定が静的な場合、true を返します。

@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 オプションがある) の場合 true を返します。

@epel

epel-release rpm の正しいバージョンを自動インストールするコマンドです。%post スクリプトで使用されます。

@mediapath

URL コマンドを提供する詳細なキックスタート行です。

@osver

オペレーティングシステムのメジャーバージョンの番号です。@host.operatingsystem.major と同じです。