首页 > 解决方案 > 在ansible中无法识别Shell“|&”语法

问题描述

我在 ansible playbook 中运行一个 shell 命令,我想在其中存储输出的最后一行但是出现以下错误:

致命:[网络服务器]:失败!=> {“已更改”:true,“cmd”:“ ./hash.sh -p admin123 |& tail -1 ”,“delta”:“0:00:00.002563”,“end”:“2019-06- 06 16:25:56.597951", "failed": true, "msg": "非零返回码", "rc": 2, "start": "2019-06-06 16:25:56.595388", " stderr": "/bin/sh: 1: 语法错误: \"&\" unexpected", "stderr_lines": ["/bin/sh: 1: 语法错误: \"&\" unexpected"], "stdout" :“”,“stdout_lines”:[]}

主要.yaml

- name: Get hash value of admin password
  shell: "./hash.sh -p {{admin_password}} |& tail -1"
  args:
    chdir: /usr/share/tools
  register: admin_password_hash

./hash.sh -p admin123 |& tail -1当我直接在远程机器上运行该命令 () 时,它给了我正确的输出。

标签: shellansible

解决方案


假设您的意思|&是通过管道重定向 stderr,则符合 POSIX 的替代方案cmd1 |& cmd2(因此,与 一起工作的方式/bin/sh)是cmd1 2>&1 | cmd2

- name: "Get hash value of admin password"
  shell: "./hash.sh -p {{admin_password | quote}} 2>&1 | tail -1"
  args:
    chdir: /usr/share/tools
  register: admin_password_hash

| quote很重要:如果没有它,您可能会出现重大安全问题,因为选择$(rm -rf /*)密码的人可能会导致您的整个系统被擦除。(我敢说这是Bobby Tables使用的密码!)


推荐阅读