マクロコマンドとマクロ変数

マクロコマンド

マクロコマンドの書式は次の 通りです。

#【マクロコマンド】
条件分岐(if ~ end)

評価式の条件と一致する場合にマクロコマンド内の文字列を出力します。

#if (【評価式1】)
  strings 1
#elseif (【評価式2】)
  strings 2
#else
  strings 3
#end

評価式1に一致した場合は"strings 1"が出力されます。

elseif

先の条件に一致しない場合に評価されます。省略でき、また、複数記述できます。

else

先の条件に一致しない場合に適用されます。省略できます。

評価式

評価式の書式は次の通りです。

#if ( ${【マクロ変数】} 【比較条件】 "【比較文字列】" )
比較演算子

比較演算子は「==(一致)」と「!=(不一致)」を使用できます。

例えば、ローカル変数「hostname」の値が文字列「SEIL」と一致することを条件にする場合は次のように記述します。

#if ( ${local.hostname} == "SEIL" )
  strings 1
#end

比較演算子の左辺と右辺には、それぞれマクロ変数または文字列定数を記述できます。文字列定数は、「SEIL」を「 "SEIL"」のように "" で括ります。

変数が値を持たない場合は、空文字("")と一致します。

数字は文字として扱います。数値としての計算や大小比較はできません。

論理演算子

論理演算子は「&&(AND)」と「||(OR)」を使用でき、比較演算子と組み合わせて条件を定義できます。

例えば次の評価式は、ローカル変数「hostname」の値が文字列「SEIL」と一致し、かつ、ローカル変数「model」の値が文字列「X4」と一致しないことを条件とします。

#if ( ${local.hostname} == "SEIL" && ${local.model} != "X4")
  strings 1
#end

 

繰り返し(foreach)

任意のテンプレートに所属するサービスアダプタ群が持つローカル変数値を順に呼び出し定型的なコンフィグにあてはめ繰り返し処理することができます。書式は次の通りです。

#foreach(${【ループ変数名】} in ${【テンプレート名】})
  strings 1 ${【ループ変数名】.【ローカル変数名1】}
  strings 2 ${【ループ変数名】.【ローカル変数名2】}
#end

foreachループ内でループ変数名とローカル変数名を組み合わせると、指定したテンプレートに所属するサービスアダプタのローカル変数を参照することができます。

例えば、VPN親拠点用のテンプレートで、VPN子拠点のホスト名とアドレスのローカル変数値を順番に出力するには次のように記述します。

#foreach(${edge} in ${vpn_edge})
  target name ${edge.hostname}
  target address ${edge.address}
#end

ループ変数名は任意の文字列を指定します。ループ変数は当該ループ内でのみ参照できます。

テンプレート名は、子拠点用のテンプレート(例として「vpn_edge」)を指定します。

です「edge(例)」にテンプレート「vpn_edge(例)」を指定します。

指定したテンプレートに3個のサービスアダプタが所属している場合、次のような出力が期待できます。

  target name EDGE-1
  target address 10.0.1.1
  target name EDGE-2
  target address 10.0.2.1
  target name EDGE-3
  target address 10.0.3.1
foreachのネスト

マクロコマンドforeachは2段階までネストすることができます。

マクロ変数

マクロ変数はテンプレートコンフィグに記述する変数です。 変数名をコンフィグ中に記述すると、コンフィグの反映時に変数値(文字列)に置き換えられます。

マクロ変数の書式は次の通りです。

${【変数名】} または $変数名
例:
${macro}
$macro

"{" と "}" は省略可能ですが、省略する場合はマクロ変数に続く文字と区切るために空白が必要です。このため、連続する文字列の一部をマクロに置き換える用途には適しません。

このドキュメントでは "{" と "}" を省略せずに記載しています。

ローカル変数

ローカル変数は運用管理担当者が定義します。

ローカル変数「hostname」を定義した場合のテンプレートでの書式は次の通りです。

${local.hostname}

または

${hostname}

テンプレートに関連付けられ、当該テンプレートに所属するサービスアダプタのみ値を設定できます。

また、値の設定が省略された場合のデフォルト値を定義できます。

テンプレートからコンフィグを生成するときに、サービスアダプタごとに設定された変数値に置き換えられます。

テンプレートから所属を解除すると、変数値はクリアされます。

変数名1 ~ 40 文字、半角英数字およびアンダースコアが入力可能(先頭は英字のみ、大文字と小文字を区別します)
変数値0 ~ 3000 文字(改行を含む複数行を設定できます)
設定数テンプレート毎に2000個まで

定型的なコンフィグの内、ホスト名や拠点ごとに異なるISPアカウント情報など、サービスアダプタ個別に設定するパラメータに使用します。

グローバル変数

グローバル変数は運用管理担当者が定義します。

グローバル変数「ntp_address1」を定義した場合のテンプレートでの書式は次の通りです。

${global.ntp_address1}

テンプレートからコンフィグを生成するときに、全てのテンプレート、すべてのサービスアダプタで共通の変数値に置き換えられます。

変数名1 ~ 40 文字、半角英数字およびアンダースコアが入力可能(先頭は英字のみ、大文字と小文字を区別します
変数値0 ~ 300 文字(改行を含む複数行を設定できます)
設定数2000個まで

NTPサーバやDNSサーバのアドレスといった、複数のサービスアダプタが共通で使用するパラメータはテンプレートに直接記述することもできますが、これらをグローバル変数として定義するとテンプレートを他のサービス契約に転用可能になるなど汎用性が向上します。

システム変数

システム変数は予め定義されており、変数ごとに特定の値に置き換えられます。

ループカウンタ
${loopCount}

ループカウンタはマクロコマンド「#foreach」内でのみ使用できます。 初期値「0」から開始し、ループ毎にインクリメントされます。

サービスコード
${system.sa_code}

サービスアダプタのサービスコードに置き換えられます。拠点ごとのユニークな識別子として使用できます。

マクロコマンド「foreach」内で繰り返し処理対象のサービスコードに使用する場合は次のように記述します。

${【ループ変数名】.system.sa_code}
システム自動コンフィグ
${system.mpc_base_config}

管理上必要とされるコンフィグが自動的に挿入されます。

テンプレートを保存したとき、テンプレートに記述されていない場合は自動的に追加されます。

コメント記法などにより無力化すると運用上問題が発生する可能性があります。

「#」文字
${system.sharp}

「#」文字が出力されます。# は「コメント」マクロコマンドとして扱われるため、テンプレートコンフィグの文字列内に # を記述する場合にはマクロ変数で記述する必要があります。

コメント

テンプレートコンフィグ中に任意のコメントを記述できます。

「##」から行末までの文字列はコメントとして扱い、コンフィグの反映時に無視されます。

特定の行のコンフィグを一時的に無効にする場合にも利用できます。

## this line is comment
this is config ## this is comment

コメントは半角の英数字及び記号を使用できます。

複数行にわたるコメントは、「#*」と「*#」の間に記述します。

#* this line is comment
   and this line is comment too *#
特殊文字のエスケープ処理

テンプレートコンフィグ内では、定義済のテンプレート変数名やマクロコマンド名と一致する文字列をそのまま出力するには、文字列の先頭に「\」を付記します。

但し、コメント開始文字の「#」はエスケープ処理を適用できません。 テンプレートコンフィグ中に「##」や「#*」を含む文字列をそのまま出力するには、システム変数「${system.sharp}」を使用してください。

this is config and parameter is \${var}
this is config and parameter is \#if