跳转到内容

模板与命令流

rauto 的核心优势之一,是把“可复用执行逻辑”拆成了两类:

  • 命令模板:适合生成最终命令文本
  • 命令流模板:适合处理交互式 prompt/response 流程

命令模板基于 Minijinja,兼容 Jinja2 语法,适合把重复命令结构参数化。

conf t
{% for vlan in vlans %}
vlan {{ vlan.id }}
name {{ vlan.name }}
{% endfor %}
end

对应变量:

{
"vlans": [
{ "id": 10, "name": "市场部" },
{ "id": 20, "name": "工程部" }
]
}

执行方式:

Terminal window
rauto template configure_vlan.j2 \
--vars ./vars.json \
--connection core-sw-01

命令模板不是简单放在本地目录中,而是保存在 rauto 的 SQLite 运行时数据中,由 CLI 和 Web 共用。

常用管理命令:

Terminal window
rauto templates list
rauto templates show configure_vlan.j2
rauto templates delete configure_vlan.j2

当你面对的不是“一次性下发一串命令”,而是这种流程时:

  • 设备反复提问
  • 每个 prompt 需要不同响应
  • 可能还要引用运行时变量或其他连接信息

这时更适合 rauto flow

  • Cisco 风格的 copy scp: / copy tftp:
  • 安装向导式 CLI
  • 多轮确认操作
  • 设备侧文件分发
  • 依赖运行时输入的交互式命令序列

rauto 仓库里自带了一个可编辑示例:

name = "cisco_like_copy"
description = "Generic interactive SCP/TFTP copy flow for Cisco-like CLIs."
stop_on_error = true
default_mode = "Enable"
[[vars]]
name = "command"
required = true
[[steps]]
timeout_secs = 300
command = "{{command}}"
[[steps.prompts]]
patterns = ["(?i)^Address or name of remote host.*\\?\\s*$"]
response = "{{server_addr}}"

这个模型的关键点是:

  • 每个 step 对应一段命令执行
  • prompts 负责匹配设备输出并自动响应
  • vars 可以声明变量结构,用于 CLI 校验和 Web 表单生成

命令流支持多种变量注入方式:

  • --vars <file>:从文件加载 JSON 变量
  • --vars-json <json>:直接传内联 JSON
  • 在模板中使用顶层变量,例如 {{server_addr}}
  • 也可以通过 vars 对象引用,例如 {{vars.server_addr}}
  • 连接变量支持引用其他已保存连接参数,例如 {{peer.host}}

当前 README 还补充了这些运行时规则:

  • 运行时变量会同时注入到顶层字段与嵌套的 vars 对象中
  • 支持 connection_name.param_name 这种跨连接引用
  • 直接写 param_name 时,会先查请求 vars,再回退到当前目标连接参数
  • 命令流模板可以声明 current_connection_alias = "<alias>",从而直接用 {{alias.host}}{{alias.username}} 等引用当前执行目标
  • 某个运行时变量本身也可以指向另一条已保存连接名,例如 peer=edge94 后直接使用 {{peer.host}}

命令流模板可以声明 vars schema,这样 CLI 和 Web 都能更可靠地校验和渲染运行时输入。

README 当前明确提到支持这些字段:

  • name
  • type
  • required
  • default
  • options
  • label
  • description

这对企业级场景很重要,因为它让命令流从“字符串模板”升级成“可治理的操作接口”。

当前 README 还说明了内置命令流的暴露方式:

  • 内置模板通过 /api/flow-templates/builtins 暴露
  • CLI 可通过 --template builtin:<name> 执行
  • Web 侧下拉选择器也使用 builtin:<name>

这意味着一个团队可以同时混合使用:

  • 产品内置命令流
  • 保存在 SQLite 中的团队级命令流
  • 临时本地 TOML 文件做实验

当前命令流模型支持这些输出分支动作:

  • next
  • jump
  • stop_success
  • stop_failure

这也是为什么 rauto flow 不只是简单的 expect 宏,而是能够表达带分支的运维流程。

当前 README 明确指出:

  • 所有执行默认都会录制会话
  • --record-level key-events-only 保留最小审计级信息
  • --record-level full 会保留更丰富的 prompt 与状态切换细节
  • --record-file 可以把同一份 JSONL 录制导出到文件
Terminal window
rauto flow-template list
rauto flow-template show cisco_like_copy
rauto flow-template create cisco_like_copy --file ./my-flow.toml
rauto flow-template update cisco_like_copy --file ./my-flow.toml
rauto flow-template delete cisco_like_copy

适合设备侧交互,比如:

  • 设备执行 copy scp:
  • 设备要求你输入 server、username、password
  • 过程里存在多个 prompt

适合 SSH 主机直接走 sftp 子系统上传本地文件:

Terminal window
rauto upload \
--local-path ./configs/daemon.conf \
--remote-path /tmp/daemon.conf \
--connection linux-jump-01

很多网络设备不支持 SFTP,所以不能把它当成 flow 的替代。

  • 纯命令拼装,优先用命令模板
  • 存在设备交互,优先用命令流模板
  • 需要跨多人复用时,把模板保存进 rauto 存储而不是散落在脚本目录
  • 对复杂流程优先先做 --dry-run 或在测试环境执行
  • 对涉及文件传输、安装向导的场景,优先给模板声明清晰的 vars

如果你接下来要做可回滚变更,请继续看 事务与多设备编排