“任何时间”都是执行自动化工作流程的好时间吗?答案可能是否定的,原因有很多。
如果你想避免同时进行更改,以最大限度地减少对关键业务流程的影响并降低意外服务中断的风险,那么在你的自动化运行时,不应有其他人尝试进行更改。
在某些情况下,可能正在进行计划的维护窗口。或者可能即将发生重大事件、关键业务时期或节假日——或者你可能更喜欢不在星期五晚上进行更改。

无论出于何种原因,你都希望将此信息传递给你的自动化平台,并防止在特定时间段内执行定期或临时任务。用变更管理术语来说,我指的是指定停机窗口,即不应发生变更活动的时间。
Ansible 中的日历集成
如何在 Ansible 中实现这一点? 虽然它本身没有日历功能,但 Ansible 的可扩展性使其能够与任何具有 API 的日历应用程序集成。
目标是:在执行任何自动化或变更活动之前,你执行一个 pre-task
,检查日历中是否已安排了某些内容(现在或很快),并确认你没有处于阻止的时段内。
假设你有一个名为 calendar
的虚构模块,它可以连接到远程日历(如 Google 日历),以确定你指定的时间是否已被标记为忙碌。你可以编写如下的 playbook
- name: Check if timeslot is taken
calendar:
time: "{{ ansible_date_time.iso8601 }}"
register: output
Ansible facts 将提供 ansible_date_time
,它被传递给 calendar
模块以验证时间可用性,以便它可以注册响应 (output
) 以在后续任务中使用。
如果你的日历看起来像这样

(Nicolas Leiva, CC BY-SA 4.0)
那么此任务的输出将突出显示此时段已被占用 (busy: true
) 这一事实
ok: [localhost] => {
"output": {
"busy": true,
"changed": false,
"failed": false,
"msg": "The timeslot 2020-09-02T17:53:43Z is busy: true"
}
}
阻止任务运行
接下来,Ansible 条件语句 将帮助阻止执行任何进一步的任务。 作为一个简单的例子,你可以在下一个任务中使用 when
语句来强制它仅在先前输出中的字段 busy
不为 true
时运行
tasks:
- shell: echo "Run this only when not busy!"
when: not output.busy
结论
在之前的一篇文章中,我说过 Ansible 是一个将事物连接在一起的框架,它将不同的构建块相互连接,以编排端到端的自动化工作流程。
本文探讨了 playbook 如何集成或与日历应用程序对话以检查可用性。 但是,我只是触及了表面! 例如,你的任务也可以阻止日历中的时段……天空才是极限。
在我的下一篇文章中,我将深入探讨 calendar
模块是如何构建的,以及其他编程语言如何与 Ansible 一起使用。 如果你像我一样是 Go 语言的粉丝,请继续关注!
本文最初以 Ansible 和 Google 日历集成的变更管理 为题发表在 Medium 上,根据 CC BY-SA 4.0 许可获得许可并经许可转载。
评论已关闭。