如何在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
相关产品推荐
相关产品推荐

