Ansible 当超过重试次数时,从async_状态循环获取有意义的错误消息

Ansible 当超过重试次数时,从async_状态循环获取有意义的错误消息,ansible,Ansible,使用Ansible 1.7,我在一个循环中执行多个异步任务,并在30秒超时的情况下使用async_status检查它们的状态: - name: Some long-running task shell: "./some_task {{ item }}" loop: "{{ list_of_params }}" async: 30 poll: 0 register: my_task - name: Check async tasks for completion asyn

使用Ansible 1.7,我在一个循环中执行多个异步任务,并在30秒超时的情况下使用async_status检查它们的状态:

- name: Some long-running task
  shell: "./some_task {{ item }}"
  loop: "{{ list_of_params }}"
  async: 30
  poll: 0
  register: my_task

- name: Check async tasks for completion
  async_status:
    jid: "{{ item.ansible_job_id }}"
  register: my_task_results
  until: my_task_results.finished
  retries: 30
  delay: 1
  loop: "{{ my_task.results }}"
这很好,如果任何shell命令返回非零返回代码,或者如果“my_task_results.finished”在30秒内不为true,则async_status任务将失败

不幸的是,当“直到”条件未及时满足时,错误消息没有帮助。返回的值包括:

  • 更改:false
  • 消息:“所有项目已完成”
  • 结果:[上面shell任务的结果数组]
  • 更改:false
  • 失败:真
  • 完成日期:0
特别是,“所有项目已完成”的信息具有误导性


在这种情况下,是否有办法生成有意义的错误消息?我可以添加一个“failed_when”选项,再添加一个“Faile”任务来检查条件(finished==0),以显示自定义错误消息(类似于“某个长时间运行的任务没有及时完成”),但这似乎不太雅观。

我认为您的解决方案在这种情况下会很好

请查看官方的Ansible文档:

在这里您可以找到您的方法:

- name: Fail if return code is not 0
  fail:
    msg: "The command ({{ item.cmd }}) did not have a 0 return code"
  when: item.rc != 0
  loop: "{{ echo.results }}"
有时,当我需要更美观的输出时,我使用的是模板/文件,然后在任务中使用注册变量,您可以自定义输出

For example: 
- name:
  template:
... 

- shell: cat <template_location>.yml
  register: stack_test

- debug:
    msg: "{{ stack_test.stdout }}"
例如:
-姓名:
模板:
... 
-贝壳:猫。yml
寄存器:堆栈测试
-调试:
msg:“{stack_test.stdout}”

不幸的是,此方法不适用于异步任务。异步任务返回的唯一变量是“ansible\u job\u id”、“changed”、“failed”、“finished”、“item”、“results\u file”和“started”。只有在任务完成后,其他变量才可见。我当然可以报告任务没有及时完成,但我无法确定有关任务的任何其他信息,如命令、stdout、stderr等。如果有某种方法至少可以从异步任务中获取cmd…@FSchwartz,那么async_status似乎可以轮询并填充包含stdout_行的结构。但是,我不知道如何让异步_状态任务在其自己注册的变量上循环并输出该变量