ansible shell escape单引号和双引号

时间:2016-07-25 14:59:51

标签: shell module escaping ansible quotes

我正在尝试执行此命令:

ps -eo pid,args --cols=10000 | awk '/\/opt\/logstash\/logstash-1.5.3\// && $1 != PROCINFO["pid"] { print $1 }'

whith ansible -m shell模块(工作示例):

ansible -m shell -a '"'ps -eo pid,args --cols=10000 | awk '/\/opt\/logstash\/logstash-1.5.3\// && $1 != PROCINFO[\'pid\'] { print $1 }' '"' all

其中一种方法是将其放入文件中,但仍然可以作为命令运行 - 任何想法都很好吗?

3 个答案:

答案 0 :(得分:4)

Bash转义规则将执行:

ansible localhost -m shell -a "ps -eo pid,args --cols=10000 | awk '/\\/opt\\/logstash\\/logstash-1.5.3\\// && \$1 != PROCINFO[\"pid\"] { print \$1 }'"

答案 1 :(得分:1)

有效的替代版本:

ansible -m command -a "ps a |grep -E '/opt/logstash/logstash-1.5.3/vendor/jruby' " all --sudo

检查进程是否正在运行:

ansible -m shell -a "ps aux |grep -E '/opt/logstash/logstash-1.5.3/vendor/jruby'|grep -v -e grep |wc" all 

答案 2 :(得分:0)

一种简单的方法(即无需大量重写命令或引入大量转义符)是使用临时变量。

您的原始命令:

ps -eo pid,args --cols=10000 \
  | awk '/\/opt\/logstash\/logstash-1.5.3\// && $1 != PROCINFO["pid"] { print $1 }'

相应的电话通话

x='/\/opt\/logstash\/logstash-1.5.3\// && $1 != PROCINFO["pid"] { print $1 }'; \
  ansible all -m shell -a "ps -eo pid,args --cols=10000 | awk '$x'"