You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible如何从注册的字符串变量中提取指定字段并拆分存储为数组

Ansible 字符串提取与拆分实现方案

不需要安装额外第三方模块,直接使用Ansible自带的Jinja2过滤器即可完成需求,具体实现步骤如下:

核心实现逻辑

总共分为两步:匹配提取target list对应的值、按分隔符拆分存入数组,全程通过内置过滤器完成。

完整示例代码

---
- name: 提取备用服务器列表示例
  hosts: localhost
  gather_facts: false
  tasks:
    # 模拟你原来的查询任务,实际使用时替换成你自己的查询命令
    - name: 执行系统查询
      shell: |
        echo "database role   =   PRIMARY
        host name       =   random_name
        service name    =   service1
        target list     =   server1:10201|server4:40704|server8:52125
        timeout value   =   120"
      register: query_result

    # 核心提取逻辑
    - name: 提取target list并拆分为服务器数组
      set_fact:
        target_servers: >-
          {{ query_result.stdout
          | regex_search('target list\s*=\s*(.*)', '\1')
          | first
          | trim
          | split('|') }}

    # 调试输出结果验证
    - name: 打印拆分后的服务器列表
      debug:
        var: target_servers

代码说明

  • regex_search('target list\s*=\s*(.*)', '\1'):通过正则匹配到target list所在行,捕获等号后到换行前的所有内容,返回结果为列表
  • first:提取正则捕获结果的第一个元素,即target list对应的原始值
  • trim:去除值前后的多余空格
  • split('|'):按|分隔符将字符串拆分为数组,自动适配任意数量的服务器地址

可选实现方案

如果你的查询结果已经按行存储在stdout_lines变量中,也可以用行过滤的方式实现,逻辑如下:

target_servers: >-
  {{ query_result.stdout_lines
  | select('search', '^target list')
  | first
  | split('=')
  | last
  | trim
  | split('|') }}

运行后得到的target_servers变量就是格式为["server1:10201", "server4:40704", "server8:52125"]的数组,可直接用于后续的分支判断或循环操作。

内容的提问来源于stack exchange,提问作者NewbChewbCS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:36:03