Ansible shell模块调用awk条件语句处理表格数据未达预期
问题根因
所有行被错误标记为PASS的核心原因是字段匹配时存在不可见干扰字符:
- 以
|分割表格列后,最后一列的Active/Blocked/Inactive前后默认带有数量不等的空格,直接做字符串全等匹配时,带前置/后置空格的状态值和纯字符串Inactive不相等,永远无法命中FAIL分支 - 多数网络设备/专用系统的CLI命令默认输出带ANSI颜色控制码,直接重定向保存到文件时转义字符会和状态值混在一起,进一步导致字符串匹配失效
- 若awk逻辑未做非数据行过滤、未做无效值拦截,所有未命中匹配规则的行都会被错误打上PASS标记
常见awk错误写法示例
不符合预期的写法通常存在以下共性问题:
# 错误点1:未去除字段前后空白 错误点2:未过滤表头、分隔线等非数据行 awk -F'|' '{if($NF=="Inactive"){print $0,"FAIL"}else{print $0,"PASS"}}' sctp.txt
这种写法下只要最后一列带空格/转义符,$NF=="Inactive"的判断永远为假,所有行都会走到else分支输出PASS。
可行修正方案
方案1:修正awk逻辑(兼容原有落地文件的流程)
第一步执行命令存文件时先清除颜色转义符,避免干扰:
dsc-show-sctp-assoc | sed 's/\x1B\[[0-9;]*[JKmsu]//g' > sctp.txt
第二步使用修正后的awk语句处理:
awk -F'|' ' # 仅处理Blade ID为数字的有效数据行,跳过表头、分隔线 $2 ~ /^[[:space:]]*[0-9]+[[:space:]]*$/ { # 去除第一列、最后一列前后的所有空白字符 gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2) gsub(/^[[:space:]]+|[[:space:]]+$/, "", $NF) if ($NF == "Inactive") { print "Blade ID: " $2 ", Path State: " $NF ", Result: FAIL" } else if ($NF == "Active" || $NF == "Blocked") { print "Blade ID: " $2 ", Path State: " $NF ", Result: PASS" } }' sctp.txt
方案2:Ansible原生实现(无需依赖shell/awk、无临时文件)
直接在playbook中完成命令执行、解析全流程,稳定性更高:
- name: SCTP关联状态检查 hosts: 目标主机组 gather_facts: no tasks: - name: 执行查询命令,强制关闭颜色输出 ansible.builtin.command: dsc-show-sctp-assoc register: sctp_raw_output environment: TERM: dumb # 设置哑终端类型,从根源避免CLI输出颜色转义码 - name: 解析输出判定状态 ansible.builtin.set_fact: sctp_check_result: >- {% set res = [] %} {% for line in sctp_raw_output.stdout_lines %} {% set cols = line.split('|') %} {% if cols | length > 2 %} {% set blade_id = cols[1].strip() %} {% set path_state = cols[-1].strip() %} {% if blade_id is match('^\d+$') and path_state in ['Active', 'Blocked', 'Inactive'] %} {% if path_state == 'Inactive' %} {{ res.append({'blade_id': blade_id, 'path_state': path_state, 'result': 'FAIL'}) }} {% else %} {{ res.append({'blade_id': blade_id, 'path_state': path_state, 'result': 'PASS'}) }} {% endif %} {% endif %} {% endif %} {% endfor %} {{ res }} - name: 打印最终检查结果 ansible.builtin.debug: var: sctp_check_result
内容的提问来源于stack exchange,提问作者Aditya Siddarth
相关产品推荐
相关产品推荐

