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

如何在Ansible Playbook的with_lines循环中输出并校验stdout_lines

Ansible Playbook 实现命令执行、结果打印与内容校验

以下是满足需求的完整Playbook示例,包含读取命令文件执行、打印所有输出结果,以及校验特定字符串的逻辑:

---
- name: 执行命令并验证结果
  hosts: all
  tasks:
    # 1. 读取命令文件并逐条执行,注册所有结果
    - name: 执行命令文件中的命令
      command: "{{ item }}"
      with_lines: cat commands.txt
      register: command_outputs

    # 2. 打印每条命令执行的stdout_lines内容
    - name: 输出所有命令的执行结果
      debug:
        msg: "命令 '{{ item.cmd }}' 的输出: {{ item.stdout_lines }}"
      loop: "{{ command_outputs.results }}"

    # 3. 校验结果中是否存在特定字符串,存在则终止执行
    - name: 检查结果中是否包含目标字符串
      fail:
        msg: "命令 '{{ item.cmd }}' 的结果中发现目标字符串 '{{ target_str }}'"
      when: target_str in item.stdout
      loop: "{{ command_outputs.results }}"
      vars:
        target_str: "ERROR" # 替换为你要校验的特定字符串

关键逻辑说明

  • with_lines: cat commands.txt:读取commands.txt文件的每一行,作为待执行的命令;
  • register: command_outputs:将所有命令的执行结果注册到变量中,command_outputs.results是一个列表,每个元素对应一条命令的执行详情(包含cmd、stdout、stdout_lines等字段);
  • 打印结果时,通过loop遍历结果列表,输出每条命令的stdout_lines;
  • 校验逻辑通过when条件判断目标字符串是否存在于命令的stdout中,若存在则触发fail模块终止Playbook执行。

扩展:收集所有匹配结果(不直接终止)

如果需要收集所有包含特定字符串的命令结果而非直接终止,可以调整为以下逻辑:

- name: 收集包含目标字符串的结果
      set_fact:
        matched_commands: "{{ matched_commands | default([]) + [item.cmd] }}"
      when: target_str in item.stdout
      loop: "{{ command_outputs.results }}"
      vars:
        target_str: "ERROR"

    - name: 输出所有匹配的命令
      debug:
        msg: "以下命令结果包含 '{{ target_str }}': {{ matched_commands }}"
      when: matched_commands | length > 0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:25:31