我有兴趣了解Ansible是否可以异步运行一个包含的剧本?
基本上我要做的就是执行一项任务“开火,忘记,稍后检查”。当我稍后检查它时,我也想发送一个松散的通知结果。
但是我注意到包含松弛通知的剧本需要比预期更长的时间来完成,因此它支撑了剧本的其余部分。
我想要的是同步包含的松弛通知的playbook,以便继续当前的剧本。
例如,我有一个playbook.yml文件,如下所示:
- hosts: localhost
tasks:
- name: Fire and forget task
shell: some_task.sh
chdir=/tmp/
register: fire_and_forget_task
async: 3600
poll: 0
- name: Check on fire and forget task
async_status: jid={{ fire_and_forget_task.ansible_job_id }}
register: task_status
until: task_status.finished
retries: 100
ignore_errors: yes
- name: Send slack success msg
include: slack.yml msg="Fire and forget task SUCCESS"
when: task_status.stdout is defined and
'SUCCESS' in fire_and_forget_task.stdout
async: 3600
poll: 0
- name: Send slack failed msg
include: slack.yml msg="Fire and forget task FAILED"
when: task_status.stdout is defined and
'FAILED' in fire_and_forget_task.stdout
async: 3600
poll: 0
我的slack.yml文件看起来像:
- name: Send notification message via Slack
local_action:
module: slack
token: <REDACTED>
attachments:
- text: "{{ msg }}"
color: "#83F52C"
title: "Ansible Status {{ lookup('pipe','date') }}"
使用上面的剧本,“发送松弛成功消息”任务需要花费很长时间来执行这样的简单任务。它似乎不是异步运行,即使我明确说明它应该。
达到预期结果的最佳方法是什么?谢谢。
include
不能使用async
关键字。
如果你的slack.yml就这么简单,只需用一次调用替换你的包含东西:
- name: Send notification message via Slack
local_action:
module: slack
token: <REDACTED>
attachments:
- text: "Task result {{ (task_status.stdout is defined and 'SUCCESS' in task_status.stdout) | ternary('SUCCESS','FAILURE') }}"
color: "#83F52C"
title: "Ansible Status {{ lookup('pipe','date') }}"
async: 3600
poll: 0
附:但我不明白如果你有一个长期运行的任务(有高async
和retries
数字),单个Slack HTTP调用如何减慢你的剧本......