表达式语法公开了 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_name
和 resource.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)}
函数 | 说明 |
---|---|
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) | 仅返回通过筛选操作的数组条目
返回
返回 |
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_to_object(array, keyname) | 返回与另一数组中的值配对的指定键名的 key:value 对数组
返回包含名为 source 且与磁盘 ID 字符串配对的键字段的 key:value 对数组 请注意
返回相同的结果 |
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"}
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"}'