我正在尝试将Linux shell的输出插入变量,但由于某种原因,变量始终为空。
这是Ansible代码:
- name: Check PHP version
shell: php -v 2> /dev/null | awk '{print $2; exit}'
register: php_version
- debug: var=php_version
这是输出:
ok: [10.0.0.5] => {
"php_version": {
"changed": true,
"cmd": "php -v 2> /dev/null | awk '{print $2; exit}'",
"delta": "0:00:00.015180",
"end": "2017-01-08 18:41:00.323773",
"rc": 0,
"start": "2017-01-08 18:41:00.308593",
"stderr": "",
"stdout": "",
"stdout_lines": [],
"warnings": []
}
}
当我直接在服务器上运行命令时,我得到一个有效的结果:
php -v 2> /dev/null | awk '{print $2; exit}'
7.0.14
可能是什么问题?
答案 0 :(得分:3)
至于可能的原因,为什么你可以从CLI运行命令,而不是Ansible,当你通过一个shell运行shell时,php
可执行文件的路径很可能没有在PATH
变量中定义非交互式SSH会话 * (如Ansible所做的那样)。
在php
模块参数中使用完整路径而不仅仅是shell
。
可能是什么问题?
当您在shell调用中使用管道时,返回代码将是最后一个命令(awk
)的返回代码,虽然第一个命令失败,但您不会收到通知。
Awk没有得到任何输入处理并且它正常退出,并且因为您将stderr重定向到/dev/null
,所以您不会看到php
命令中的任何错误。
例如,如果显式运行不存在的命令:
- name: Check PHP version
shell: qwerty -v 2> /dev/null | awk '{print $2; exit}'
register: php_version
- debug: var=php_version
你也会得到:
"rc": 0,
"start": "2017-01-09 06:35:10.588258",
"stderr": "",
"stdout": "",
"stdout_lines": [],
"warnings": []
* 请参阅Unix.SE上的Difference between Login Shell and Non-Login Shell?问题。