表达式语法公开了 Automation Assembler 模板中表达式的所有可用功能。

注: Automation Assembler 表达式与正则表达式 (regex) 不同。

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.identifier 等效于 expr["identifier"]。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 且与磁盘 ID 字符串配对的键字段的 key:value 对数组

请注意

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

返回相同的结果

matches(string, 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) 返回映射的值

嵌套三元运算符

使用具有参数化字符串的嵌套三元运算符时,请考虑以下事项。
  • 表达式必须用美元符号和大括号括起来,如 ${...}
  • 避免在表达式中间使用美元符号 ($),因为这可能会阻止评估整个外部 ${...} 表达式。
  • 遵循三元运算符结构(如 A ? B :C),而不管嵌套级别如何。使用圆括号 () 可支持此嵌套。例如,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"}'