组件参数及节点执行流程

剧本组件动作的参数支持普通值、变量以及表达式、函数等,参数处理包含提取、去重、循环执行等环节。

参数分类

  • 从功能上区分,参数分为剧本输入参数(开始节点输入参数)、剧本输出参数(开始节点输出参数)、组件动作输入参数、组件动作输出参数。

  • 从类型上区分,参数又分为系统参数和组件参数。

    说明

    在组件动作执行过程中,除组件参数外,系统默认的参数,在任意节点都能获取。

组件(节点)输入和输出参数

组件的输入参数可以是自定义的,也可以是上游节点的输出。若选择上游节点输出,上游节点必须是编排路径上可达的前置节点。

重要

多路场景下要保证节点名称全局唯一。

以下图节点B为例:可以拿到上游节点A的输出和剧本的输入参数,不能拿到节点D的输出,因为他们不在一个分路上,也拿不到节点C的输出,因为节点C不是节点B的前置节点。

image

系统参数说明

剧本中的系统参数(开始节点默认参数)

系统默认的参数,在任意节点都能获取,都可通过下表中的取值表达式获取。“event”可视为开始节点的名称,可通过${event.参数名}格式获取剧本系统参数。

参数

数据类型

取值表达式

描述

_tenant_id

String

${event._tenant_id}

调用剧本的阿里云账号ID。

_domain_id

String

${event._domain_id}

登录用户的角色状态。

  • 0:表示单账号登录。

  • 1:表示全局账号登录。

_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

当前小时的时间戳转为毫秒,会从当前小时的00秒计算。

<%=currentHourToMs()%>

1749088800000

currentDayToMs

当前天的时间戳转为毫秒,会从当前天的000秒计算。

<%=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个下划线连接。

  • 参数1:截取的字符串。

  • 参数2:起始的下标。

  • 参数3:终止的下标。

<%=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

对字符串替换。

  • 参数1:要修改的字符串。

  • 参数2:要替换的字符串。

  • 参数3:新的字符串。

<%=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格式。

  • 除了手写语法规则外,系统还支持在输入框下拉列表进行选择对应参数的方式生成对应的语法,这个在调试完成后会推荐。如下图:image

获取变量参数示例

以某个节点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下所有的personage数据。

输出值:{12,13}。

${node1.datalist.[0].person.age}

获取node1节点datalist下第一条的personage数据。

输出值:12。

参数的数据类型转换

在剧本执行过程中,大部分场景下,数据都是以字符串的类型进行处理的,当剧本执行过程中的数据类型不符合要求时,可以进行数据类型的转换,将源类型转为目标类型。

方式为${数据类型:数据},支持的数据类型转换如下表:

数据类型

说明

源类型支持范围

Boolean

转为Boolean类型,取值:true、false。

  1. 数字类型,如Long、Int、Double。值为1,转为true,否则为false。

  2. String类型:“true”、“1”、“Y”、“T”这四个字符串会转为true,“false”、“0”,“N”、“F”这四个字符串会转为false,其他字符串不支持,会报错。

Long

转为Long类型。

  1. 数字类型,如Long、Int、Double。

  2. String类型,字符串只能由数字和逗号组成,如1,000,000

Int

转为Int类型。

Double

转为Double类型。

String

转为String类型。

所有类型都支持转换。

DateTime

转为日期类型。

  1. 数字类型,如Long、Int、Double。

  2. String类型,需为数字类型,如1696487400000;或者符合ISO8601日期格式,如2023-10-05 14:30:00

JSONObject

从某个JSONObject中提取keyvalue,组成新的JSONObject类型。用于把多列的数据以{}格式封装,输出格式为:{"fieldname":"fieldValue",...}。

只支持JSONObject类型。

JSONArray

从某个JSONObject中提取keyvalue,组成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_ipmsg字段产生一个单行单列的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_ipmsg字段产生一个单行单列的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"}]

参数处理和节点执行流程

image
  1. 节点参数提取:在所有需要上游节点执行完成后,根据当前节点的输入配置,提取当前节点的实际输入数据,提取的过程在下面有详细介绍。

  2. 节点执行:组成该节点的输入参数后,当所有的字段都一样时,自动去重后执行节点组件动作。

    说明

    当一个动作的接受参数是多组值时,为简化操作,动作会执行多次

    如:找到被入侵应用的所有服务器(多个),对这些服务器逐一执行“恶意文件清除”动作。用户只需在动作的参数中选择“服务器IP”(${node1.datalist.*.ip})即可,系统会自动把所有的IP执行“恶意文件清除”动作,不必写一个循环后逐一执行清除动作。

  3. 输出结果汇总去重:对节点多次执行之后的结果汇总,并自动去重。去重的逻辑是所有的字段相同为重复,例如:

    去重前

    去重后

    [
        {
            "a":"11",
            "b":"22"
        },
        {
            "a":"11",
            "b":"22"
        },
        {
            "a":"11",
            "b":"33"
        }
    ]
    [
        {
            "a":"11",
            "b":"22"
        },
        {
            "a":"11",
            "b":"33"
        }
    ]

参数提取过程

同一个数据源处理

复杂的任意深度的JSON格式可以看作一个树形结构,提取JSON中参数的原则是:同一深度的兄弟关系保持不变,同一祖辈节点做祖辈扩充,既不是兄弟也不是父辈的做笛卡尔乘积。

  1. 自动提取任意深度的数据。示例如下:image

  2. 同一深度的兄弟关系保持不变。示例如下:

    image

  3. 同一祖辈节点:祖辈扩充。示例如下:

    image

  4. 既不是兄弟,也不是父辈的,进行笛卡尔乘积。示例如下:image

多数据源的处理

对各个单数据源处理结果做笛卡尔乘积。

image