2017-08-17 461 views
1

我有一个简单的命令,用grep和perl regex从ps -ef | grep java输出中提取catalina.home输出,如下所示。Ansible:使用grep和perl正则表达式的Shell命令

ps -ef |grep java |grep -Po "Dcatalina.home=[^\s]*\s" 

而当我执行这个命令时,它只会从输出中提取cataline.home部分,如下所示。

# ps -ef |grep java |grep -Po "Dcatalina.home=[^\s]*\s" 
Dcatalina.home=/usr/share/apache-tomcat-7.0.32 

但是当我通过Ansible发出同样的命令,它发送给服务器 ps -ef |grep java |grep -Po /\"Dcatalina.home=[^/\\s]*\/\s\"并没有给出输出。从Ansible

FAILED! => {"changed": true, "cmd": "cd $(ps -ef |grep java |grep -Po \"Dcatalina.home=[^\\s]*\\s\" | awk -F'=' '{print $2}') ; bash bin/version.sh | grep 'Server version:'", "delta": "0:00:00.080606", "end": "2017-08-17 03:57:02.816848", "failed": true, "rc": 1, "start": "2017-08-17 03:57:02.736242", "stderr": "/bin/sh: line 0: cd: [^\\s]*\\s\": No such file or directory\nbash: bin/version.sh: No such file or directory", "stderr_lines": ["/bin/sh: line 0: cd: [^\\s]*\\s\": No such file or directory", "bash: bin/version.sh: No such file or directory"], "stdout": "", "stdout_lines": []} 

错误有什么办法,我可以告诉Ansible执行完全按照我给的命令?

在此先感谢。

+0

你使用哪个模块?据我记得,shell模块http://docs.ansible.com/ansible/latest/shell_module.html更好地执行命令。 – ThoFin

+0

@ThoFin我只使用shell模块。我们可以通过下面的例子来说明如何使用shell:cd $(ps -ef | grep java | grep -Po“Dcatalina.home = [^ \ s] * \ s”| awk -F'=''{print $ 2}'); bash bin/version.sh | grep'服务器版本:' register:cnp_tomcat_output ' –

+0

什么是奇怪的正斜杠? – Nullman

回答

0

这里是它是如何工作的对我道:
va:~/ansible-playbooks$ ansible server-1.infra.local -i server/hosts -m shell -a 'ps -ef |grep java | grep -Po "Dcatalina.home[^\s]*\s"' -K --become-method=sudo -b -k SSH password: SUDO password[defaults to SSH password]: server-1.infra.local | SUCCESS | rc=0 >> Dcatalina.home=/usr/local/tomcat