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

Ansible Shell模块读取列表异常:单元素正常,多元素失败

Ansible Shell模块处理多元素列表失败的解决方案

问题原因

你当前的Playbook中,"{{ UserRecords }}"会被Ansible转换为空格分隔的字符串,导致Shell的for i in "{{ UserRecords }}"循环仅执行一次,且i的值是整个列表的拼接内容,而非单个元素。另外,Shell脚本里的echo $i||awk误用了逻辑或||,正确应该使用管道符|,否则awk无法接收echo的输出。

修复方案

方案1:使用Ansible Loop遍历列表元素

通过loop遍历UserRecords列表,将每个元素单独传入Shell处理:

tasks:
- name: Create a List variable and print it
  set_fact:
    UserRecords:
      [
        "[3/2/23 9:09:04:013 GMT+5:30] 0000 ApplicationMg A WSVR220I: Application stopped: ActivePackProdTest_war1",
        "[3/2/23 8:09:04:013 GMT+5:30] 0000 ApplicationMg A WSVR220I: Application stopped: ActivePackProdTest_war"
      ]

- name: split list with loop
  shell: echo "{{ item }}" | awk '{print $2, $8" "$9" "$10}' | sed 's/[^[:alnum:]:" "]//g'
  loop: "{{ UserRecords }}"
  register: processed_result

- name: output processed records
  debug:
    msg: "{{ item.stdout }}"
  loop: "{{ processed_result.results }}"

方案2:使用Ansible过滤器替代Shell(推荐)

直接用Ansible的正则替换过滤器处理,无需调用外部Shell命令,更高效且符合Ansible最佳实践:

tasks:
- name: Create a List variable and print it
  set_fact:
    UserRecords:
      [
        "[3/2/23 9:09:04:013 GMT+5:30] 0000 ApplicationMg A WSVR220I: Application stopped: ActivePackProdTest_war1",
        "[3/2/23 8:09:04:013 GMT+5:30] 0000 ApplicationMg A WSVR220I: Application stopped: ActivePackProdTest_war"
      ]

- name: process records with ansible filters
  set_fact:
    processed_records: "{{ UserRecords | map('regex_replace', '^\\[.*? (\\d+:\\d+:\\d+:\\d+).*? (Application stopped: .+)$', '\\1 \\2') | list }}"

- name: print results
  debug:
    msg: "{{ item }}"
  loop: "{{ processed_records }}"

两种方案都能得到你期望的输出:

9:09:04:013 Application stopped: ActivePackProdTest_war1
8:09:04:013 Application stopped: ActivePackProdTest_war

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:35:23