Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ansible中使用shell运行python脚本,但似乎无法使用print()输出标准输出_Python_Ansible - Fatal编程技术网

在ansible中使用shell运行python脚本,但似乎无法使用print()输出标准输出

在ansible中使用shell运行python脚本,但似乎无法使用print()输出标准输出,python,ansible,Python,Ansible,我的剧本中有一些类似上面的代码片段。在python脚本中,我使用了print语句。但当我运行并使用debug时,stdout是空的。对于调试,我尝试了以下两种方法- shell: sleep 5; nohup python /tmp/rsync.py {{check}} {{source}} {{destination}} {{dest_host}} & register: status failed_when: "'FAILED' in status.stdout" 为了

我的剧本中有一些类似上面的代码片段。在python脚本中,我使用了print语句。但当我运行并使用debug时,stdout是空的。对于调试,我尝试了以下两种方法-

  shell: sleep 5; nohup python /tmp/rsync.py {{check}} {{source}} {{destination}} {{dest_host}} &
  register: status
  failed_when: "'FAILED' in status.stdout"
为了打印到标准输出,我还使用了
sys.stdout.write
。即使这样似乎也不起作用。 实现了我需要的一切。只是这不起作用。

编辑:我必须在后台运行它。有什么新的方法来处理这个问题吗?

使用Ansible提供的异步支持

根据shell命令执行所需的时间调整async的值(如果是5秒,则使async略高于5秒)

根据要检查shell是否完成执行的频率调整轮询值

        - name: debug
          debug: msg={{ status.stdout }}

我的输出如下所示<代码>确定:[target1]=>{“status.stdout_line”:[]}是否设置了
导出PYTHONUNBUFFERED=1
环境变量?使用-vvvv重新运行代码,并检查shell模块是否输出。里面会有一些标准的台词。检查它是否为空?由于您在后台运行脚本,我可以想象Ansible在Python脚本本身实际打印某些内容时已经超过了
状态。stdout
部分,因此Ansible没有看到任何输出。您是否尝试过不在后台运行脚本?我没有设置任何环境变量。使用VVV打印空行。在后台运行是可行的。但我必须在BG模式下运行它。关于如何实现这一点,您有什么想法吗?与我使用
在后台模式下运行它相比,它是否会造成任何差异。因为在后台运行它是必要的。不过我会尝试一下。在这两种情况下,Ansible都使用subprocess.Popen()运行shell命令。Async只提供取消阻止任务并继续或等待作业完成等功能。
        - name: debug
          debug: msg={{ status.stdout }}
- name: Execute shell
  shell: sleep 5; nohup python /tmp/rsync.py {{check}} {{source}} {{destination}} {{dest_host}}
  async: 100
  poll: 1
  register: status
  failed_when: "'FAILED' in status.stdout"