事件驱动 Ansible 入门
事件驱动 Ansible 入门
随着一项技术的进步,它扩展了其他技术的可能性,并为我们今天面临的挑战提供了明天的解决方案。AnsibleFest 2022 为我们带来了 Ansible 自动化的全新进步,这些进步既光彩夺目又极具创新意义。我指的是事件驱动 Ansible 开发者预览。
自动化使我们能够为我们的系统和技术提供速度和敏捷性,同时最大程度地减少人为错误。但是,当涉及到故障单和问题时,我们通常会采用传统的、人工的方法进行故障排除和信息收集。我们本质上是在减慢速度,并打乱我们的业务。我们必须收集信息,尝试我们的常见故障排除步骤,与不同的团队确认,最后,我们需要休息。
下图说明了一个包含许多人工步骤和交接的支撑生命周期
事件驱动 Ansible 的一个应用是在接近实时之前修复技术问题,或者至少触发故障排除和信息收集,以尝试找出停机的根本原因,同时您的支撑团队处理其他问题。
下图说明了事件驱动自动化如何在支撑生命周期中使用:更少的步骤,更快的平均恢复时间。
事件驱动 Ansible 有可能改变我们对问题的响应方式,并照亮许多新的自动化可能性。那么,您如何使用事件驱动 Ansible 迈出下一步呢?
让我们开始吧!
事件驱动 Ansible 目前处于开发者预览版,但是我们没有理由不能安装 ansible-rulebook,它是事件驱动 Ansible 的 CLI 组件,并构建我们的第一个规则手册。事件驱动 Ansible 包含一个使用 Drools 构建的决策框架。我们需要一个规则手册来告诉系统要标记哪些事件以及如何响应这些事件。这些规则手册也是在 YAML 中创建的,并且像传统的 Ansible 剧本一样使用,因此这使得理解和构建我们需要的规则手册变得更容易。剧本和规则手册之间的一个关键区别是在规则手册中为了使事件驱动自动化方法起作用而需要的 If-this-then-that 编码。
规则手册由三个主要部分组成
-
来源定义我们将使用哪个事件源。这些源来自源插件,这些插件已被构建以适应常见的用例。随着时间的推移,将会有越来越多的来源可用。目前已经提供了一些源插件,包括:webhooks、Kafka、Azure 服务总线、文件更改和 alertmanager。
-
规则定义我们将从事件源中尝试匹配的条件。如果条件满足,那么我们可以触发一个操作。
-
操作触发满足条件时需要发生的操作。一些当前的操作包括:run_playbook、run_module、set_fact、post_event 和 debug。
现在,让我们安装 ansible-rulebook 并从我们的第一个事件开始。
要安装 ansible-rulebook,我们可以安装我们的 Galaxy 集合,它包含一个用于安装我们所需的一切的剧本。
ansible-galaxy collection install ansible.eda
安装集合后,您可以运行 install-rulebook-cli.yml 剧本。这将安装您在命令行上使用 ansible-rulebook 入门所需的一切。目前,这在 Mac 和 Fedora 上受支持。
注意:现在,您也可以跳过上面的方法,并使用 pip 安装 ansible-rulebook,然后安装 ansible.eda 集合。如果您使用此方法,则需要 Java 11+,我们建议使用 openjdk。(如果您使用先前安装方法,则无需执行此步骤。)
pip install ansible-rulebook ansible-galaxy collection install ansible.eda
如果您想为 ansible-rulebook 贡献代码,您也可以将以下 GitHub 存储库 分叉。此存储库还包含有关设置开发环境以及如何构建测试容器的说明。
让我们构建一个示例规则手册,该手册将从 webhook 触发一个操作。我们将查找 webhook 中的特定有效负载,如果 webhook 事件中满足该条件,则 ansible-rulebook 将触发所需的行动。以下是我们的示例规则手册
--- - name: Listen for events on a webhook hosts: all ## Define our source for events sources: - ansible.eda.webhook: host: 0.0.0.0 port: 5000 ## Define the conditions we are looking for rules: - name: Say Hello condition: event.payload.message == "Ansible is super cool!" ## Define the action we should take should the condition be met action: run_playbook: name: say-what.yml
如果我们看一下这个示例,我们可以看到规则手册的结构。我们的源、规则和操作已定义。我们正在使用 ansible.eda 集合中的 webhook 源插件,并且我们正在查找来自 webhook 的包含“Ansible is super cool”的消息有效负载。满足此条件后,我们将定义的操作将被触发,在本例中,它是触发一个剧本。
关于 ansible-rulebook 需要注意的一点是,它不像 ansible-playbook 那样运行一个剧本,并且一旦剧本完成,它就会退出。使用 ansible-rulebook,它将继续运行,等待事件并匹配这些事件。它只会在关闭操作时退出,或者如果事件源本身存在问题,例如,如果您正在使用 url-check 插件监控的网站停止工作。
构建好规则手册后,我们只需告诉 ansible-rulebook 将其用作规则集并等待事件
root@ansible-rulebook:/root# ansible-rulebook --rules webhook-example.yml -i inventory.yml --verbose INFO:ansible_events:Starting sources INFO:ansible_events:Starting sources INFO:ansible_events:Starting rules INFO:root:run_ruleset INFO:root:{'all': [{'m': {'payload.message': 'Ansible is super cool!'}}], 'run': <function make_fn.<locals>.fn at 0x7ff962418040>} INFO:root:Waiting for event INFO:root:load source INFO:root:load source filters INFO:root:Calling main in ansible.eda.webhook
现在,ansible-rulebook 准备就绪,它正在等待事件匹配。如果 webhook 被触发,但有效负载与规则手册中的条件不匹配,我们可以在 ansible-rulebook 的详细输出中看到它
… INFO:root:Calling main in ansible.eda.webhook INFO:aiohttp.access:127.0.0.1 [14/Oct/2022:09:49:32 +0000] "POST /endpoint HTTP/1.1" 200 158 "-" "curl/7.61.1" INFO:root:Waiting for event
但是,一旦我们的有效负载与我们正在查找的内容匹配,魔法就会发生,因此我们将模拟具有正确有效负载的 webhook
curl -H 'Content-Type: application/json' -d "{\"message\": \"Ansible is super cool\"}" 127.0.0.1:5000/endpoint INFO:root:Calling main in ansible.eda.webhook INFO:aiohttp.access:127.0.0.1 [14/Oct/2022:09:50:28 +0000] "POST /endpoint HTTP/1.1" 200 158 "-" "curl/7.61.1" INFO:root:calling Say Hello INFO:root:call_action run_playbook INFO:root:substitute_variables [{'name': 'say-what.yml'}] [{'event': {'payload': {'message': 'Ansible is super cool'}, 'meta': {'endpoint': 'endpoint', 'headers': {'Host': '127.0.0.1:5000', 'User-Agent': 'curl/7.61.1', 'Accept': '*/*', 'Content-Type': 'application/json', 'Content-Length': '36'}}}, 'fact': {'payload': {'message': 'Ansible is super cool'}, 'meta': {'endpoint': 'endpoint', 'headers': {'Host': '127.0.0.1:5000', 'User-Agent': 'curl/7.61.1', 'Accept': '*/*', 'Content-Type': 'application/json', 'Content-Length': '36'}}}}] INFO:root:action args: {'name': 'say-what.yml'} INFO:root:running Ansible playbook: say-what.yml INFO:root:Calling Ansible runner PLAY [say thanks] ************************************************************** TASK [debug] ******************************************************************* ok: [localhost] => { "msg": "Thank you, my friend!" } PLAY RECAP ********************************************************************* localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 INFO:root:Waiting for event
从上面的输出中可以看出,条件是从 webhook 中满足的,ansible-rulebook 随后触发了我们的操作,该操作是运行_剧本。我们定义的剧本随后被触发,并且一旦它完成,我们可以看到我们恢复到“等待事件”。
事件驱动 Ansible 为我们环境的更快解决和更强大的自动化观察打开了可能性。它有可能简化许多技术人员和睡眠不足的工程师的生活。目前的 ansible-rulebook 很容易学习和使用,并且图形用户界面 EDA-Server 将进一步简化这一点。
您接下来可以做什么?
无论您是开始您的自动化之旅还是经验丰富的资深人士,都有多种资源可以增强您的自动化知识
- 自定进度实验室练习 - 我们提供交互式的浏览器内练习,帮助您开始使用事件驱动 Ansible 和 ansible-rulebook。
- 事件驱动规则手册 - 在我们的 YouTube 频道上观看事件驱动 Ansible 的另一个示例。
- 事件驱动 Ansible 和 GitOps - 在我们的 YouTube 频道上观看事件驱动 Ansible 的另一个示例,但这次是与 GitOps 结合使用。