式の構文には、Automation Assembler テンプレートで使用可能な式のすべての機能が示されています。

注: Automation Assembler 式は、正規表現とは異なります。

Automation Assembler 式の例には、次の構文の一部のみが記載されています。

リテラル

次のリテラルがサポートされています。

  • ブール値(True または False)
  • 整数
  • 浮動小数点
  • 文字列

    二重引用符、一重引用符、およびバックスラッシュは、バックスラッシュでエスケープします。

    "\" とエスケープします

    '\' とエスケープします

    \\\ とエスケープします

    引用符は、次の例に示すように、同じタイプの引用符で囲まれた文字列内でのみエスケープする必要があります。

    "I am a \"double quoted\" string inside \"double quotes\"."

  • Null

環境変数

環境名:

  • orgId
  • projectId
  • projectName
  • deploymentId
  • deploymentName
  • blueprintId
  • blueprintVersion
  • blueprintName
  • requestedBy(ユーザー)
  • requestedAt(時間)

構文:

env.ENV_NAME

例:

${env.blueprintId}

リソース変数

リソース変数を使用すると、他のリソースからリソース プロパティにバインドできます。

構文:

resource.RESOURCE_NAME.PROPERTY_NAME

リソース名にダッシュやドットを含めることはできません。アンダースコアを含めることはできます。

例:

  • ${resource.db.id}
  • ${resource.db.networks[0].address}
  • ${resource.app.id}(カウントが指定されていない場合、クラスタ化されていないリソースの文字列を返します。クラスタ化されたリソースのアレイを返します。)
  • ${resource.app[0].id}(クラスタ化されたリソースの最初のエントリを返します)

リソースのセルフ変数

リソースのセルフ変数は、割り当てフェーズをサポートするリソースでのみ許可されます。リソースのセルフ変数は、割り当てフェーズが完了した後にのみ使用できます(または値が設定されます)。

構文:

self.property_name

例:

${self.address}(割り当てフェーズで割り当てられたアドレスを返します。)

resource_x という名前のリソースの場合、self.property_nameresource.resource_x.property_name は同じであり、両方とも自己参照とみなされます。

条件

構文:

  • 等価演算子は == および != です。
  • 関係演算子は、< > <= および >= です。
  • 論理演算子は、&& || および ! です。
  • 条件は、次のパターンを使用します。

    condition-expression ? true-expression :false-expression

例:

${input.count < 5 && input.size == 'small'}

${input.count < 2 ? "small":"large"}

クラスタ数のインデックス

構文:

count.index

例:

  • クラスタ化されたリソースのノード タイプを返します。

    ${count.index == 0 ? "primary":"secondary"}

  • 割り当て中に各ディスクのサイズを設定します。
    inputs:
      disks:
        type: array
        minItems: 0
        maxItems: 12
        items:
          type: object
          properties:
            size:
              type: integer
              title: Size (GB)
              minSize: 1
              maxSize: 2048
    resources:
      Cloud_vSphere_Disk_1:
        type: Cloud.vSphere.Disk
        allocatePerInstance: true
        properties:
          capacityGb: '${input.disks[count.index].size}'
          count: '${length(input.disks)}'
    
  • その他の例については、Automation Assembler でのマシンおよびディスクのクラスタを参照してください。

算術演算子

構文:

演算子は、+ / * および % です。

例:

${(input.count + 5) * 2}

文字列の連結

構文:

${'ABC' + 'DEF'}ABCDEF と評価されます。

演算子 [ ] および .

式は、[ ] および .演算子の処理を統一して、ECMAScript に従います:

このため、expr.identifierexpr["identifier"] に相当します。この識別子は、値が識別子であるリテラルを作成するために使用され、その値とともに [ ] 演算子が使用されます。

例:

${resource.app.networks[0].address}

また、プロパティにスペースが含まれている場合は、ドット表記を使用するのではなく、次のように角括弧と二重引用符で囲みます。

誤:

input.operating system

正:

input["operating system"]

マップの構築

構文:

${{'key1':'value1', 'key2':input.key2}}

アレイの構築

構文:

${['key1','key2']}

例:

${[1,2,3]}

関数

構文:

${function(arguments...)}

例:

${to_lower(resource.app.name)}

表 1. 関数
関数 説明
abs(数値) 絶対値の値
avg(アレイ) 数値のアレイからすべての値の平均を返します
base64_decode(文字列) base64 でデコードした値を返します
base64_encode(文字列) base64 でエンコードした値を返します
ceil(数値) 引数以上で、かつ正確な整数と等しい最小値(負の無限大に最も近い値)を返します
contains(アレイ, 値) アレイに値が含まれているかどうかを確認します
contains(文字列, 値) 文字列に値が含まれているかどうかを確認します
digest(値, タイプ) サポートされているタイプ(md5、sha1、sha256、sha384、sha512)を使用して値のダイジェストを返します。
ends_with(サブジェクト, サフィックス) サブジェクトの文字列がサフィックスの文字列で終わるかどうかを確認します
filter_by(配列, フィルタ)

フィルタ操作を渡す配列エントリのみを返します

filter_by([1,2,3,4], x => x >= 2 && x <= 3)

は、[2, 3] を返します

filter_by({'key1':1, 'key2':2}, (k,v) => v != 1)

は、[{"key2": 2}] を返します

floor(数値) 引数以下で、かつ正確な整数と等しい最大値(正の無限大に最も近い値)を返します
format(フォーマット, 値...) Java のクラスのフォーマッタのフォーマットと値を使用して、フォーマット化された文字列を返します。
from_json(文字列) JSON 文字列を解析します
join(アレイ, 区切り文字) 文字列のアレイを区切り文字で結合し、文字列を返します
json_path(値, パス) JSON に対する XPathを使用して、パスを値に対して評価します。
keys(マップ) マップのキーを返します
length(アレイ) アレイの長さを返します
length(文字列) 文字列の長さを返します
map_by(配列, 演算)

演算が適用された各配列エントリを返します

map_by([1,2], x => x * 10)

は、[10, 20] を返します

map_by([1,2], x => to_string(x))

は、["1", "2"] を返します

map_by({'key1':1, 'key2':2}, (k,v) => {k:v*10})

は、[{"key1":10},{"key2":20}] を返します

map_to_object(配列, キー名)

指定されたキー名を別の配列の値と組み合わせた key:value ペアの配列を返します

map_to_object(resource.Disk[*].id, "source")

は、source というキー フィールドとディスク ID 文字列を組み合わせた key:value ペアの配列を返します

注記:

map_by(resource.Disk[*].id, id => {'source':id})

も同じ結果を返します

matches(文字列, 正規表現) 文字列が正規表現と一致するかどうかを確認します
max(アレイ) 数値のアレイから最大値を返します
merge(マップ, マップ) マージされたマップを返します
min(アレイ) 数値のアレイから最小値を返します
not_null(アレイ) null でない最初のエントリを返します
now() ISO-8601 フォーマットの現在時刻を返します
range(開始, 停止) 開始番号から停止番号の直前まで増分 1 で連続する一連の数字を返します
replace(文字列, ターゲット, 置換) ターゲットの文字列を含む文字列をターゲットの文字列に置換します
reverse(アレイ) アレイの逆順のエントリを返します
slice(アレイ, 開始, 終了) 開始インデックスから終了インデックスまでのアレイを切り出して返します
split(文字列, 区切り文字) 区切り文字を使用して文字列を分割し、文字列のアレイを返します
starts_with(サブジェクト, プリフィックス) サブジェクトの文字列がプリフィックスの文字列で始まるかどうかを確認します
substring(文字列, 開始, 終了) 開始インデックスから終了インデックスまでの文字列の部分文字列を返します
sum(アレイ) 数値のアレイからすべての値の合計を返します
to_json(値) JSON 文字列として値をシリアル化します
to_lower(文字列) 文字列を小文字に変換します
to_number(文字列) 文字列を数値として解析します
to_string(値) 値の文字列表現を返します
to_upper(文字列) 文字列を大文字に変換します
trim(文字列) 先頭と末尾のスペースを削除します
url_encode(文字列) URL エンコード仕様を使用して文字列をエンコードします
uuid() ランダムに生成された UUID を返します
values(マップ) マップの値を返します

ネストされた 3 項演算子

パラメータ化された文字列を含む、ネストされた 3 項演算子を使用する場合は、次の点を考慮します。
  • 式は、${...} のようにドル記号と中括弧で囲む必要があります。
  • 式の途中にはドル記号 ($) を配置しないでください。外側の ${...} 式全体の評価ができなくなる可能性があります。
  • ネストのレベルに関わらず、A ? B :C のような 3 項演算子構造に従います。このネストをサポートするには、丸括弧 () を使用します。たとえば、A ? (B1 ? B2 :(B3 ? B4 :B5)) :C です。
パラメータ化された文字列を含まない例:
${input.backup == "Yes" ? (input.region == "Region1" ? "Hello1" :"No-Backup") :"Test"}
パラメータ化された文字列を含む例:
${input.backup == "Yes" ? (input.region == "Region1" ? (env.projectName + "-NOAPP-01-14-WDC") :(input.region == "Region2" ? (env.projectName + "-NOAPP-01-14-CDC") :(input.region == "Sitel" ? (env.projectName + "-NOAPP-01-14-Sitel") :"No-Backup"))) :"Test"}
yaml 内のリソースの例:
Cloud_Machine_1:
    type: Cloud.Machine
    properties:
      image: imageName
      count: ${input.machineCount}
      flavor: small
      snapshotLimit: 1
      tags:
        - key: BGNAME
          value: ${env.projectName}
        - key: Veeam
          value: ${input.backup == "Yes" ? (input.region == "Region1" ? (env.projectName + "-NOAPP-01-14-WDC") :(input.region == "Region2" ? (env.projectName + "-NOAPP-01-14-CDC") :(input.region == "Sitel" ? (env.projectName + "-NOAPP-01-14-Sitel") :"No-Backup"))) :"Test"}

トラブルシューティング

YAML 言語では、キー/値ペアのキーと値の間に区切り文字としてコロンとスペース (": ") を使用します。式の構文は YAML に依存するため、コロンの後にスペースを置くと、式が失敗することがあります。

たとえば、次の式では、"win" :"lin" の間にスペースがあるためエラーが発生します。

${contains(input.image,"Windows") == true ? "win" : "lin"}

作業中の式ではスペースが省略されます。

${contains(input.image,"Windows") == true ? "win" :"lin"}

式が引き続き失敗する場合は、次のように式全体を一重引用符で囲みます。

ezOS: '${contains(input.image,"Windows") == true ? "win" :"lin"}'