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

Ansible shell模块执行AWS CloudWatch验证脚本出现语法报错如何解决

问题根因

报错/bin/sh: 1: Syntax error: "&" unexpected的直接原因是脚本中使用的|&是Bash专属语法,作用是同时将标准输出、标准错误都管道传递给下一个命令。而Ansible的shell模块默认调用/bin/sh执行脚本,大部分Linux发行版的/bin/sh是兼容POSIX标准的轻量shell(如dash),不支持Bash独有的|&语法,所以会抛出语法错误。

解决方案

方案1:显式指定使用Bash执行任务

给shell任务添加executable参数,强制调用Bash运行脚本,即可兼容|&语法,修改后的任务代码如下:

- name: validate AWS cloudwatch download
  shell: |
    cw_expected_key="9376 16F3 450B 7D80 6CBD  9725 D581 6730 3B78 9C72"
    cw_public_key=`gpg --import /tmp/cloud-watch-validation/amazon-cloudwatch-agent.gpg |& grep -Po "key\s*[A-Z0-9]+" | egrep -o "[A-Z0-9]+"`
    key=`gpg --fingerprint $cw_public_key |& grep -Po $cw_expected_key`
    if [ "$key" != "$cw_expected_key" ]; then
      exit 1
    fi
    validation=`gpg --verify /tmp/cloud-watch-validation/amazon-cloudwatch-agent.deb.sig  /tmp/cloud-watch/amazon-cloudwatch-agent.deb |& grep -Po "Good signature"`
    if [ "$validation" != "Good signature" ]; then
      exit 1
    fi
  args:
    executable: /bin/bash

方案2:替换为POSIX兼容语法

将所有|&替换为POSIX标准支持的2>&1 |,该写法可以同时重定向标准错误、标准输出到管道,兼容所有POSIX规范的shell,无需指定执行器,修改后的任务代码如下:

- name: validate AWS cloudwatch download
  shell: |
    cw_expected_key="9376 16F3 450B 7D80 6CBD  9725 D581 6730 3B78 9C72"
    cw_public_key=`gpg --import /tmp/cloud-watch-validation/amazon-cloudwatch-agent.gpg 2>&1 | grep -Po "key\s*[A-Z0-9]+" | egrep -o "[A-Z0-9]+"`
    key=`gpg --fingerprint $cw_public_key 2>&1 | grep -Po $cw_expected_key`
    if [ "$key" != "$cw_expected_key" ]; then
      exit 1
    fi
    validation=`gpg --verify /tmp/cloud-watch-validation/amazon-cloudwatch-agent.deb.sig  /tmp/cloud-watch/amazon-cloudwatch-agent.deb 2>&1 | grep -Po "Good signature"`
    if [ "$validation" != "Good signature" ]; then
      exit 1
    fi

内容的提问来源于stack exchange,提问作者James Green

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:57:01