我的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
)。
答案 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
。