Ansible:shell脚本输出始终为空

时间:2017-01-08 16:52:46

标签: shell ansible

我正在尝试将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

可能是什么问题?

1 个答案:

答案 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?问题。