Ansible Shell转义单引号和双引号

6

我正在尝试执行这个命令:

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

使用ansible的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个回答

8
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
我的替代版本可行:
ansible -m command -a "ps a |grep -E '/opt/logstash/logstash-1.5.3/vendor/jruby' " all --sudo

检查进程是否正在运行:

Check if the process are running:

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

我必须承认对grep | grep -v grep有一些厌恶。grep -Ec '/[o]pt..' 可以省去grep -v和wc -c的需要。 - Graham Nicholls

0
一个简单的方法(即不必大量重写命令或引入许多转义字符)是使用临时变量。
您的原始命令:
ps -eo pid,args --cols=10000 \
  | awk '/\/opt\/logstash\/logstash-1.5.3\// && $1 != PROCINFO["pid"] { print $1 }'

相应的ansible调用:

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'"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接