Ansible:shell脚本输出总是为空

4

我想将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
我无法重现这个问题。我复制了你的代码,在macOS上使用ansible 2.0.1.0和在ubuntu上使用ansible 2.3.0运行,两者都正确地输出了stdout。 - Rob H
我也无法复现。当您在服务器上直接运行命令时,是否使用与Ansible相同的用户和shell /bin/sh - Zlemini
Ansible在指定服务器上以不同的用户运行。 - Omri
尝试在没有 2> /dev/null | awk '{print $2; exit}' 的情况下运行它,希望您能看到错误。 - Zlemini
1个回答

3
关于为什么您可以从CLI运行命令,但不能从Ansible运行的可能原因,最有可能的是当您通过非交互式SSH会话(如Ansible)运行shell时,php可执行文件的路径未在PATH变量中定义。

请在shell模块参数中使用完整路径而不是只使用php


由于您在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上的登录Shell和非登录Shell之间的区别?问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接