剧本组件动作的参数支持普通值、变量以及表达式、函数等,参数处理包含提取、去重、循环执行等环节。
参数分类
从功能上区分,参数分为剧本输入参数(开始节点输入参数)、剧本输出参数(开始节点输出参数)、组件动作输入参数、组件动作输出参数。
从类型上区分,参数又分为系统参数和组件参数。
说明在组件动作执行过程中,除组件参数外,系统默认的参数,在任意节点都能获取。
组件(节点)输入和输出参数
组件的输入参数可以是自定义的,也可以是上游节点的输出。若选择上游节点输出,上游节点必须是编排路径上可达的前置节点。
多路场景下要保证节点名称全局唯一。
以下图节点B为例:可以拿到上游节点A的输出和剧本的输入参数,不能拿到节点D的输出,因为他们不在一个分路上,也拿不到节点C的输出,因为节点C不是节点B的前置节点。
系统参数说明
剧本中的系统参数(开始节点默认参数)
系统默认的参数,在任意节点都能获取,都可通过下表中的取值表达式获取。“event”可视为开始节点的名称,可通过${event.参数名}格式获取剧本系统参数。
参数 | 数据类型 | 取值表达式 | 描述 |
_tenant_id | String | ${event._tenant_id} | 调用剧本的阿里云账号ID。 |
_domain_id | String | ${event._domain_id} | 登录用户的角色状态。
|
_trigger_user | String | ${event._trigger_user} | 触发剧本的阿里云账号ID,如果是RAM用户(子账号),则为RAM用户(子账号)ID。 |
_region_id | String | ${event._region_id} | 地域ID。 |
_req_uuid | String | ${event._req_uuid} | 当前剧本执行任务的唯一标识。 |
parentTaskUuid | String | ${event.parentTaskUuid} | 父剧本的_req_uuid,子剧本调用时会存在此参数。 |
parentTaskName | String | ${event.parentTaskName} | 父剧本的剧本uuid,子剧本调用时会存在此参数。 |
组件动作输出参数中的系统参数
任意组件的输出结果都包含如下参数,自定义参数会封装在datalist中,可通过${节点名称.datalist.*}获取所有输出参数值。
参数 | 数据类型 | 含义 |
datalist | JSONArray | 动作执行后的输出参数。 重要 组件自定义输出的参数也存储在datalist中。 |
total_data_successful | Int | 动作执行过程中处理成功的数据量。 |
total_data | Int | 动作执行过程中处理的数据量。 |
total_data_with_dup | Int | 动作执行过程中处理成功的去重后的数据量。 |
total_exe_successful | Int | 当前动作运行成功的次数。 |
total_exe | Int | 当前动作运行的次数。 |
status | Boolean | 动作执行成功状态,取值:true、false。 |
messageForUser | String | 执行失败情况下,用户关注的报错信息。 |
message | String | 执行失败情况下,系统报错信息。 |
failed_exe_detail | String | 执行失败情况下,报错的详情信息。 |
参数格式
参数支持常量、变量、表达式这三种基本格式,同时支持三种基本格式的排列组合,以及更复杂的嵌套。
基本格式 | 说明 | 示例 |
常量 | 一个固定的字符串 | Ali。 |
变量 | 从剧本输入参数和前置节点的输出参数中提取值 | ${event.aliuid},从剧本输入参数获取aliuid。 |
表达式 | 使用内嵌表达式和函数产生值,格式为<%=表达式|函数%>,支持的函数列表请参见表达式中内置函数列表。 | 表达式:只支持Java语法,如<%=2*60*60%>。 函数:<%=currentTime()%>。 |
组合格式 | 常量_变量_表达式 | 组合示例: Ali_${event.aliuid}_<%=currentTime()%>_<%=2*60*60%>,动作执行时会将其中的变量和表达式解析后替换为对应的值:Ali_aliuid_当前时间_7200。 嵌套示例:(表达式可以嵌入变量)<%=formatTimeStamp(secondstamp_add(${DateTime:event.datalist.*.gmt_create},-600L),"yyyy-MM-dd'T'HH:mm:ss.SSSXXX")%>,从${DateTime:event.datalist.*.gmt_create}获取gmt_create值,并减去600,最后格式化为日期。 |
表达式中内置函数列表
函数名 | 描述 | 示例 | 示例输出 |
currentTime | 返回当前的时间戳。 | <%=currentTime()%> | 2025-06-05 10:30:00 |
secondstamp_add | 在当前时间timestamp上增加多少秒secNum。 | <%=secondstamp_add(currentTime(),300L)%> | 2025-06-05 10:30:09 |
formatTimeStamp | 把输入时间戳根据format格式化。 | <%=formatTimeStamp(currentTime(),"yyyyMMdd")%> | 20250605 |
timestampToseconds | 在当前时间timestamp上增加多少秒secNum,然后转换为秒输出。 | <%=timestampToseconds(currentTime(),300L)%> | 1749099848 |
splitStr | 把输入字符串inputStr根据splitStr切分为一个列表。 | <%=splitStr("test,value",",")%> | [test,value] |
parseTimeMs | 将时间格式的字符串转为毫秒。 | <%=parseTimeMs("2025-06-05 10:30:32","yyyy-MM-ddHH:mm:ss")%> | 1749090632000 |
currentTimeToMs | 当前时间戳转为毫秒。 | <%=currentTimeToMs()%> | 1749091369688 |
currentHourToMs | 当前小时的时间戳转为毫秒,会从当前小时的0分0秒计算。 | <%=currentHourToMs()%> | 1749088800000 |
currentDayToMs | 当前天的时间戳转为毫秒,会从当前天的0时0分0秒计算。 | <%=currentDayToMs()%> | 1749052800000 |
parseTimeMsWDefault | 将时间戳解析为毫秒,支持默认值。如果参数1为空,使用参数2为默认值。 | <%=parseTimeMsWDefault("2025-06-05 10:30:32",1749091369688L)%> | 1749090632000 |
splitStrToJsonArray | 把输入字符串inputStr根据splitStr切分为JSONArray。 | <%=splitStrToJsonArray("test,value",",")%> | ["test","value"] |
concatListStr | 使用拼接符连接字符串,需配合splitStr函数使用。 | <%=concatListStr("|",splitStr("test,value",","))%> | test|value |
substring | 截取字符串。 参数1:截取的字符串。 参数2:起始的下标。 参数3:终止的下标。 | <%=substring("012345",0,3)%> | 012 |
remainStrStartEnd | 保留起始标之外的字符串,即保留inputStr开头的beginSize个字符串,以及结尾的endSize个字符串,中间以5个下划线连接。
| <%=remainStrStartEnd("012345",2,2)%> | 01_____45 |
toLong | 把一个对象转换为long类型。 参数1:输入值。 参数2:转换失败的默认值。 | <%=toLong("1234",12L)%> | 1234.0 |
toLowerCase | 把字符串中的英文字母转为小写。 | <%=toLowerCase("TEST")%> | test |
toUpperCase | 把字符串中的英文字母转为大写。 | <%=toUpperCase("test")%> | TEST |
toJSONObject | 把JSON字符串转成JSON对象。 | <%=toJSONObject("{\"name\":\"test\",\"age\":12}")%> | {"name":"test","age":12} |
base64encode | 对字符串,进行base64编码。 | <%=base64encode("abc")%> | YWJj |
base64decode | 对字符串,进行base64解码。 | <%=base64decode("YWJj")%> | abc |
replace | 对字符串替换。
| <%=replace("abc123","abc","aaa")%> | aaa123 |
isNull | 判断一个对象是否为空。 | <%=isNull("")%> | true |
变量参数
在剧本组件的执行过程中,如果想拿到流程中前置节点的参数,可以在组件中使用变量的参数格式来表示。对于剧本输入参数而言,使用event作为节点名称,可以将它理解为开始节点的输出参数,所以在剧本编排的过程中,不要把组件的名称设置为event。
目前只支持根据节点的输出参数来获取数据。
剧本的输入参数=开始节点的输出参数。
当前节点输入参数=上一个节点的输出参数。
语法格式
获取节点输出参数的语法为${节点名称.参数路径},路径采用jsonpath的方式,支持任意多层的JSON格式。
对于JSONObject格式,通过“.”直接获取下级节点的数据。对于JSONArray格式,*表示获取所有数据,同时支持基于数字下标获取单条数据。以下为获取动作执行后的输出参数为例:
类型
语法
说明
获取JSON中的参数
${节点名称.datalist.*.参数1.参数2}
说明开始节点(剧本)输出参数语法为:${event.参数1.参数2}。
获取参数1下参数2的数据。
说明参数1的值为JSONObject格式。
获取JSON数组中所有的数据
${节点名称.datalist.*.参数1.*.参数2}
说明开始节点(剧本)输出参数语法为:${event.参数1.*.参数2}。
获取参数1下所有的JSONObject中参数2的数据。
说明参数1的值必须为JSONArray格式。
获取JSON数组中单条的数据
${节点名称.datalist.*.参数1.[0].参数2}
说明开始节点(剧本)输出参数语法为:${event.参数1.[0].参数2}。
获取参数1下的第一个JSONObject中参数2的数据
说明参数1的值必须为JSONArray格式。
除了手写语法规则外,系统还支持在输入框下拉列表进行选择对应参数的方式生成对应的语法,这个在调试完成后会推荐。如下图:
获取变量参数示例
以某个节点node1为示例,该节点的输出参数如下:
{
"datalist": [
{
"person": {
"weight": "120",
"age": "12"
}
},
{
"person": {
"weight": "121",
"age": "13"
}
}
],
"total_data_successful": 2,
"total_data": 2,
"total_exe_successful": 2,
"total_exe": 2,
"total_data_with_dup": 2,
"status": true
}
语法 | 说明 |
${event._req_uuid} | 获取开始节点(即输入参数)中的系统参数_req_uuid的值。 |
${event.parentTaskUuid} | 子剧本中获取父剧本的_req_uuid(如果存在父剧本调用)。 |
${node1.total_data_successful} | 获取node1节点的执行成功数据量。 输出值:2。 |
${node1.datalist.*.person.age} | 获取node1节点datalist下所有的person的age数据。 输出值:{12,13}。 |
${node1.datalist.[0].person.age} | 获取node1节点datalist下第一条的person的age数据。 输出值:12。 |
参数的数据类型转换
在剧本执行过程中,大部分场景下,数据都是以字符串的类型进行处理的,当剧本执行过程中的数据类型不符合要求时,可以进行数据类型的转换,将源类型转为目标类型。
方式为${数据类型:数据},支持的数据类型转换如下表:
数据类型 | 说明 | 源类型支持范围 |
Boolean | 转为Boolean类型,取值:true、false。 |
|
Long | 转为Long类型。 |
|
Int | 转为Int类型。 | |
Double | 转为Double类型。 | |
String | 转为String类型。 | 所有类型都支持转换。 |
DateTime | 转为日期类型。 |
|
JSONObject | 从某个JSONObject中提取key和value,组成新的JSONObject类型。用于把多列的数据以{}格式封装,输出格式为:{"fieldname":"fieldValue",...}。 | 只支持JSONObject类型。 |
JSONArray | 从某个JSONObject中提取key和value,组成JSONArray类型。把多行多列的数据以[{}]格式封装,数据输出为单行单列的数据。 | 只支持JSONObject类型 |
JSONObjectStr | 将JSONObject转为字符串。 | JSONObject类型。 |
JSONArrayStr | 将JSONArray转为字符串。 | JSONArray类型。 |
示例:
JSONObject示例:剧本输入参数为:{"src_ip":"127.0.0.1","dst_ip":"127.0.0.2","msg":"hello"}。
${JSONObject:event}:把整个event都做一整个JSON字符串输出。
${JSONObject:event.src_ip}:把event中的src_ip产生一个单行单列的JSON。结果为:{"src_ip":"127.0.0.1"}。
${JSONObject:event.src_ip|msg}:把event中的src_ip和msg字段产生一个单行单列的JSON字符串。结果为:{"src_ip":"127.0.0.1","msg":"hello"}。
${JSONArray:event}:把整个event都做一整个JSONArray输出。
${JSONArray:event.src_ip}: 把event中的src_ip产生一个单行单列的JSONArray。结果为:[{"src_ip":"127.22.22.1"}]。
${JSONArray:event.src_ip|msg}: 把event中的src_ip和msg字段产生一个单行单列的JSONArray。结果为:[{"src_ip":"127.0.0.1","msg":"hello"}]。
JSONArray示例:剧本输入参数为:{"datalist":[{"src_ip":"127.0.0.1","dst_ip":"127.1.0.1","msg":"hello"},{"src_ip":"127.1.0.1","dst_ip":"127.1.0.1","msg":"hello"}]}。
${JSONObject:event.datalist.*.src_ip}:展开为多行,每行的结果为:{"src_ip":"127.x.0.1"}。
${JSONObject:event.datalist.*.src_ip|msg}: 展开为多行,每行都是一个JSON字符串:{"src_ip":"127.x.0.1","msg":"hello"}。
${JSONArray:event.datalist.*.src_ip}:展开为单行。结果为:[{"src_ip":"127.0.0.1"},{"src_ip":"127.1.0.1"}]。
${JSONArray:event.datalist.*.src_ip|msg}:展开为单行。结果为:[{"src_ip":"127.0.0.1","msg":"hello"},{"src_ip":"127.1.0.1","msg":"hello"}]
参数处理和节点执行流程
节点参数提取:在所有需要上游节点执行完成后,根据当前节点的输入配置,提取当前节点的实际输入数据,提取的过程在下面有详细介绍。
节点执行:组成该节点的输入参数后,当所有的字段都一样时,自动去重后执行节点组件动作。
说明当一个动作的接受参数是多组值时,为简化操作,动作会执行多次。
如:找到被入侵应用的所有服务器(多个),对这些服务器逐一执行“恶意文件清除”动作。用户只需在动作的参数中选择“服务器IP”(${node1.datalist.*.ip})即可,系统会自动把所有的IP执行“恶意文件清除”动作,不必写一个循环后逐一执行清除动作。
输出结果汇总去重:对节点多次执行之后的结果汇总,并自动去重。去重的逻辑是所有的字段相同为重复,例如:
去重前
去重后
[ { "a":"11", "b":"22" }, { "a":"11", "b":"22" }, { "a":"11", "b":"33" } ]
[ { "a":"11", "b":"22" }, { "a":"11", "b":"33" } ]
参数提取过程
同一个数据源处理
复杂的任意深度的JSON格式可以看作一个树形结构,提取JSON中参数的原则是:同一深度的兄弟关系保持不变,同一祖辈节点做祖辈扩充,既不是兄弟也不是父辈的做笛卡尔乘积。
自动提取任意深度的数据。示例如下:
同一深度的兄弟关系保持不变。示例如下:
同一祖辈节点:祖辈扩充。示例如下:
既不是兄弟,也不是父辈的,进行笛卡尔乘积。示例如下:
多数据源的处理
对各个单数据源处理结果做笛卡尔乘积。