Ansible Shell模块执行含awk的kubectl命令报错求助
解决Ansible中kubectl命令带awk提取列报错的问题
核心原因
Ansible的shell/command模块会通过Jinja2模板引擎解析命令中的$符号,导致$9被当成Ansible变量而非awk的列引用,从而触发报错。
可行解决方案
方案1:外层用单引号包裹整个命令
将完整命令用单引号括起来,阻止Ansible解析内部的$,同时awk的print语句用双引号(让目标节点的shell正确传递$9给awk):
- name: 提取版本信息第9列 shell: 'kubectl exec -n testns dashmpp-head-0 -- list versions | grep 你的过滤关键词 | awk "{print $9}"'
方案2:使用raw模块绕过Ansible的命令解析
raw模块直接将命令传递给目标节点的shell执行,不经过Jinja2处理,适合复杂命令:
- name: 用raw执行命令 raw: kubectl exec -n testns dashmpp-head-0 -- list versions | grep 你的过滤关键词 | awk '{print $9}'
方案3:通过脚本文件执行
把命令写入独立的shell脚本,彻底避免转义问题:
- 创建本地脚本
get_version.sh:
#!/bin/bash kubectl exec -n testns dashmpp-head-0 -- list versions | grep 你的过滤关键词 | awk '{print $9}'
- 在playbook中拷贝并执行:
- name: 拷贝脚本到目标节点 copy: src: ./get_version.sh dest: /tmp/get_version.sh mode: '0755' - name: 执行脚本提取版本 shell: /tmp/get_version.sh
方案4:双重转义$符号
如果坚持在shell模块中直接写命令,需要对$做双重转义(Ansible解析一次,目标shell解析一次):
- name: 双重转义执行命令 shell: kubectl exec -n testns dashmpp-head-0 -- list versions | grep 你的过滤关键词 | awk '{print \\\$9}'
内容的提问来源于stack exchange,提问作者codec
相关产品推荐
相关产品推荐

