運算式語法會在 Cloud Assembly 範本中公開運算式的所有可用功能。

備註: Cloud Assembly 運算式與規則運算式不同。

僅在Cloud Assembly 運算式顯示的範例中部分表示以下語法。

文字

支援下列文字:

  • 布林值 (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_xself.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)}'
    
  • 如需更多範例,請參閱Cloud Assembly 中的機器和磁碟叢集

算術運算子

語法:

運算子為 + / *%

範例:

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

字串串連

語法:

${'ABC' + 'DEF'} 評估為 ABCDEF

運算子 [ ] 和 .

在統一處理 [ ] 和 . 運算子方面,運算式遵循 ECMAScript。

因此,expr.identifier 相當於 expr["identifier"]。識別碼用來建構其值為 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(number) 絕對數值
avg(array) 傳回數字陣列中所有值的平均值
base64_decode(string) 傳回解碼的 base64 值
base64_encode(string) 傳回 base64 編碼值
ceil(number) 傳回大於或等於引數且等於數學整數的最小 (最接近無限大的負數) 值
contains(array, value) 檢查陣列是否包含值
contains(string, value) 檢查字串是否包含值
digest(value, type) 傳回使用支援類型 (md5、sha1、sha256、sha384、sha512) 的值的摘要
ends_with(subject, suffix) 檢查主體字串是否以後置詞字串結尾
filter_by(array, filter)

僅傳回通過篩選作業的陣列項目

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(number) 傳回小於或等於引數且等於數學整數的最大 (最接近正無限大) 值
format(format, values...) 傳回使用 Java 類 Formatter 格式的格式化字串和值。
from_json(string) 剖析 json 字串
join(array, delim) 加入含分隔符號的字串陣列,並傳回字串
json_path(value, path) 使用 XPath for JSON 根據值評估路徑。
keys(map) 傳回對應的索引鍵
length(array) 傳回陣列長度
length(string) 傳回字串長度
map_by(array, operation)

傳回每個陣列項目以及對其套用的作業

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(array, keyname)

傳回與另一個陣列的值配對的指定索引鍵名稱的 key:value 配對陣列

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

傳回將名為 source 的索引鍵欄位與磁碟識別碼字串配對的 key:value 配對陣列

請注意

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

傳回相同的結果

matches(string, regex) 檢查字串是否符合 regex 運算式
max(array) 傳回數字陣列中的最大值
merge(map, map) 傳回合併的對應
min(array) 傳回數字陣列中的最小值
not_null(array) 返回不為 Null 的第一個項目
now() 以 ISO-8601 格式傳回目前時間
range(start, stop) 以 1 為增量傳回一系列數字,以起始數字開頭且在停止數字之前結束
replace(string, target, replacement) 將包含目標字串的字串取代為目標字串
reverse(array) 反向陣列項目
slice(array, begin, end) 傳回從開始索引到結束索引的陣列配量
split(string, delim) 分割含分隔符號的字串,並傳回字串陣列
starts_with(subject, prefix) 檢查主體字串是否以前置詞字串開頭
substring(string, begin, end) 傳回從開始索引到結束索引的字串的子字串
sum(array) 傳回數字陣列中所有值的總和
to_json(value) 將值序列化為 json 字串
to_lower(str) 將字串轉換為小寫
to_number(string) 以數字剖析字串
to_string(value) 傳回值的字串表示法
to_upper(str) 將字串轉換為大寫
trim(string) 移除前置空格和尾端空格
url_encode(string) 使用 url 編碼規格對字串進行編碼
uuid() 傳回隨機產生的 UUID
values(map) 傳回對應的值

疑難排解

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"}'