在外壳程序完成之前,ansible sh模块不会报告输出

时间:2019-07-19 21:28:08

标签: ansible jenkins-pipeline

如何查看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管道线程监视并尾随该文件(两者都显得很笨拙,因为这模糊了将构建服务器耦合到部署脚本的关注点太紧密了)

2 个答案:

答案 0 :(得分:0)

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是另一条可以遵循的路线。

答案 1 :(得分:0)

您可以使用-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