我们希望听到您的声音!帮助我们洞察 Ansible 生态系统的现状。
参加 2024 年 Ansible 项目调查

事件驱动 Ansible 入门

事件驱动 Ansible 入门

随着一项技术的发展,它扩展了其他技术的可能性,并为我们今天面临的挑战提供了明天的解决方案。 AnsibleFest 2022 为我们带来了 Ansible 自动化的新进展,这些进展既光明又具有创新性。我指的是事件驱动 Ansible 的开发者预览版。

自动化使我们能够为我们的系统和技术提供速度和敏捷性,同时最大限度地减少人为错误。但是,在遇到故障单和问题时,我们通常只能依靠传统的、手动的方法进行故障排除和信息收集。我们本质上放慢了速度,打乱了业务。我们必须收集信息、尝试常见的故障排除步骤、与不同的团队确认,最终,我们需要睡觉。

下图说明了包含许多手动步骤和交接的支持生命周期。

support lifecycle diagram

事件驱动 Ansible 的一个应用是在近乎实时的情况下修复技术问题,或者至少触发故障排除和信息收集,以便在您的支持团队处理其他问题时尝试找到中断的根本原因。

下图说明了事件驱动自动化在支持生命周期中的应用:更少的步骤,更快的平均解决时间 (MTTR)。

Event-Driven Ansible in the support lifecycle

事件驱动 Ansible 有可能改变我们响应问题的方式,并照亮了许多新的自动化可能性。那么,您如何使用事件驱动 Ansible 迈出下一步呢?

让我们开始吧!

事件驱动 Ansible 目前处于开发者预览版,但是没有任何东西阻止我们安装 ansible-rulebook(这是事件驱动 Ansible 的 CLI 组件)并构建我们的第一个规则手册。事件驱动 Ansible 包含一个使用 Drools 构建的决策框架。我们需要一个规则手册来告诉系统哪些事件需要标记以及如何响应这些事件。这些规则手册也是在 YAML 中创建的,并且像传统的 Ansible 剧本一样使用,因此这使得理解和构建我们需要的规则手册变得更容易。剧本和规则手册之间的一个关键区别是规则手册中需要的“如果-这样-那么-那样”编码,以使事件驱动自动化方法起作用。

一个规则手册包含三个主要组件

  • **来源** 定义我们将使用哪个事件来源。这些来源来自源插件,这些插件是为适应常见用例而构建的。随着时间的推移,将提供越来越多的来源。已经有一些可用的源插件,包括:webhook、Kafka、Azure 服务总线、文件更改和 alertmanager。

  • **规则** 定义我们将从事件来源尝试匹配的条件。如果满足条件,那么我们可以触发一个操作。

  • **操作** 触发满足条件后需要发生的事情。当前的一些操作包括:run_playbook、run_module、set_fact、post_event 和 debug。

getting-started-with-event-driven-ansible

现在,让我们安装 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 将触发所需的 action。以下是我们的示例规则手册

---
- 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 很酷”的消息有效负载。满足此条件后,我们将定义的操作将被触发,在本例中,它是触发一个剧本。

需要注意的一点是,ansible-rulebook 与 ansible-playbook 不同,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 将进一步简化此过程。

下一步您可以做什么?

无论您是刚刚开始自动化之旅,还是经验丰富的资深人士,都有各种资源可以增强您的自动化知识