结论
nginx命令默认将命令输出写到了标准错误中。通过ansible执行nginx命令及获取其执行结果可通过获取stderr内容或将命令标准错误输出到标准输出中或stdout的内容,即:nginx -t 2>&1 && nginx -V 2>&1。
现象说明
通过playbook进行nginx批量升级,准备将升级后的nginx版本同时打印出来,可总是输出为空。
验证过程
为方便验证shell脚本和playbook中均配置nginx -t及-V命令输出,并使用ps命令进行对比实验
如下shell脚本nginx_update.sh中,使用echo打印nginx -t 和nginx -V的结果

如下playbook yaml中nginx_update.yaml中,执行nginx_update.sh脚本及执行nginx -t && nginx -V 命令,并注册输出结果获取
执行:
ansible-playbook -i `pwd`/host.ini nginx_update.yaml
脚本及playbook task结果输出:
很明显仅输出了ps执行结果,nginx_update.sh脚本及执行nginx -t && nginx -V 命令均输出为空。
Ansible TASK中也同样输出为空
同时手动在服务器上执行nginx -t && nginx -V 结果可正常输出
然后将task中配置的输出全部打印 如下:
执行后结果如下,标红的字体正是nginx -t && nginx -V 的输出结果,被输出到了stderr_lines中,stdout_lines的输出为空,还可以看到执行后rc值为0,failed=false 这表明 该命令playbook中是执行成功的。
接着 我们使用2>&1 将命令的标准错误也打印到标准输出再次验证
对 task中命令做如下修改:
输出结果中,的确将输出内容打印到了stdou中来,并且也是执行成功