代码之家  ›  专栏  ›  技术社区  ›  Shobi

如何从ansible runner程序中读取事件

  •  0
  • Shobi  · 技术社区  · 6 年前

    我用 ansible runner 从django应用程序触发ansible playbook,运行良好。请参阅以下代码。

    import ansible_runner
    
    def runner(request):
        r = ansible_runner.run_async(private_data_dir='/Users/path/to/private_dir', 
                                     playbook='path/to/provision.yml')
    

    我要做的是在用户的项目上进行部署时,向用户提供实时更新(运行在该行动手册中的每个可负责任务的标准输出)。

    现在,我可以在控制台中立即看到stdout。但我不知道如何从ansible runner中交互式/即时地阅读stdout。

    我可以等待任务完成,最后阅读最后的stdout并将其显示给用户,我认为这并不是更好的用户体验。我想提供一个正在发生的用户播放的实时更新。类似于travis ci构建。到目前为止,我还不能从Ansible Runner的文档中找到任何东西。

    我试着检查 r.events 像下面

    r = ansible_runner.run_async(private_data_dir='/Users/path/to/private_dir', 
                                     playbook='path/to/provision.yml')
    for event in r[1].events:
       try:
         print(event['event_data']['task'])
       except KeyError:
         pass
    
     # where r[1] is the Runner object returned by ansible, 
     # r[0] is the thread which runs ansible
    

    所以基本上 r[1] 是一个生成器对象,但是当循环运行时,它只从起点打印几行,我假设这是因为任务尚未完成,所以生成器也尚未填充。

    你有什么建议或链接可以指引我正确的方向?请随时要求澄清。非常感谢您的帮助:)

    0 回复  |  直到 6 年前