【问题标题】:ansible sh module does not report output until shell completesansible sh 模块在 shell 完成之前不报告输出
【发布时间】:2019-07-19 21:28:08
【问题描述】:

如何查看 ansible 运行的 shell 脚本的实时输出?

我最近重构了一个等待脚本以使用多处理并为多个服务提供各种服务等待检查的实时状态。

作为一个独立的脚本,它的工作原理是为每个线程提供状态,因为它们并行等待各种服务稳定。

在 ansible 中,输出会暂停,直到 python 脚本完成(或终止),然后提供输出。虽然,好吧,我宁愿找到一种更快显示输出的方法。在通过 jenkins withEnv 运行 ansible-playbook 之前,我尝试设置 PYTHONUNBUFFERED 但这似乎也没有实现目标

- name: Wait up to 30m for service stability
  shell: "{{ venv_dir }}/bin/python3 -u wait_service_state.py"
  args:
    chdir: "{{ script_dir }}"

显示长时间运行脚本的输出的标准 ansible 模式是什么?

我的猜测是我可以遵循这些路线之一

  • 不使用 ansible
  • 在 docker 容器中执行并通过 ansible 报告输出,前提是这不会遇到相同类别的问题
  • 从脚本输出到文件,并让 ansible 线程或 Jenkins 管道线程监视和跟踪文件(两者看起来都很笨拙,因为这模糊了将我的构建服务器与部署脚本耦合的关注点分离有点过于紧密)李>

【问题讨论】:

    标签: ansible jenkins-pipeline


    【解决方案1】:

    你可以使用-https://docs.ansible.com/ansible/latest/user_guide/playbooks_async.html

    main.yml

    - name: Run items asynchronously in batch of two items
      vars:
        sleep_durations:
          - 1
          - 2
          - 3
          - 4
          - 5
        durations: "{{ item }}"
      include_tasks: execute_batch.yml
      loop: "{{ sleep_durations | batch(2) | list }}"
    

    execute_batch.yml

    - name: Async sleeping for batched_items
      command: sleep {{ async_item }}
      async: 45
      poll: 0
      loop: "{{ durations }}"
      loop_control:
        loop_var: "async_item"
      register: async_results
    
    - name: Check sync status
      async_status:
        jid: "{{ async_result_item.ansible_job_id }}"
      loop: "{{ async_results.results }}"
      loop_control:
        loop_var: "async_result_item"
      register: async_poll_results
      until: async_poll_results.finished
      retries: 30
    

    【讨论】:

    • 太好了。非常感谢。
    • 实际上,这似乎并没有达到我想要的效果。我想要输出上的 tail -f 的 ansible equiavlent。现在,我看到 async_results 有一个输出文件,但我无法访问它。 async_poll_results 有标准输出,但我不知道如何循环它。
    • 我重构了我的脚本,从在脚本中并行等待 12 个项目的简单单片执行到使用 with_items 和 async 进行 12 个脚本调用。它工作得很好。谢谢
    【解决方案2】:

    What's the standard ansible pattern for displaying output for a long running script?

    用于显示长时间运行脚本的输出的标准 ansible 模式是轮询 async 并循环直到 async_status 完成。直到循环的输出的定制是有限的。见Feature request: until for blocks #16621

    ansible-runner 是可能遵循的另一条路线。

    【讨论】:

    • 谢谢。如果我能让 async_results 任务在 async_results 输出文件上执行相当于 tail -f 的任务,我会很高兴。我想要的数据似乎存在于 async_poll_results 但我无法访问它
    猜你喜欢
    • 2010-10-09
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多