为什么Ansible无法执行这个简单的shell脚本?

时间:2015-02-12 12:15:27

标签: string bash shell solaris ansible

我遇到了Ansible(1.8.2)的一个非常奇怪的问题,归结为在shell脚本中执行这个简单的命令:

#!/bin/sh

# transform a String into lowercase chars:
echo "TeSt" | tr [:upper:] [:lower:]

当我登录远程Solaris机器时,无论我在哪个shell中(例如/bin/sh/bin/bash),此脚本似乎都能正常工作:

# ./test.sh 
test

当我使用远程ssh命令执行此脚本时,它可以工作:

# ssh root@<remote-host> '/tmp/test.sh'
test

但是,当我使用Ansible commandshell模块执行相同的脚本时,我会得到一个&#34; Bad String&#34;错误,无论我指定什么shell:

- shell: executable=/bin/sh /tmp/test.sh      [FATAL stderr: Bad string]
- shell: executable=/bin/bash /tmp/test.sh    [FATAL stderr: Bad string]
- command: /tmp/test.sh                       [FATAL stderr: Bad string]

我花了很长时间才发现它适用于raw模块:

- raw: executable=/bin/sh /tmp/test.sh        [OK]

是否有人知道为什么shellcommand模块会产生此错误?

有关脚本失败的远程主机的更多信息:

  • SunOS 5.10 Generic_150401-18 i86pc i386 i86pc
  • 所有shell(/bin/sh/bin/bash/bin/ksh)都是GNU bash,版本4.1.2(1)-release(x86_64-redhat-linux-gnu)
  • Python 2.6.6

区域设置不同!当我登录或执行远程ssh命令时,语言环境如下所示:

LANG=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

然而,有了Ansible,我明白了:

LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=

2 个答案:

答案 0 :(得分:3)

好。因此,尽管Jens说,在大多数环境中,该脚本并没有“破坏”。我在bash包中的bash --posixdashbusybox shkshpdksh下进行了测试,并且在所有情况下都是的工作原理。

所以我去搜索特定的错误消息(Bad string),然后找到了:

http://sourceforge.net/p/wrapper/bugs/229/

这似乎准确描述了您的问题。这不是剧本中的错误;这是Solaris上tr中的一个错误。

答案 1 :(得分:0)

无论你遇到什么其他问题,你的tr命令肯定存在问题,

tr [:upper:] [:lower:]

因为[]是由shell扩展的字符范围 。如果您有一个名为:uperlo的文件,或w这会在tr将其视为参数之前展开:

$ touch u
$ echo [:upper:]
u

修复:使用引号,如

tr '[:upper:]' '[:lower:]'