在Ansible脚本中转义字符

时间:2017-01-10 21:52:56

标签: bash shell escaping ansible

我的Ansible脚本中有一个shell命令的问题。此shell命令在脚本上无法正常工作,而它直接在服务器上运行良好。

以下是有问题的代码:

- name: export keys 
  shell: "export NR_INSTALL_PATH=$(which php | sed 's/\/php$//g') ; export NR_INSTALL_KEY='somekey'; export NR_INSTALL_SILENT=1; newrelic-install install"

在我调查了这个问题后,我注意到有问题的部分是:

which php | sed 's/\/php$//g'

此代码假设获取PHP的可执行路径,并从路径中删除最后一个目录。而不是预期的结果,我只获得路径的第一个目录(/bin)。

  • 这个问题与转义字符有关吗?有人能告诉我如何解决它吗?
  • 我需要从原始命令中获取更多字符吗?
  • 有没有办法打印服务器实际收到的bash命令? (这就是我将能够知道从原始命令改变了什么的方法)。

1 个答案:

答案 0 :(得分:1)

此语法应该有效:

- name: export keys 
  shell: 'export NR_INSTALL_PATH=$(which php | sed "s/\/php$//g") ; export NR_INSTALL_KEY="somekey"; export NR_INSTALL_SILENT=1; newrelic-install install'

例如:

- set_fact:
    php_path: /usr/bin/php

- shell: 'export NR_INSTALL_PATH=$(echo {{ php_path }} | sed "s/\/php$//g") ; echo $NR_INSTALL_PATH'
  register: result

- debug: var=result.stdout

返回:

TASK [debug] *******************************************************************
ok: [localhost] => {
    "result.stdout": "/usr/bin"
}
  

有没有办法打印服务器实际收到的bash命令?

不是一种Ansible方式(因为它不知道shell如何解释命令),但你可以在启用-x选项的情况下运行shell:

- command: /bin/bash -x -c 'export NR_INSTALL_PATH=$(echo {{ php_path }} | sed "s/\/php$//g") ; echo $NR_INSTALL_PATH'
  register: result

- debug: var=result.err

您将在日志中获得完整的跟踪。

注意:你问过" bash",但它不一定是bash - 默认情况下Ansible可能会运行/bin/sh